离线量化算法和工具
- 一、离线量化的基础概念
- 1.1、基本流程
- 1.2、量化的优点和缺点
- 1.3、如何生产一个硬件能跑的量化模型
- 1.4、PTQ的概念以及和QAT的区别
- 1.5、离线量化的标准流程
- 1.6、校准数据的选择
- 1.7、量化模式的选择
- 1.8、校准方式的选择
- 1.9、量化算法的选择
- 1.10、写入量化参数
一、离线量化的基础概念
1.1、基本流程
模型: 特指深度神经网络(用于提取图像/视频/语音/文字特征)
量化: 将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程。
量化推理的流程(以8bit为例):
1.将该层权重
量化成int8(通过权重的量化参数);
2.将该层输入
激活量化为int8(通过激活的量化参数)
3.int8的激活和权重参与该层的运算
(比如下图的 Conv2D),
4.将该层输出激活反量化
为浮点格式并送入下一层。
1.2、量化的优点和缺点
模型量化优点:
减少内存: 量化的过程就将神经网络参数的32位浮点数表示,转换为更小的表示形式,例如8位整数。例如,从 32 位变为 8位将使模型大小减少4倍,因此量化的一个明显好处是显著减少内存。
加速推理: 由于可以使用整数而不是浮点数据类型执行操作,因此网络速度得到了提高。 整数运算在大多数处理器内核(包括微控制器)上需要更少的计算。
模型量化缺点:
量化的代价是神经网络可能会失去准确性,因为它们不能精确地表示信息。
1.3、如何生产一个硬件能跑的量化模型
1.4、PTQ的概念以及和QAT的区别
离线量化又称为训练后量化(Post-Training Quantization, PTQ),仅需要使用少量校准数据
,确定最佳的量化参数降低量化误差。这种方法需要的数据量较少,但量化模型精度相比在线量化(Quantization Aware Training,QAT)稍逊一些。
PTQ 仅仅使用校准数据计算量化参数(scale,zero-point),而QAT是学习量化参数,甚至训练权重,所以其精度较好。但是PTQ因为其简单易用性,在工业界通常作为量化的第一选择。
1.5、离线量化的标准流程
- 选择校准数据:与训练/测试数据同源,非常重要;
- 选择量化模式:根据目标硬件,选择量化模式(对称/非对称,per-tensor/channel)
- 选择校准算法:通过自己的量化工具或者推理后端自带的默认量化工具,选择校准算法,校准每一层的激活的量化参数(scale,zero_point)(weight一般不用校准)
- 选择量化算法:通过量化工具,使用高阶的PTO算法调整权重;
- 写入量化参数:如果是自己手动产出的量化参数,需要将量化参数塞到模型里,部署到目标硬 件;
- 混合精度:量化误差分析及混合精度部署(可选,当量化精度比较差时
1.6、校准数据的选择
- 工业界的实际量化中,如果可以选择校准数据,尽量遵循以下原则:
量化数据不能太少
,最好100-200张,具体数目可根据实际情况调整
量化数据与训练/测试数据的来源、类别是相似的
。 - 量化数据最好来源于测试数据的按
类sample或者随机sample
。量化数据的预处理方式和训练/测试时的预处理方式是一致的,注意BGR/RGB,mean,std
等数值的一致性。 由于离线量化只能拿到部分数据,因此校准数据是否能代表实际场景至关重要
- 在实际使用中经常遇到校准集不够好导致量化掉点的情况。
学术界
将该问题极端化,定义了两种场景
- 无数据量化
- Cross-domain量化
1.7、量化模式的选择
(主要是确定量化方案在自己的硬件
是否有合适的推理库
)
1.8、校准方式的选择
- 量化校准方法:Min Max
量化是深度学习模型优化中的一项关键技术,特别是在推理阶段。Min Max 是一种常见的量化校准方法,用于确定量化参数,如 scale(缩放因子)和 zero_point(零点)。
一、对称量化 (Symmetric Quantization)
在对称量化中,量化后的值围绕零点对称。scale 计算公式:
scale = 255 / (2 * max(abs(x))) (对于8位整数,考虑无符号或已处理符号的情况)其中,x 是浮点数的激活张量,max(abs(x)) 是 x 中绝对值的最大值。zero_point:
在对称量化中,zero_point 总是 0。
二、非对称量化 (Asymmetric Quantization)
非对称量化允许量化后的值不围绕零点对称,适用于数据分布不对称的情况。scale 计算公式:
scale = (max(x) - min(x)) / 255 (对于8位整数)其中,max(x) 和 min(x) 分别是 x 中的最大值和最小值。zero_point 计算公式:
zero_point = Clip(Round(min(x) / scale), -128, 127) (对于8位整数)其中,Clip 函数确保 zero_point 在 -128 和 127 的范围内,Round 函数用于四舍五入。
- KL Divergence(Tensorrt常用的量化方式):
KL Divergence:使用参数在量化前后的KL散度作为量化损失的衡量指标。
- Histogram:
Histogram: 首先采用KL散度的方式将所有参数映射为直方图,然后根据给定百分比,选取直方图的百分位点作为截断值。此方法可以去除掉一些极端值,并且可以灵活调节直方图百分比来调整截断值大小,以适应不同模型
- MSE:
MSE: 使用均方误差作为模型量化前后输出的损失的衡量指标。选取使得激活值在量化前后的均方误差最小的量化参数。此方法较为耗时,但是效果常常优于其他方法。
1.9、量化算法的选择
1.10、写入量化参数
很多推理后端都支持写入量化参数或者写入每一层tensor的range以TensorRT为例,假设我们通过自己的量化工具得到了每一层激活tensor的range,如下方左图,就可以通过下方右图所示的脚本
写入到模型里。