4. 模型转换与量化基础
在地平线旭日X3/X5平台上部署模型时,训练阶段得到的浮点模型(FP32)通常不能直接高效运行在BPU上。BPU擅长的是定点计算,尤其是INT8推理。因此,模型转换与量化是交付链路中承上启下的关键环节:它把PyTorch/ONNX等框架下的浮点权重、激活值,映射为定点表示,并通过校准确定每一层的量化参数,最终生成可被地平线工具链编译部署的定点模型。
一、转换原理:从浮点到定点的数学映射
定点量化的本质是用整数近似表示浮点数。最常用的是线性量化(仿射量化),其公式为:
q = round( x / scale + zero_point )
x_float ≈ ( q - zero_point ) * scale
其中,scale是浮点缩放因子,zero_point是零点偏移,q是量化后的整数。对于INT8,q的取值范围通常是[-128, 127]或[0, 255]。scale决定了浮点区间映射到整数区间的粒度,zero_point保证浮点0能够被精确表示,这对ReLU等含零边界的激活函数尤为重要。
按照量化对象不同,可分为权重量化和激活量化。权重是静态的,可以在转换时直接统计其分布并确定量化参数;激活值是动态的,随输入数据变化,因此需要借助校准数据集来估计其动态范围。地平线工具链通常采用“权重离线量化 + 激活在线校准”的组合方式。
按照量化粒度,又可分为逐张量量化(per-tensor)和逐通道量化(per-channel)。逐通道量化对卷积核的每个输出通道单独计算scale,能显著降低量化误差,是X3/X5上推荐的权重量化方式。
二、校准方法:如何确定激活值的动态范围
校准是量化过程中最影响精度的步骤。它的任务是:用一批有代表性的输入数据跑一遍浮点模型,统计每一层激活值的分布,从而确定合适的scale和zero_point。常见校准方法包括:
- Min-Max校准:直接取激活值的最小值和最大值作为量化范围。实现简单,但对离群值非常敏感,容易导致大部分数值被压缩到很窄的整数区间。
- KL散度校准:在min-max基础上,通过最小化量化前后分布的KL散度,截断部分极端值,寻找更优的截断阈值。这是地平线工具链中常用的方法,对检测、分类模型通常更友好。
- 百分位校准:取99.9%或99.99%分位数作为范围,忽略极端离群点,适合激活分布长尾明显的模型。
- MSE校准:以量化误差平方和最小为目标搜索最优截断值,计算量略大但精度稳定。
三、精度评估指标:量化后到底掉了多少
量化不是无损的,必须用可量化的指标评估精度损失。常用指标如下表所示:
| 指标 | 含义 | 适用场景 | 参考阈值 |
|---|---|---|---|
| 余弦相似度 | 浮点输出与定点输出向量的夹角余弦 | 逐层或最终输出对比 | > 0.99 |
| 相对误差 | |定点值 - 浮点值| / |浮点值| | 回归、深度估计 | < 5% |
| Top-1 / Top-5 准确率 | 分类任务量化前后准确率变化 | 图像分类 | 下降 < 1% |
| mAP | 检测任务平均精度均值 | 目标检测 | 下降 < 2% |
| PSNR / SSIM | 图像重建质量 | 超分、去噪 | PSNR下降 < 1dB |
在地平线工具链中,通常先看逐层余弦相似度,定位哪一层量化误差最大;再看端到端任务指标。如果某一层余弦相似度低于0.98,往往需要对该层单独调整量化策略,例如改为逐通道量化、保留浮点或调整校准方法。
四、案例与常见误区
以一个YOLO检测模型在X5上的转换为例:浮点模型mAP为0.82,直接使用min-max校准量化后mAP降至0.74,下降约8个百分点。排查发现,骨干网络浅层激活值存在明显离群点,min-max被极端值拉偏。改用KL散度校准后,mAP恢复到0.80,下降控制在2个百分点以内,满足交付要求。
常见误区二:只看最终指标,不看逐层相似度。逐层分析能快速定位问题层,避免盲目调参。
常见误区三:认为INT8一定掉点严重。对于大多数CNN模型,配合逐通道权重化和KL校准,精度损失通常可以控制在1%以内。
总结来说,浮点转定点的核心是“映射 + 校准 + 评估”三步闭环:用线性量化建立数学映射,用校准数据确定激活范围,用精度指标验证是否达标。掌握这三步,才能在X3/X5上既拿到BPU的算力红利,又守住模型精度底线。