java list 占用内存不释放_性能不打折,内存占用减少90%,Facebook提出极致模型压缩方法Quant-Noise...

7cd6c7c88c27ab7c8e9e9857410f94a7.png
对于动辄上百 M 大小的神经网络来说,模型压缩能够减少它们的内存占用、通信带宽和计算复杂度等,以便更好地进行应用部署。最近,来自 Facebook AI 的研究者提出了一种新的模型量化压缩技术 Quant-Noise,让神经网络在不降低性能的前提下,内存占用减少 90% 以上。

1cc4b9c3836615e209b188c26bf3234a.png

我们都知道,对于神经网络来说,参数量越大、层数越多,就代表着输出的结果越精细。当然,这也意味着许多性能优越的神经网络体积会非常庞大。比如当前的标准机器翻译架构 Transformer,一层就可能包含数百万个参数。即使是一些优化过性能和参数效率的模型(比如 EfficientNet),也仍然需要几十到几百 MB。这就使得它们的应用范围限制在机器人或者虚拟助手等领域。

所以我们在应用部署之前,必须面对一个问题:如何对模型进行压缩?

剪枝和蒸馏是模型压缩中常用的两种方法,通过减少网络权重的数量来删减参数。还有一种方法就是「量化」,不同的是,它是通过减少每个权重的比特数来压缩原始网络。

标量量化(scalar quantization)等流行的后处理量化方法是让训练网络的浮点权重以一个低精度表征去表示,比如说定宽整数。这些后处理量化方法的好处在于压缩效率很高,并且能够加速支持硬件上的推理。但缺点在于,这些近似值造成的误差会在前向传播的计算过程中不断累积,最终导致性能显著下降。

现在,来自Facebook 的研究者提出了一种新的模型量化压缩技术 Quant-Noise,可对模型进行极致压缩,同时在实际应用部署时保持高性能

  • 论文地址:https://arxiv.org/abs/2004.07320
  • 项目地址:https://github.com/pytorch/fairseq/tree/master/examples/quant_noise

在这项研究中,研究者提出了一种仅量化权重子集而非整个网络的压缩方案。在每次前向传播时仅量化网络的随机部分,对大多数权重使用无偏梯度进行更新。

该方法可以在训练过程中采用更简单的量化方案,这对于具有可训练参数的量化模块来说是非常有用的,比如乘积量化(Product Quantizer,PQ)算法。

b53197d8ae6cfe31e3fe7235e5e3d61c.png

总体来说,该方法的亮点在于:

  1. 将名为「Quant-Noise」的量化噪声应用到权重的随机子集上,来学习更适用于 int4、 int8 和 PQ 算法等各种量化方法的网络;
  2. 在 PQ 算法上添加 Quant-Noise,实现准确率和模型大小综合结果上的 SOTA 水平。使用该方法进行压缩后,在自然语言处理方面,RoBERTa 在压缩到 14MB 的前提下,在 MNLI 上实现了 82.5% 的准确率;在计算机视觉方面,EfficientNet-B3 在压缩到 3.3 MB 的前提下,在 ImageNet 上实现了 80.0% 的 top-1 准确率。
  3. 使用 Quant-Noise 训练的网络,通过结合 PQ 算法和 int8 来量化网络的权重和 activation,获得在固定精度计算条件下的极致压缩效果,实现了 ImageNet 数据集上的 79.8% top-1 准确率和 WikiText-103 数据集上的 21.1 困惑度。

此外,使用 Quant-Noise 压缩后的模型性能几乎与原始模型一致,同时将内存占用量减少至原来的十分之一甚至二十分之一。这大大超过了 PyTorch 和 Tensorflow 中所用的 int8 的 4 倍压缩。目前,相关代码也已经开源。

原理:量化神经网络

在本章中,研究者介绍了量化原理以及几种标准量化方法,并详细解释了如何将标量和乘积量化相结合。需要注意的是,为了定义清楚,研究者主要专注于固定实矩阵(fixed real matrix)W∈R ^ n×p 的示例,并假设此矩阵被拆分为 m×q 个块(b_kl):

c5e9972f3546436a214b969f8778e361.png

这些块的属性由量化方法来确定,而码本(codebook)是包含 K 个向量的集合,即 C = {c [1], ..., c [K]}。此量化方法使用如下方法压缩矩阵 W:向每个块 b_kl 分配一个指向码本 C 中「码字 c」的索引,同时存储码本 C 以及结果索引(作为索引矩阵 I 的条目 I_kl), 而不是使用实际权重。在推理过程中,该方法重建原始矩阵 W 的近似值

9c06dc29fba76636a1a27e5243a7b792.png

