几篇好的复习文章
汇总https://www.zhihu.com/column/c_1287038616917315584
https://www.zhihu.com/column/gemfield
https://www.zhihu.com/column/c_1258047709686231040
https://bbs.cvmart.net/topics/3938
后训练量化权重基础知识:https://zhuanlan.zhihu.com/p/38328685
https://jermmy.github.io/2020/07/04/2020-7-4-network-quantization-2/
https://blog.csdn.net/WZZ18191171661/article/details/103332338
https://blog.csdn.net/xz1308579340/article/details/108986176
https://mp.weixin.qq.com/s?src=11×tamp=1617291204&ver=2982&signature=ubKT3qgOGyZ15xPNSezMJvmEpvpqsEP96FpZhhGyG6cktK8UyglWwkxZcRON-55YbShiRvnceyMc0UyhqIXwvvTH488rmeTqoQpaWV-nrFrit5nZ3HYEdYBQFne1-&new=1
https://mp.weixin.qq.com/s?src=11×tamp=1617291281&ver=2982&signature=np1ICwnnbfxlFP2Fr8z2BbTTIOewseKeziPSgWhYH7KhwOyNzNyrTP6XImzub8TWvwGopomMW7UWAQzK0cfPTUOBmCymDqVf-aAGZ8nEnEMpq0Vc83F8m4DDz7Ih8Ek&new=1
https://mp.weixin.qq.com/s?src=11×tamp=1617291281&ver=2982&signature=QhaGCr4xVvvevtsQ8g6oRfOBHGRW74eVpTAljlIpxhFdtoChaFJFexE2WwHlmn6RitM6h9LgEZmAEshBeimlh7FmX08z3jiyKCx9pcCdQwzvLkWXwN6FBCRqmCy0By&new=1
后训练int8量化细节(校准)
https://zhuanlan.zhihu.com/p/58208691
https://zhuanlan.zhihu.com/p/58182172
后训练权重和激活函数知识:
https://ictjournal.itri.org.tw/content/Messagess/contents.aspx?MmmID=654304432061644411&MSID=1073702170343562557
https://mp.weixin.qq.com/s?src=11×tamp=1617291226&ver=2982&signature=AQWhyQ4j09Lcs-iP6lDrugacvFvRpzj2u8JrPZg5jIkkz96w-LbUt2rSjZ7eSnPglPpeuVuIqYIrGqqhrFAwYN4VpBM32eP7BiZ71G9flHySs-yw8G6c7VMT90184B9A&new=1
量化分析:
https://blog.csdn.net/qq_20880415/article/details/103840442
https://mp.weixin.qq.com/s?src=11×tamp=1617291204&ver=2982&signature=ubKT3qgOGyZ15xPNSezMJvmEpvpqsEP96FpZhhGyG6cktK8UyglWwkxZcRON-55YbShiRvnceyMc0UyhqIXwvvTH488rmeT*qoQpaWV-nrFrit5nZ3HYEdYBQFne1-&new=1
量化白皮书
https://mp.weixin.qq.com/s?src=11×tamp=1617291281&ver=2982&signature=rWeRFjDvf1sxv8bIRxumTRoF8C9qtY4HOJqs9N6LozV9RT5HfxArRR46eviSxfbDOuZjrjNggY2j-8YekIt5mOvy6T10wRQGPICuI3uXFsRZNzAbTYWYE8dtB0Q0hI&new=1
各类量化策略介绍
- https://zhuanlan.zhihu.com/p/140893305
- https://www.jianshu.com/p/b57b87b2f97a
- https://chenrudan.github.io/blog/2018/10/02/networkquantization.html
- https://www.jiqizhixin.com/articles/2018-06-01-11
- https://zhuanlan.zhihu.com/p/132561405#:~:text=%E7%94%9F%E4%BA%A7%E4%B8%80%E4%B8%AA%E9%87%8F%E5%8C%96%E6%A8%A1%E5%9E%8B%E7%9A%84,%E4%BD%86%E4%BD%BF%E7%94%A8%E4%B8%8A%E9%9D%9E%E5%B8%B8%E7%AE%80%E5%8D%95%E3%80%82
- https://flashgene.com/archives/85093.html
- https://mp.weixin.qq.com/s?src=11×tamp=1617291204&ver=2982&signature=AQWhyQ4j09Lcs-iP6lDrugacvFvRpzj2u8JrPZg5jIkUPHmFyEHhSp0e7ly7lKi519pSOlQTZnSR63E2FjgGW80SNY8zsPUD-UaRmVolGHABOO9FASdqaq0s2-g*u0dS&new=1
-
https://mp.weixin.qq.com/s?src=11×tamp=1617291204&ver=2982&signature=yorh8jgIzHNJl14EN-pZu2d2EM01xMpFAZuRsXDOgbojDeGaaUD3LRUTXI7zNFpcrR3VBivMBQmTGf7F3PRGtLdXk7I0ZMOrI3ldLg0wO3smqnh2Vu6WUm7wAob7oTMB&new=1
9.https://mp.weixin.qq.com/s?src=11×tamp=1617291281&ver=2982&signature=RvjUdTfW-7eh1ZPlMAJOkt6cVQY6TP5QHJU*p4NRrxtvzNeuU63SirOZjiqWksX-oQAmxElFcamnUo3JRzP2YUrkHmPQwE7O765l0x8lxNmK19aIwg7Os0fNSpcesCHa&new=1
其他量化方法
神经网络低比特量化——DSQ
神经网络低比特量化——TQT
神经网络低比特量化——LSQ
AdaQuant:改进训练后神经网络量化:分层校准和整数编程
HAWQ:基于 Hessian 的混合精度神经网络量化
一、量化简介
(一)为什么需要量化
Resnet-152神经网络的提出证明了越宽越深越大的模型往往比越窄越浅越小的模型精度要高,但是越宽越深越大的模型对计算资源要求更高,而现在模型应用越来越倾向于从云端部署到边缘侧,受限于边缘侧设备的计算资源,我们不得不考虑设备存储空间(storage)、设备内存大小(memory)、设备运行功耗(power)及时延性(latency)等等问题,特别是在移动终端和嵌入式设备等资源受限的边缘侧应用场景中更加需要我们进行优化。因此,为了解决此类问题模型量化应运而生,本篇我们将探讨模型量化的概念原理、优缺点及tensorflow模型量化的实现方法。
随着模型预测(predication)越来越准确,网络越来越深,神经网络消耗的内存大小成为问题(图二),尤其是在移动设备上。通常情况下,目前(2019年初)的手机一般配备 4GB 内存来支持多个应用程序的同时运行。而三个模型运行一次通常就要占用1GB内存。
模型大小不仅是内存容量问题,也是内存带宽问题。模型在每次预测时都会使用模型的权重(weights),图像相关的应用程序通常需要实时处理数据,这意味着至少 30 FPS(Frame per Second,每秒帧数)。因此,如果部署相对较小的 ResNet-50 网络来分类,运行网络模型就需要 3GB/s 的内存带宽。网络运行时,内存,CPU 和电池会都在飞速消耗,我们无法为了让设备变得智能一点点就负担如此昂贵的代价。
(二)什么是量化
模型量化的定义没有统一的说法,下面有几种理解
1. 量化定义一
模型量化即以较低的推理精度损失将连续取值(或者大量可能的离散取值)的浮点型模型权重或流经模型的张量数据定点近似(通常为int8)为有限多个(或较少的)离散值的过程,它是以更少位数的数据类型用于近似表示32位有限范围浮点型数据的过程,而模型的输入输出依然是浮点型,从而达到减少模型尺寸大小、减少模型内存消耗及加快模型推理速度等目标
2.量化定义二
模型量化是由模型、量化两个词组成。我们要准确理解模型量化,要看这两个词分别是什么意思。
在计算机视觉、深度学习的语境下,模型特指卷积神经网络,用于提取图像/视频视觉特征。
量化是指将信号的连续取值近似为有限多个离散值的过程。可理解成一种信息压缩的方法。在计算机系统上考虑这个概念,一般用“低比特”来表示。也有人称量化为“定点化”,但是严格来讲所表示的范围是缩小的。定点化特指scale为2的幂次的线性量化,是一种更加实用的量化方法。
3.量化定义三
模型量化是将浮点数替换成整数,并进行存储和计算的方法。举例来讲,模型量化可通过将32比特浮点数转换成8比特整数,大大减少模型存储空间(最高可达4倍);同时将浮点数运算替换成整数运算,能够加快模型的推理速度并降低计算内存。
4.量化定义四
量化就是将神经网络的浮点算法转换为定点
量化有若干相似的术语。低精度(Low precision)可能是最通用的概念。常规精度一般使用 FP32(32位浮点,单精度)存储模型权重;低精度则表示 FP16(半精度浮点),INT8(8位的定点整数)等等数值格式。不过目前低精度往往指代 INT8。
混合精度(Mixed precision)在模型中使用 FP32 和 FP16 。FP16 减少了一半的内存大小,但有些参数或操作符必须采用 FP32 格式才能保持准确度。如果您对该主题感兴趣,请查看Mixed-Precision Training of Deep Neural Networks 。
量化一般指 INT8 。不过,根据存储一个权重元素所需的位数,还可以包括:
二进制神经网络:在运行时具有二进制权重和激活的神经网络,以及在训练时计算参数的梯度。
三元权重网络:权重约束为+1,0和-1的神经网络。
XNOR网络:过滤器和卷积层的输入是二进制的。XNOR 网络主要使用二进制运算来近似卷积。
5. 量化定义五
量化是将数值 x 映射到 y 的过程,其中 x 的定义域是一个大集合(通常是连续的),而 y 的定义域是一个小集合(通常是可数的)。8-bit 低精度推理,是将一个原本 FP32 的浮点张量转化成一个 int8/uint8 张量来处理。先看一下浮点数和 8-bit 整数的完整表示范围。
模型量化会带来如下两方面的好处:
减少内存带宽和存储空间
深度学习模型主要是记录每个 layer(比如卷积层/全连接层) 的 weights 和 bias, FP32 模型中,每个 weight /bias 数值原本需要 32-bit 的存储空间,量化之后只需要 8-bit 即可。因此,模型的大小将直接降为将近 1/4。
不仅模型大小明显降低, activation 采用 8-bit 之后也将明显减少对内存的使用,这也意味着低精度推理过程将明显减少内存的访问带宽需求,提高高速缓存命中率,尤其对于像 batch-norm, relu,elmentwise-sum 这种element-wise 算子来说,效果更为明显。
提高系统吞吐量(throughput),降低系统延时(latency)
直观理解,试想对于一个 专用寄存器宽度为 512 位的 SIMD 指令,当数据类型为 FP32 而言一条指令能一次处理 16 个数值,但是当我们采用 8-bit 表示数据时,一条指令一次可以处理 64 个数值。因此,在这种情况下,可以让芯片的理论计算峰值增加 4 倍。
6.量化定义6
量化本质上只是对数值范围的重新调整。一般并非单射,比如说把float32改成int8,那肯定都是类似于四舍五入,会损失精度。同理存在相反的反量化,反量化会使精度变高。例如:0-1 变成0-255是量化(从float到int),0-255到0-1是反量化(从int到float)。
7.量化定义7
二、常见量化方法
(一)、量化方法分类
- 量化映射方法,也就是将float-32映射到Int数据类型,每个间隔是相等的还是不相等的
这里就是均匀量化(uniform quantization)和非均匀量化(non-uniform quantization),也可以叫作线性量化和非线性量化 - 关于映射到整数是数值范围是有正负数,还是都是正数,这里就是对称量化(有正负数)和非对称量化(全是正数),非对称量化就有zero-point,zero-point的主要作用是用于做padding。
- 原精度即浮float-32,量化到什么样的数据类型,这里就有float和int;到底要选择量化后的是多少个bit,这里就有1-bit(二值网络)、2-bit(三值网络)、3-bit、4-bit、5-bit、6-bit、7-bit、8-bit,这几种量化后的数值类型是整型。
- 是固定所有网络都是相同的bit-width,还是不同的,这里就有混合精度量化(Mixed precision)
- 是从一个已经训练好的模型再进行量化,还是有fine tune的过程或者直接是从头开始训练一个量化的模型,这里就有Post-training quantization(后量化,即将已经训练完的模型参数进行量化)、quantization-aware training(量化感知训练,即在从头开始训练中加入量化)和quantization-aware fine tune(在fine tune训练中加入量化)。
(二)、线性量化 / 均匀量化(量化映射的每个间隔是相等的)
**其中,
- r是待量化的实数;
- [a, b]是量化的范围
- s称为scaling factor,表示浮点区间到量化整数区间的映射系数,指定了量化的步长。
- z称为zero point,表示原值域中的0值对应量化后的取值。
-
qmin和qmax分别为可量化区间的下界与上界
1、非对称量化(全是正数)
如下图所示,非对称算法的基本思想是通过 收缩因子(scale) 和 零点(zero point) 将 FP32 张量 的 min/max 映射分别映射到 8-bit 数据的 min/max。
如果我们用 x_f 表示 原始浮点数张量, 用 x_q 表示量化张量, 用 q_x 表示 scale,用 zp_x 表示 zero_point, n 表示量化数值的 bit数,这里 n=8, 那么非对称算法的量化公式如下:
上述公式中引入了 zero_point 的概念。它通常是一个整数,即 zp_x= rounding(q_x * min_x_f)。
当x_f 为 0 时,在量化之后,刚好对应这个整数 zero_point 。这也意味着 zero_point 可以无误差地量化浮点数中的数据 0,从而减少补零操作(比如卷积中的padding zero)在量化中产生额外的误差。
但是,从上述公式我们可以发现 x_q 的结果只能是一个非负数,这也意味着其无法合理地处理有符号的 int8 量化,Pytorch 的处理措施是将零点向左移动 -128,并限制其在 [-128,127] 之间。
一般认为,若zero point不为0,称为非对称(Asymmetric)量化。非对称量化不要求原值域和量化后值域关于0对称。
2、对称量化(有正负数)
若zero point为0,则称为对称(Asymmetric)量化。对称量化,一般会将整型值域最小值去掉,如8位有符号整型表示范围[-128, 127],截取后变成[-127, 127],否则会产生偏差。
对称算法的基本思路是通过一个收缩因子(scale)将 FP32 tensor 中的最大绝对值映射到 8 bit数据的最大值,将最大绝对值的负值映射到 8-bit 数据的最小值。以 int8 为例,max(|x_f|)被映射到 127,-max(|x_f|)被映射到-128。如下图所示:
FP32 Tensor (T) = scale_factor(sf) * 8-bit Tensor(t) + FP32_bias (b)
3、均匀量化与非均匀量化
根据量化后quantizer point间表示的step size是否一样,可分为均匀(Uniform)量化与非均匀(Non-uniform)量化。
直观上,非均匀量化能获得更好的量化效果,例如对轻量级模型使用均匀量化,因为不同通道间权值方差较大,导致量化时原值域集中在部分比特位上,而非均匀量化能较好的解决这个问题,但非均匀量化的实现方式对边缘设备不是很友好,会影响最终的加速效果。
4、例子
由浮点到定点的量化公式如下:
由定点到浮点反量化公式如下:
量化公式如下:
- R表示真实的浮点值,
- Q表示量化后的定点值,
- Z表示0浮点值对应的量化定点值,
- S则为定点量化后可表示的最小刻度
- Rmax表示最大的浮点值
- Rmin表示最小的浮点值
- Qmax表示最大的定点值
- Qmin表示最小的定点值
这里的S和Z均是量化参数,而Q和R均可由公式进行求值,不管是量化后的Q还是反推求得的浮点值R,如果它们超出各自可表示的最大范围,那么均需要进行截断处理。而浮点值0在神经网络里有着举足轻重的意义,比如padding就是用的0,因而必须有精确的整型值来对应浮点值0。
模型训练后权重或激活值往往在一个有限的范围内分布,如激活值范围为[-2.0, 6.0],然后我们用int8进行模型量化,则定点量化值范围为[-128, 127],那么S和Z的求值过程如下:
那么存在如下的对应关系:
如果此时我们有一个真实的激活值为0.28即R=0.28,那么对应Q的求值过程如下:
通常来说,模型量化用的最多的是int8定点量化。
(三)、对称算法 vs 非对称算法
非对称算法一般能够较好地处理数据分布不均匀的情况,为了验证这个问题,用 python 做了一个小实验。FP32 原始数据均匀分布在 [-20, 1000],这也意味着数据分布明显倾向于正数一方。下图展示了实验结果。
从图中可以看出,对于这种FP32 数据分布不均匀的情况下,对称算法的量化数据分布与原始数据分布相差很大。由对称算法(symmetric)产生的 量化数据绝大部分都位于[0,127] 这个表示范围内,而 0 的左侧有相当于一部分范围内没有任何的数据。int8 本来在数据的表示范围上就明显少于 FP32,现在又有一部分表示范围没发挥左右,这将进一步减弱量化数据的表示能力,影响量化模型的精度。与之相反,非对称算法(asymmetric)则能较好地解决 FP32 数据分布不明显倾向于一侧的问题,量化数据的分布与原始数据分布情况大致相似,较好地保留了 FP32 数据信息。
(四)、非线性量化(量化映射的每个间隔是不相等的)
三、量化的几个前沿研究方向
(一)、强化学习
- 混合精度量化
(二)、训练时量化
- 量化感知训练STE 。量化损失添加到loss中
https://zhuanlan.zhihu.com/p/163413457 - 可微量化。 DSQ 直接让量化操作可导
(三)、用什么比特表示最好?
二值网络
三值网络
https://chenrudan.github.io/blog/2018/10/02/networkquantization.html
(四)、提高int8 量化效果
- 找到更好的 mixmax(非线性量化)
- weight activation 数据分布不同
- 每一层的数据范围都不同,动态值域问题(calibration)
-
round带来误差。(round会肯定会带来误差,怎么处理呢?Stochastic roundin)
(五)、如何与其他神经网络压缩方法一起达到最好的压缩效果
-
Deep compression
(六)、神经网络的各个操作应该如何量化(relu ,concat, merge BN以及Eltwise等等)
四、工业界量化
- asymmetric uint8
- 量化感知训练会涉及到一些参数
- relu ,concat, merge BN以及Eltwise