量化技术详解

量化概念

模型量化是指将神经网络模型中的连续取值的权重或激活值近似为有限多个离散值的过程。

量化&反量化

优势

  • 压缩参数:使用低精度整型数据表示原来的高精度浮点数据,可以减少存储参数所需的空间。
  • 提升速度:当权重与激活全部量化为整型值后,就可以将原来的浮点运算转换为高效的整数运算,提高推理速度。
  • 降低内存占用:激活值的量化,可以减少推理期间激活值所占用的内存大小。

劣势

模型精度下降:因为量化相关的操作给网络中的值带来了误差,因此会导致模型精度的下降。

量化分类

线性量化与非线性量化

根据量化数据表示的原始数据范围是否均匀,可以将量化分为线性量化和非线性量化

线性量化:也称为均匀量化,在线性量化中相邻两个量化值之间的差距是固定的。量化公式中的r表示原来的浮点值,Q表示量化后的整型数据,s表示缩放因子,是量化相关的参数。量化的过程是浮点值除以缩放因子,然后做舍入和clamp操作。反量化就是用量化值乘缩放因子。因为量化过程引入了舍入和clamp操作,因此反量化回去的值与原来的浮点值并不相等。

非线性量化:量化值之间的间隔不固定。网络中值的分布往往是不均匀的,更多的是类似高斯分布的形式。非线性量化可以更好的捕获分布相关的信息,数据多的地方量化间隔小,量化精度高;数据少的地方量化间隔大,量化精度低。因此非线性量化的效果理论上比线性量化更好。

非线性量化的通用硬件加速比较困难,而且实现更加复杂,因此线性量化更加常用,后续的内容大部分也是基于线性量化展开的。

对称量化与非对称量化

根据浮点值的零点是否映射到量化值的零点,可以将量化分为对称量化和非对称量化。

对称量化:对称量化中浮点值的零点直接映射到量化值的零点,因此不需要其他参数来调整零点的映射的位置,与量化相关的参数只有缩放因子s。对于有符号数的量化(int8),对称量化表示的浮点值范围是关于原点对称的(左图)。对于无符号数量化(uint8),对称量化可以表示的大于等于0的浮点范围。

非对称量化:非对称量化有一个额外的参数Z调整零点的映射,这个参数通常称为零点。非对称量化表示的范围没有严格的限制,可以根据浮点值的范围,选取任意的想要表示的范围。因此非对称量化的效果通常比对称量化好,但是需要额外存储以及推理时计算零点相关的内容。

量化粒度

根据量化参数(缩放因子s,零点z)的共享范围,可以将量化分为逐层量化和逐通道量化。

逐层量化:在逐层量化中,每个网络层中的所有filter共享相同的量化参数。所要表示的浮点值范围的选择需要考虑当前层所有的filter来确定。对每层中所有的filter采用相同的范围,对应的缩放因子和零点也是相同的(缩放因子和零点是根据所要表示的浮点值范围和整型值位宽计算得到)。这种方法的实现比较简单,但是它的效果并不是很好,因为不同filter的范围可能会有很大差异。对于范围较小的filter可能会因为同层中存在范围较大的filter而使得其量化效果较差。

逐通道量化:逐通道量化是一种更细粒度的量化方法。在这种方法中,为每层的各个filter单独地计算需要表示的范围以及量化参数。这种方法能够更好的保留每个filter的信息,产生的量化效果也较好。

精度选择

根据网络中量化位宽的不同,可以将量化分为统一精度量化和混合精度量化。

统一精度:在统一精度量化中,所有量化的网络层均采用相同的位宽(相同的整型类型)。这是一种比较简单的精度选择方法,不需要考虑不同层对量化的敏感度。但是采用这种方法,在对网络进行量化或量化到较低精度时,可能会引起网络准确率的显著下降。

混合精度:在混合精度量化中,不同的网络层可以量化到不同的位宽。核心思想是将不适合量化的层保留在较高精度,适合量化的层进行更加激进的量化。使网络整体处于较低位宽,并尽量缓解网络准确率的下降。混合精度量化中需要解决的问题与统一精度类似。但是混合精度量化需要额外关注一点,就是如何决定不同网络层的量化位宽。

量化方式

量化方式可以分为两大类,训练后量化和量化感知训练。

训练后量化

训练后量化直接对已训练完成的模型进行量化,无需复杂的fine-tuning或训练过程,因此训练后量化的开销较小。训练后量化无需或只需要一小部分数据驱动量化,因此能很好地应用于数据敏感的场景。但是训练后量化的模型精度下降可能要高于量化感知训练。训练后量化可以分为权重量化和全量化两种。