,使得 b_kl = c [I_kl]。研究者将标量量化(如 int8,即每个块 b_kl 由一个权重组成)与向量量化(将多个权重共同量化)区分开来。

c975d537b67beb5421d0145cee9f4018.png

上图显示了研究者在训练过程中如何将量化噪声应用于权重子集,从而改善量化模型的性能(完整视频请参照链接)。

定点标量量化

定点(Fixed-point)标量量化方法用低精度定点表示代替了浮点表示。通过在能够兼容的硬件上使用定点运算,实现减少模型内存占用并加快推理速度的效果。

Quant-Noise 的具体实现方法

深度网络训练过程中不会接触到 quantization drift 引起的噪声,从而导致性能欠佳。如何使网络对量化具有一定的鲁棒性?解决方案就是在训练期间引入量化噪声

量化感知训练(Quantization Aware Training,QAT)通过对前向传播过程中的权重进行量化来实现这一点。这种转换是不可微的,且使用直通估计器(straight through estimator,STE)来逼近梯度。STE 在梯度中引入了一个偏置,该偏置取决于权重的量化级别,因此也取决于压缩率。

因此,研究者提出了一种简单的修改方法 Quant-Noise,通过随机改善 QAT 来控制该偏置。其思路是:量化权重中的随机部分,而不是像 QAT 那样量化整个网络,使未经量化的权重使用无偏梯度。该方法的一般形式可以模拟训练期间的量化和剪枝效果。

使用 Quant-Noise 训练网络

仍以实矩阵 W 为例。在训练时,Quant-Noise 方法的运行方式如下:

首先,计算与目标量化方法相关的块 b_kl;然后在每个前向传播过程中,随机选择这些块的子集,并添加一些失真;在反向传播过程中,使用 STE 逼近失真的权重,进而计算所有权重的梯度值。换句话说,给定索引元组 J ⊂ {(k, l)},其中 1≤k≤m,1≤l≤q,同时将失真或噪声函数 ϕ 作用在块上,于是研究者定义算子 ψ (· | J),对于每个块 b_kl 均应用以下转换:

7383fb0b2185c8761b3951882f72a84b.png

Quant-Noise 的效果怎么样?

Quant-Noise 对不同量化方法的影响

如下表 1 所示,研究者首先展示了在语言建模和图像分类任务上,Quant-Noise 对 int4、int8 和 iPQ 三种不同量化方案的影响。结果表明,Quant-Noise 对 iPQ 等高性能量化方案表现出非常好的效果,而 QAT 一般导致性能下降,即使与量化作为后处理步骤的情况相比也会这样。

fda6517536bced691a14f47dc443c5e0.png

表 1:在 QAT 和 Quant-Noise 两种设置下,int4、int8 和 iPQ 三种量化方案在语言建模和图像分类任务上的量化结果对比。对于语言建模任务,研究者在 Wikitext-103 基准上训练 Transformer,得出了测试困惑度(PPL);对于图像分类任务,研究者在 ImageNet-1k 基准上训练了 EfficientNet-B3,得出了验证 Top-1 准确率。

研究者分析得出,Quant-Noise 能够与剪枝(pruning)和权重共享(weight sharing)方法兼容并相互补充。如下表 2 所示,研究者分别展示了 WikiText-103 上语言建模、MNLI 上预训练句子表征和 ImageNet-1k 上目标分类的结果,这些结果在不同的任务和基准上保持了高度一致:Quant-Noise 在强大的 iPQ 基线方法上实现了性能的大幅提升。

66260fb974f5fcb3e953c5b1b353c1ef.png

表 2:几种不同的压缩方法(权重共享、剪枝和 Quant-Noise)在语言建模、句子表征和图像分类任务上对未量化模型和量化模型性能的影响。

与 SOTA 方法的对比

研究者在相同任务上将 Quant-Noise 与当前 SOTA 方法进行对比。他们在有竞争力的模型上应用了最佳量化设置,在结合权重共享和剪枝方法时将这些模型的内存占用缩小到原来的 1/94-1/20,从而为高性能模型提供了极致压缩。

如下图 2 所示,研究者得出了在语言建模、MNLI 和 ImageNet 上性能与模型大小的权衡情况。

91df6079b0c1c6b58ef312a52923e334.png

图 2:模型性能随模型大小的变化情况。

控制变量测试

如下表 3 所示,研究者分别展示了在未利用 Quant-Noise 训练、利用 Quant-Noise 微调以及利用 Quant-Noise 训练三种不同的设置下,Adaptive Input 架构的困惑度和 RoBERTa 的准确率变化情况。可以看出,直接利用 Quant-Noise 训练可以实现最低的困惑度和最高的准确率。

