2、量化基础概念:掌握量化定义、定点与浮点表示、对称与非对称量化、量化参数(scale/zero-point)等核心术语
在NXP eIQ工具链中,模型量化是部署深度学习模型到MCU(如i.MX RT系列、LPC5500系列)或应用处理器(如i.MX 8M Plus)的关键步骤。量化的本质是用低精度数值(通常是INT8或INT16)近似表示高精度浮点数值(FP32),从而换取更小的模型体积、更低的内存带宽占用以及更快的推理速度。然而,量化并非无损操作,理解其底层数学定义与参数含义,是后续分析精度损失、实施恢复策略的根基。本节将系统梳理量化定义、定点与浮点表示差异、对称与非对称量化机制,以及scale(缩放因子)与zero-point(零点)这两个核心参数的推导与作用。
上图展示了浮点与定点表示的核心差异以及量化参数的桥梁作用。在NXP eIQ的TensorFlow Lite (TFLite) 或Glow工具链中,量化过程本质上是在浮点张量与定点张量之间建立一种线性映射关系。下面我们将从定义出发,逐步拆解这些概念。
2.1 量化定义与数学本质
核心原理:量化是将连续取值(或大范围离散取值)的浮点张量映射到有限个离散整数取值的过程。在深度学习部署中,最常见的做法是将FP32权重和激活值映射到INT8。数学上,这种映射可以表示为:
r = scale * (q - zero_point)
其中,r是反量化后的浮点值,q是量化后的整数值,scale是缩放因子(浮点数),zero_point是零点(整数)。这个公式是理解所有量化误差分析的基石。当zero_point为0时,即为对称量化;否则为非对称量化。
判断方法:在实际工程中,判断一个量化方案是否适合当前模型,需要观察权重和激活值的分布。通常,权重分布近似于高斯分布或拉普拉斯分布,中心对称;而激活值经过ReLU等函数后,往往呈现单边分布(如均大于0)。因此,权重推荐使用对称量化,激活值推荐使用非对称量化。在eIQ工具中,可以通过--quantize_weights和--quantize_activations选项分别控制。
2.2 定点与浮点表示:精度与范围的权衡
核心原理:浮点表示(如FP32)通过符号位、指数位和尾数位组合,能够以非均匀精度覆盖极大动态范围。而定点表示(如INT8)使用固定步长,均匀覆盖有限范围。在量化过程中,动态范围被压缩,精度(步长)变粗。例如,一个FP32权重值0.123456,在INT8非对称量化中,若scale为0.001,则量化后为123,反量化后为0.123,误差为0.000456。这种误差在深层网络中会被累积放大。
操作流程(在eIQ中查看量化信息):
- 使用eIQ Toolkit的模型转换工具,将FP32模型转换为INT8 TFLite模型。
- 在转换日志中查看每个张量的
scale和zero_point值。 - 对比量化前后权重直方图,观察信息损失情况。
案例拆解:假设我们有一个FP32权重张量,取值范围为[-1.5, 1.5]。若采用对称INT8量化,则scale = (1.5 - (-1.5)) / (127 - (-128)) = 3.0 / 255 ≈ 0.01176。此时,权重0.1被量化为round(0.1/0.01176) = 9,反量化后为0.10584,误差约5.8%。若采用非对称量化,且实际最小值为-1.2,最大值为1.5,则scale = (1.5 - (-1.2)) / 255 ≈ 0.01059,zero_point = round(-(-1.2)/0.01059) ≈ 113。权重0.1被量化为round(0.1/0.01059) + 113 = 9 + 113 = 122,反量化后为(122-113)*0.01059 = 0.09531,误差约4.7%。可见,非对称量化在分布偏斜时精度更高。
| 表示方式 | 动态范围 | 精度特性 | 存储占用 | 典型应用 |
|---|---|---|---|---|
| FP32 | ~1.2E-38 ~ 3.4E+38 | 非均匀,相对精度高 | 4字节 | 训练、高精度推理 |
| FP16 | ~6.1E-5 ~ 6.5E+4 | 非均匀,精度低于FP32 | 2字节 | 半精度推理 |
| INT8 | -128 ~ 127 | 均匀,步长固定 | 1字节 | 边缘设备推理 |
| INT16 | -32768 ~ 32767 | 均匀,步长更细 | 2字节 | 对精度要求较高的量化 |
常见误区:初学者常认为INT16量化一定比INT8精度高。实际上,如果模型权重分布范围很小,INT8的scale可能比INT16更精细,因为INT8的步长可能更小(取决于范围)。关键在于量化范围是否与数据分布匹配。
2.3 对称量化与非对称量化:适用场景与选择策略
核心原理:对称量化强制zero_point = 0,即浮点0映射到整数0。这简化了计算,因为卷积运算中的乘加操作无需处理zero-point偏移。非对称量化则允许zero_point非零,能够更灵活地匹配数据分布,但代价是计算复杂度增加。
判断方法:在NXP eIQ的模型优化流程中,可以通过以下步骤决定量化类型:
- 统计权重张量的最小值
w_min和最大值w_max,若|w_min| ≈ w_max,则选择对称量化。 - 统计激活张量的最小值
a_min和最大值a_max,若a_min ≥ 0(如ReLU输出),则非对称量化能更好地利用INT8的256个级别。 - 在eIQ的量化校准过程中,使用代表性数据集(通常500-1000张图片)统计激活分布,工具会自动推荐最优方案。
实战场景:在部署一个MobileNetV2图像分类模型到i.MX RT1170时,我们发现权重分布近似对称(范围[-0.8, 0.9]),而激活值经过ReLU6后范围在[0, 6]之间。采用全对称量化后,模型精度从90.2%降至87.5%;改用混合方案(权重对称、激活非对称)后,精度恢复至89.8%。这说明针对不同张量选择不同量化策略是精度恢复的重要手段。
2.4 量化参数scale与zero-point的推导与作用
核心原理:scale和zero-point是量化映射的核心参数。给定浮点范围[r_min, r_max]和量化范围[q_min, q_max](对于INT8,通常为[-128, 127]或[0, 255]),计算公式如下:
scale = (r_max - r_min) / (q_max - q_min)
zero_point = q_min - round(r_min / scale)
对于对称量化,r_min = -r_max,则zero_point = 0。这些参数在推理时用于反量化中间结果,或在量化感知训练(QAT)中模拟量化误差。
操作流程(在eIQ中手动计算与验证):
- 导出FP32模型的权重文件,使用Python脚本统计每个张量的min/max。
- 根据目标量化位数(如INT8)计算scale和zero_point。
- 使用eIQ的
QuantizationDebugger工具对比量化前后每层输出的差异。
案例拆解(完整闭环):
背景:某工业视觉项目使用NXP i.MX 8M Plus部署缺陷检测模型,原始FP32模型mAP为0.85。直接使用eIQ默认的对称INT8量化后,mAP降至0.72,无法满足0.80的验收标准。
分析过程:通过eIQ的调试工具发现,第3层和第7层的激活值分布严重偏斜(最小值-0.1,最大值12.8),对称量化导致大量量化级别浪费在负区间。同时,第5层权重存在离群值(最大值为最小值的50倍),导致scale过大,小权重被截断为0。
操作步骤:
- 步骤1:对激活层改用非对称量化,设置
--activation_quantizer=asymmetric。 - 步骤2:对权重进行离群值裁剪,将最大值限制在3σ范围内(σ为标准差),重新计算scale。
- 步骤3:使用500张验证集图像进行校准,更新激活的min/max统计。
结果对比:调整后mAP恢复至0.82,模型大小从8.2MB降至2.1MB,推理速度提升2.3倍。代价是校准时间增加了约15分钟,且需要额外编写裁剪脚本。
复盘经验:量化参数并非一成不变,校准数据集的选择直接影响scale和zero-point的准确性。若校准集与真实数据分布差异大,量化误差会显著增加。建议在部署前使用目标场景的真实数据重新校准。
--quantize_activations和--quantize_weights的细粒度控制,结合校准数据集优化,是恢复精度的有效路径。