3. 模型量化基础:量化原理、定点与浮点表示、对称/非对称量化、量化粒度(per-tensor/per-channel)

在Edge AI端侧模型部署中,PTQ(训练后量化)是降低模型体积、提升推理速度、降低功耗的核心手段。然而,PTQ的精度损失往往源于对量化基础概念的模糊理解。本章将系统梳理量化原理、定点与浮点表示、对称/非对称量化以及量化粒度四个关键维度,帮助你在实际项目中做出正确的量化策略选择。

量化基础四维知识框架 模型量化 量化原理 实数→整数映射 缩放因子scale 零点zero-point 定点与浮点表示 FP32/FP16/BF16 INT8/INT16/INT32 动态范围与精度 对称/非对称量化 对称:zero-point=0 非对称:含零点偏移 适用场景差异 量化粒度 per-tensor per-channel 精度与计算开销权衡 四者共同决定PTQ精度表现与部署效率

3.1 量化原理:从连续到离散的映射

量化本质上是将连续的浮点数值映射到有限的离散整数集合。在Edge AI场景中,最常见的做法是将FP32权重和激活值映射到INT8范围(-128~127或0~255)。这个映射过程由两个关键参数控制:缩放因子(scale)和零点(zero-point)。scale决定了每个整数步长代表的浮点范围,而zero-point则用于对齐浮点零值和整数零值。

数学上,量化过程可以表示为:q = round(r / scale) + zero_point,其中r为原始浮点值,q为量化后的整数值。反量化过程则为:r ≈ (q - zero_point) × scale。在实际PTQ中,我们需要通过校准数据集统计激活值的分布,从而确定最优的scale和zero-point。常见的校准方法包括MinMax、Percentile、KL散度等,不同方法对异常值的敏感度不同,直接影响量化精度。

核心要点:量化不是简单的截断,而是通过scale和zero-point两个参数实现浮点到整数的仿射变换。校准数据集的选择和统计方法决定了量化参数的优劣,进而影响模型精度。

3.2 定点与浮点表示:精度与范围的权衡

浮点表示(FP32、FP16、BF16)具有动态范围大、精度高的特点,但计算单元面积大、功耗高。定点表示(INT8、INT16、INT32)则相反,硬件实现简单、速度快、功耗低,但动态范围受限。在Edge AI芯片(如高通Hexagon、ARM Ethos、寒武纪MLU)中,INT8计算单元通常比FP32快2-4倍,功耗降低5-10倍。

选择定点格式时,需要关注两个指标:动态范围和精度。INT8的动态范围为[-128, 127],对于权重分布较均匀的模型(如MobileNet)足够;但对于存在明显离群值的模型(如某些检测头),直接INT8量化会导致较大精度损失。此时可考虑混合精度方案:敏感层保留FP16,非敏感层使用INT8。

格式 位宽 动态范围 相对精度 典型应用
FP32 32 ±3.4×10^38 高 训练、精度基准
FP16 16 ±65504 中高 移动端GPU推理
BF16 16 同FP32 中(尾数少) 云端训练、部分NPU
INT8 8 -128~127 低(需量化) Edge NPU、DSP
INT16 16 -32768~32767 中 部分音频/传感器处理

3.3 对称/非对称量化:零点处理的艺术

对称量化强制zero-point为0,即浮点零值映射到整数零值。这种方式的优点是计算简单,不需要额外处理零点偏移,适合权重分布关于0对称的场景(如经过BatchNorm的卷积权重)。非对称量化则允许zero-point非零,能够更精细地利用量化范围,适合激活值分布偏向某一侧的情况(如ReLU后的特征图全为正)。

选择策略上,权重通常使用对称量化(因为权重分布近似对称),激活值则根据实际分布决定。如果激活值分布明显偏斜(如检测框回归头的坐标值),非对称量化能减少量化误差。但非对称量化在硬件实现上需要额外的零点修正计算,部分NPU可能不支持或效率较低。

实战经验:在Rockchip RK3588、地平线征程系列等国产Edge芯片上,对称INT8量化是默认选项。如果遇到精度问题,优先检查激活值分布是否适合对称量化,必要时在模型中插入Clip操作限制范围,而非直接切换非对称量化。

3.4 量化粒度:per-tensor与per-channel的精度博弈

量化粒度决定了scale和zero-point的共享范围。per-tensor对整个张量使用一组量化参数,计算简单、硬件友好,但忽略了不同通道间的数值分布差异。per-channel则对每个输出通道独立计算量化参数,能显著降低量化误差,尤其适用于深度可分离卷积和逐通道权重差异大的模型。

以MobileNetV2为例,其深度可分离卷积的权重分布在不同通道间差异可达10倍以上。使用per-tensor量化时,整体精度可能下降2-3%;而per-channel量化可将损失控制在0.5%以内。但per-channel量化在推理时需要额外的参数存储和计算开销,部分低端NPU不支持该模式。

风险提示:per-channel量化并非总是优于per-tensor。当模型通道数较少(如某些轻量级模型的头部层)或硬件不支持时,per-channel带来的收益可能被额外开销抵消。务必在目标硬件上实测对比。

3.5 案例拆解:某视觉检测模型PTQ量化粒度选择

背景与约束:某安防摄像头SoC集成自研NPU,仅支持per-tensor对称INT8量化。模型为YOLOv5s(检测头含坐标回归),FP32 mAP@0.5为0.742。目标是在不损失超过1%精度的前提下完成PTQ。

初始现象:直接使用默认per-tensor量化后,mAP降至0.681,损失达6.1%,远超预期。分析发现,检测头的坐标回归层输出值范围在[-10, 10]之间,但大部分值集中在[-2, 2],直接MinMax校准导致量化步长过大。

分析过程:通过逐层输出分布统计,定位到3个高敏感层:两个坐标回归卷积层和一个类别置信度层。这些层的激活值分布呈长尾状,且不同通道间差异显著。

实际操作:由于硬件限制无法使用per-channel,我们采取以下步骤:1)对高敏感层使用Percentile校准(99.99%),排除极端离群值;2)在模型中插入Clip操作,将坐标回归值限制在[-5, 5];3)对类别置信度层使用非对称量化(该NPU支持per-tensor非对称)。

结果对比:优化后mAP恢复至0.735,损失仅0.7%。推理速度从FP32的45ms提升至INT8的12ms,内存占用减少75%。

风险与代价:Clip操作可能影响极端场景下的检测精度(如远距离小目标),需在验证集上额外测试。整个调优过程耗时2人天,但避免了更换硬件方案的高昂成本。

复盘经验:当硬件不支持per-channel时,不要盲目追求量化参数复杂度,而应结合校准策略优化和模型结构微调。理解量化粒度的本质——参数共享范围与数据分布匹配度——比单纯追求per-channel更重要。

3.6 常见误区与总结

  • 误区一:认为per-channel一定比per-tensor好。实际上,在通道数少或硬件不支持时,per-tensor配合好的校准策略可能更优。
  • 误区二:忽略zero-point的作用。非对称量化中,zero-point的微小误差会导致整体偏移,尤其在多层累积后。
  • 误区三:校准数据集与真实部署数据分布不一致。PTQ的量化参数完全依赖校准集,如果校准集缺乏代表性,精度损失会急剧放大。
  • 误区四:混淆FP16与INT8的精度表现。FP16动态范围大,但尾数精度低;INT8在精心校准后,对某些任务可能比FP16更稳定。