a8d4d61a0cd7612853ff474129c2d16c.png

表 3:未利用 Quant-Noise 训练、利用 Quant-Noise 微调和利用 Quant-Noise 训练三种不同设置下的困惑度和准确率对比。

如下图 3 所示,不同 Quant-Noise 值对语言建模模型 Transformer 性能的影响。对于 iPQ,高噪声值对模型性能带来较大影响;而对于 int8 量化及其噪声函数而言,较高的噪声值对模型性能造成轻微的负面影响,但不如前者那么严重。

c2b01a74d12ced445c9d1ea258d9acca.png

图 3:量化参数的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

苹果系统安装python环境_如何在mac下配置python虚拟环境

安装python虚拟环境核心目的就是为了复制一个python环境,这样新项目下载的所有包,都会存放在虚拟环境下的python site-package 中 首先安装 1. sudo pip install virtualenv # 安装虚拟环境 2. sudo pip install virtualenvwrapper # 安装虚拟环境扩展包 3. vim .bash_profile …

linux程序无法获取cpu资源,Linux系统编程获取系统的CPU资源

还是纯干货&#xff0c;代码拿来&#xff1a;#include #include #include #include #include #include #include void work(){FILE *f;int i;double x 4.5;f tmpfile();for(i 0; i < 10000;i){fprintf(f,"Do some output\n");if (ferror(f)){fprintf(stderr,&q…

dbnetlib sqlserver不存在或拒绝访问_404:对不起,您访问的网页不存在

404&#xff1a;对不起您访问的网页不存在https://www.zhihu.com/video/1101123296195723264你可能在上网时也好奇过&#xff0c;为什么点开一个无法显示信息的页面&#xff0c;上面会出现数字404&#xff1f;要解释这个问题&#xff0c;我们需要从互联网诞生之初说起。20世纪8…

linux中控和安卓中控哪个比较好,原厂中控和改装中控有什么区别?哪个更好?...

很多人都喜欢车辆上有一个大屏的中控。那种大屏的中控不仅功能很多&#xff0c;而且还很实用。但是有很多车需要高配才能有中控。而且还需要加钱。很多人在买车的时候都会选择一些低配的车&#xff0c;然后自己去安装中控。有些人认为原厂的中控不仅价格贵&#xff0c;而且还有…

bufferedreader读取中文乱码_python之pandas模块关于csv文件乱码问题解决

介绍相信部分小伙伴们在处理windows系统生成的csv文件时会遇到中文显示乱码的问题&#xff0c;尤其是使用Excel打开这类文件时这类问题尤为突出。解决如图&#xff0c;我们通过Excel工具打开该csv文件时&#xff0c;中文展示为乱码。此时&#xff0c;只需要我们通过功能强大的数…

linux mint python3.6,Linux 上如何安装并切换最新版本的 Python 3.6

原标题&#xff1a;Linux 上如何安装并切换最新版本的 Python 3.6如果你安装了 Linux 系统&#xff0c;正在学习 Python 并想要使用最新的版本的话&#xff0c;那么这篇文章就是为你而写的。-- ShekinPython是 Linux 中一种最流行的编程语言。它被写成了各种工具和库。除此之外…

centos 卸载软件_Linux服务器运维必备技能 软件包和启动项超详细整理

一、RedHat/CentOS包管理1. 包管理工具RPM(1) 简介最早用在 RedHat的包管理器&#xff0c;现在已经成为Linux常见的包管理系统。RPM包有两种类型&#xff1a;二进制RPM包源码RPM包可以在www.rpmfind.net网站查询软件包&#xff0c;也可以查到其依赖项&#xff1a;(2) RPM包命名…

linux内存分配器类型,内核早期内存分配器:memblock

原标题&#xff1a;内核早期内存分配器&#xff1a;memblock本文转载自Linux爱好者本文来自 程雪涛的自荐投稿Linux内核使用伙伴系统管理内存&#xff0c;那么在伙伴系统工作前&#xff0c;如何管理内存&#xff1f;答案是memblock。memblock在系统启动阶段进行简单的内存管理&…

java substring截取字符串_java基础教程之字符串的介绍,比较重要的一个知识点【下】...

字符串操作1、获取子字符串通过String类的substring()方法可对字符串进行截取。这些方法的共同点就是都是利用字符串的下标进行截取。应明确字符串下标是从0开始的。substring()方法被两种不同的方法重载&#xff0c;来满足不同的需要。(1)substring(intbeginIndex)该方法返回的…

在linux环境下安装wiringpi库,wiringPi库的pwm配置及使用说明

