模型压缩中参数量化

参考:https://blog.csdn.net/zlgahu/article/details/104662203?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-5.control

https://jackwish.net/2019/neural-network-quantization-introduction-chn.html

https://www.cnblogs.com/jermmyhsu/p/13169254.html

混合精度训练:https://zhuanlan.zhihu.com/p/103685761

量化层面的操作很多涉及了框架的算子层面,方法可能具有一定的局限性。

维基百科中关于量化(quantization)的定义是: 量化是将数值 x 映射到 y 的过程,其中 x 的定义域是一个大集合(通常是连续的),而 y 的定义域是一个小集合(通常是可数的)。8-bit 低精度推理中, 我们将一个原本 FP32 的 weight和activation 浮点数张量转化成一个 int8/uint8 张量来处理。模型量化会带来如下两方面的好处:

  1. 减少内存带宽和存储空间:weight 数值量化到8bit后,模型的大小将直接降为将近 1/4,activation采用8-bit之后也将明显减少对内存的使用,这也意味着低精度推理过程将明显减少内存的访问带宽需求,提高高速缓存命中率。
  2. 提高系统吞吐量(throughput),降低系统延时(latency):试想对于一个 专用寄存器宽度为 512 位的 SIMD 指令,当数据类型为 FP32 而言一条指令能一次处理 16 个数值,但是当我们采用 8-bit 表示数据时,一条指令一次可以处理 64 个数值。因此,在这种情况下,可以让芯片的理论计算峰值增加 4 倍。

一般将量化分为 quantization aware training(QAT) 和 post-training quantization(PTQ)

量化感知训练QAT 需要在训练阶段就对量化误差进行建模,这种方法一般能够获得较低的精度损失。PTQ 直接对普通训练后的模型进行量化,过程简单,不需要在训练阶段考虑量化问题,因此,在实际的生产环境中对部署人员的要求也较低,但是在精度上一般要稍微逊色于 QAT。

PTQ的量化过程在模型推理时如下,两种方案:

模型压缩中参数量化_第1张图片

 

第一种方案:在低精度模式下,CPU 的计算过程在是两个量化数据乘加之后先还原到 FP32 高精度,然后再量化成低精度。深度学习框架加载模型,重写网络以插入Quantize 和 Dequantize 层,并将权重转换为 INT8 格式

第二种方案:一些框架将网络整体转换为 INT8 格式,因此在推理期间没有格式转换,如图的下半部分。该方法要求几乎所有算子(Operator)都支持量化,因为运算符之间的数据流是INT8。对于除了卷积操作外还有大部分算子尚未被支持的框架,它可能会回落到 Quantize/Dequantize 方案。

由于 INT8 使用的比特数只有 FP32 的 25% ,在 INT8 和 FP32 之间转换数值的方法非常重要,因为它会显着影响预测精度。下面说下量化的映射方式。

量化分为两种:对称量化和非对称量化。

非对称量化:F32->int8即是[max,min]->[max_q,min_q],每类数据又相应的缩放因子q_x,缩放后的零点zp_x;非对称算法一般能够较好地处理数据分布不均与的情况

    

对称量化:F32->int8即是[-max,max]->[-max_q,max_q]

人工æºè½å¹²è´§ï½ä¸çº¿å·¥ç¨å¸å¸¦ä½ å­¦ä¹ æ·±åº¦å­¦ä¹ æ¨¡åéåç论+å®è·µ  

在神经网络计算过程中,更加上面的式子对输入,权重,偏差进行量化,卷积计算过后对其输出进行还原,非对称的还原过程:

对称的还原过程:

为了计算scale和zero_point,需要知道 FP32 weight/activiation 的实际动态范围。对于推理过程来说, weights 是一个常量张量,不需要额外数据集进行采样即可确定实际的动态范围。但是 activation 的实际动态范围则必须经过采样获取(一般把这个过程称为数据校准(calibration) )。目前各个深度学习框架中,使用最多的有最大最小值(MinMax), 滑动平均最大最小值(MovingAverageMinMax) 和 KL 距离(Kullback–Leibler divergence) 三种。注:由于激活值的范围会根据计算动态得到,所以产生了以上的三种方法,比如MinMax中如果出现离群点,则会明显扩大实际的动态范围,所以出现了滑动最大最小值,以此减少离群点的影响。

量化的粒度也可以分为对于一类参数的张量级量化和通道量化。

 

模型压缩中参数量化_第2张图片

之前的框架的某些算子无法支持定点数据的计算,只支持浮点数据的计算,目前的一些框架在做这方面的改进,实现定点数据计算可以实现一定的加速。

你可能感兴趣的:(学习问题,深度学习)