权重量化:在权重量化中,仅对模型的权重进行量化操作,以整型形式存储模型权重,可以压缩模型的大小。在推理阶段首先将量化的权重反量化为浮点形式,推理过程仍然为浮点计算,无法加速推理过程,。

全量化:在全量化中对模型权重和激活值进行量化,不仅可以压缩模型大小,减少推理过程的内存占用,而且因为激活值和权重都为整型数据,因此可以使用高效的整型运算单元加速推理过程。全量化可以分为两种形式:静态量化和动态量化。

  • 静态量化:静态量化中离线计算好模型权重和激活的量化参数,推理的时候不再调整直接使用。对激活值量化需要获取激活值的分布信息,因此,静态量化中需要提供一定的数据来推理网络,收集网络的激活值信息,确定相关的量化参数。
  • 动态量化:在动态量化中,激活值相关的量化参数是在推理阶段实时计算的。虽然效果更好,但是会给推理带来额外的开销。

量化感知训练

量化感知训练在训练好的模型上插入伪量化算子(对数值量化然后反量化),模拟量化产生的误差。然后在训练数据集更新权重并调整对应的量化参数,或者直接将量化参数作为可学习的参数在反向传播中更新。这种方法得到的量化模型精度较高,但是因为需要训练过程,因此开销较大,而且对于数据的要求相对于训练后量化也更高。

在这种方法中主要考虑的一个问题在计算梯度时如何处理量化操作中的不可微分的部分(round操作)。一种传统的方法是使用staright through estimator(STE)将伪量化算子的梯度设置为1,也就是输入的梯度等于输出的梯度。

校准方法

校准是调整与确定量化参数的过程。以有符号数对称量化为例,缩放因子 s=threshold2b−1−1 ,其中b是整型类型的位宽。因为是对称量化,因此这里只是用正半轴上的值计算缩放因子,以INT8为例,我们利用的整型范围是[-127,127],表示的原始值范围为[-threshold,threshold]。因为量化位宽往往是提前确定好的,因此确定缩放因子就是确定我们想要表示的浮点值的范围。

global:最简单的阈值选择方法,直接指定一个全局的值,作为所有网络层的量化阈值。但是每层之间值的范围多少有差距,因此这种方法很难找到适合所有层的量化阈值。

max:也是相对简单阈值选择方法,将浮点值的最大绝对值作为量化阈值,这种方法能够表示整个浮点值的范围,但是可能无法充分利用整型值的范围。

percentile:通过分位数确定量化阈值。网络中的值往往不是均匀分布的,大部分是中间多两边少的“钟”型分布,此外还可能存在一些离群点,如果量化要表示所有的浮点值,反而可能会降低量化的精度。因此通过分位数确定阈值,虽然损失了部分数值的信息,但量化效果可能会更好。

mse:这种方法的目标是最小化量化前后数值之间的差距。通过选择多个候选阈值,记录不同阈值下对浮点值模拟量化的结果,并计算结果与原始的浮点值之间的均方误差,选择使均方误差最小的值作为最终的threshold。

KL-divergence:这种方法的目标是最小化量化前后数值分布之间的差距。和均方误差类似,通过选择多个候选阈值,记录不同阈值下模拟量化值的分布信息,并计算与原始分布之间的KL散度,选择使KL散度最小的值作为最终的threshold。

参考资料

[1] Gholami A, Kim S, Dong Z, et al. A survey of quantization methods for efficient neural network inference[J]. arXiv preprint arXiv:2103.13630, 2021.
[2] Nagel M, Fournarakis M, Amjad R A, et al. A white paper on neural network quantization[J]. arXiv preprint arXiv:2106.08295, 2021.
[3] Krishnamoorthi R. Quantizing deep convolutional networks for efficient inference: A whitepaper[J]. arXiv preprint arXiv:1806.08342, 2018.
[4] Jacob B, Kligys S, Chen B, et al. Quantization and training of neural networks for efficient integer-arithmetic-only inference[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2018: 2704-2713.
[5]  https://on-demand.gputechconf.com/gtc/2017/presentation/s7310-8-bit-inference-with-tensorrt.pdf
[6]  https://zhuanlan.zhihu.com/p/548174416
[7]  https://www.bilibili.com/video/BV1fB4y1m7fJ

原文链接:深度学习模型压缩方法(三):量化 - 知乎 (zhihu.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值