本文介绍树莓派(raspberry pi)在linux c 环境下的硬件pwm配置及使用方法。1. 下载安装wiringPi此步骤建议参考官网指南&#xff0c;wiringPi提供了对树莓派的硬件IO访问&#xff0c;包括GPIO/I2C/PWM等&#xff0c;下载安装后本地会出现wiringPi文件夹&#xff0c;根目录下有/e…

excel split函数_Excel 字符串拆分

用 Excel 处理数据时&#xff0c;有时需要对字符串进行拆分。对于比较简单的拆分&#xff0c;使用 Excel 函数可以顺利完成&#xff0c;但碰到一些特殊需求&#xff0c;或者拆分的规则比较复杂时&#xff0c;则很难用 Excel 实现了。这里列出一些拆分需求示例&#xff0c;分析拆…

python优雅编程_Python优雅地可视化数据

[导读]声明&#xff1a;由于本文的代码大部分是参考书中的例子&#xff0c;所以不提供完整代码&#xff0c;只提供示例片段&#xff0c;也就是只能看出某一部分用法&#xff0c;感兴趣的需要在自己的数据上学习测试。 声明&#xff1a;由于本文的代码大部分是参考书中的例子&am…

sparkstreaming 读取mysql_第十篇|SparkStreaming手动维护Kafka Offset的几种方式

Spark Streaming No Receivers 方式的createDirectStream 方法不使用接收器&#xff0c;而是创建输入流直接从Kafka 集群节点拉取消息。输入流保证每个消息从Kafka 集群拉取以后只完全转换一次&#xff0c;保证语义一致性。但是当作业发生故障或重启时&#xff0c;要保障从当前…

anaconda 安装pytorch_conda上安装PyTorch

conda上安装PyTorch这里的安装系统&#xff1a;Windows系统第一步&#xff0c;打开Anaconda Prompt第二步&#xff0c;为pytorch创建一个环境&#xff1a;conda create -n pytorch python3.8&#xff08;这里的pytorch是环境的名称&#xff0c;python3.8表示安装的是3.8版本的p…

curd什么意思中文_查英英字典:What a shame是什么意思?

查英英字典&#xff1a;What a shame是什么意思&#xff1f;“互联网”时代学习英语有两种“学习方法”&#xff1a;简单粗暴学法和自己动手丰衣足食法。一、简单粗暴法&#xff1a;直接问老师要“中文答案”在过去非互联网时代&#xff0c;“老师”往往是提供“答案”的唯一渠…

c++读出像素矩阵_Python传numpy矩阵调c++(求3D图像连通区域)

Python有很多种调c的方法&#xff0c;有的复杂有的简单&#xff0c;有时使用的时候反而不知道到底该用哪一种比较好&#xff0c;其实没有最好的方法&#xff0c;只有适合不适合自己。本文从我所遇到的问题说起&#xff0c;然后讲述另一种比较简单的python调c并且传参numpy矩阵的…

android四大组件的作用简书,Android四大组件是什么

Android四大组件是&#xff1a;活动、服务、广播接收器、内容提供商。它们的英文名称是ACTIVITY、SERVICE、BroadcastReceiver、Content Provider。四个组件分别起到不同的作用&#xff0c;相互配合才能确保安卓系统的正常运行&#xff0c;因此是缺一不可的。Android四大组件及…

python 获取文件大小_第41p,超级重要,Python中的os库

大家好&#xff0c;我是杨数Tos&#xff0c;这是《从零基础到大神》系列课程的第41篇文章&#xff0c;第二阶段的课程&#xff1a;Python基础知识&#xff1a;Python内置库之os库的使用。学习本课程&#xff0c;建议先看一遍&#xff1a;【计算机基础知识】课程。os模块是与操作…

惠普打印机节能环保认证证书_低成本高效办公 苏宁惠普超品日这几款打印机了解下!...

【PConline 导购】说到打印机&#xff0c;很多朋友会想到公司那台不停运转的打印机。其实&#xff0c;伴随着近几年来打印机技术的成熟&#xff0c;其打印成本也一降再降&#xff0c;这就让有打印的需求的中下型企业&#xff0c;甚至个人&#xff0c;都会去选购一款合适的打印产…

vm客户机隔离不能选_开汽车美容店,这些位置绝对不能选,会让你门可罗雀,生意惨淡...

之前的文章里&#xff0c;讲了一些开汽车美容店选址的要领&#xff0c;今天&#xff0c;来聊聊一些更加细致的选址要素&#xff0c;让你避免错误选址而导致生意不佳。门面宽度小于2.5米的不要选一辆普通汽车的宽度在1.8米-2米之间&#xff0c;加上两侧后视镜各20公分左右&#…