目录
- 模型量化
模型量化
1、模型量化优点
- 低精度模型表示模型权重数值格式为FP16(半精度浮点)或者INT8(8位定点整数),但是目前低精度往往就指代INT8。
- 常规精度模型则一般表示模型权重数值格式为FP32(32位浮点,单精度)。
- 混合精度则在模型中同时使用FP32和FP16的权重数值格式。FP16减少了一半的内存大小,但有些参数或操作符必须采用FP32格式才能保持准确度。
2、模型量化方案
- data free:不适用校准集,直接将浮点数转化成量化数。高通的DFQ不使用校准集也得到了很高的精度。
- calibration:基于校准集方案,通过输入少量真实数据进行统计分析。
- finetune:基于训练微调的方案,将量化误差在训练时仿真建模,调整权重使其更适合量化。好处是能带来更大的精度提升,缺点是要修改模型训练代码,开发周期较长。
FP32转Int8量化参考这篇博客:
Int8量化介绍
3、PTQ
训练后量化(Post Training Quantizationi),也叫做离线量化,根据量化零点 x z e r o _ p o i n t x_{zero\_point} xzero_point是否为0,训练后量化分为对称量化和非对称量化;根据数据通道顺序NHWC这一维度区分,训练后量化分为逐层量化和逐通道量化。目前TensorRT使用逐层量化的方法,每一层采用同一个阈值进行量化。逐通道量化对每一层每个通道都有各自的阈值,对精度可以有一个很好的提升。
4、QAT
在线量化,即在模型训练时加入伪量化节点,用于模拟模型量化时引起的误差。伪量化节点就是模仿quantization-dequantization的过程。
论文中一般在activation后和conv weight之前加入伪量化节点。
4、量化的分类
- 二值化
- 线性量化:采用均匀分布的聚类中心,原始浮点数据和量化后的定点数据存在一个简单的线性变换关系,因为卷积、全连接等网络层本身只是简单的线性计算,因此线性量化中可以直接用量化后的数据直接计算。
- 对数量化:一种比较特殊的量化方法。两个同底的幂指数进行相乘,那么等价于其指数相加,降低了计算强度。同时加法也被转变为索引计算。
5、对称量化和非对称量化
根据偏移量Z是否为0,可以将浮点数的线性量化分为两类:对称量化和非对称量化。
对称量化的浮点值和 8 位定点值的映射关系如下图,从图中可以看出,对称量化就是将一个tensor中的[-max(|x|), max(|x|)]内的FP32值分别映射到8bit数据的[-128, 127]的范围内,中间值按照线性关系进行映射,称这种映射关系是对称量化。可以看出,对称量化的浮点值和量化值范围都是相对于0对称。
非对称量化就是偏移量不为0,此时INT8的值域为[0, 255]。
权重量化浮点值可以分为两个步骤:
1、通过在权重张量中找到min和max值从而确定 x s c a l e x_{scale} xscale和 x z e r o p o i n t x_{zero_point} xzeropoint。
2、将权重张量的每个值从FP32转换为INT8。
6、量化方法的改进