4. 模型转换与量化基础

在地平线旭日X3/X5平台上部署模型时,训练阶段得到的浮点模型(FP32)通常不能直接高效运行在BPU上。BPU擅长的是定点计算,尤其是INT8推理。因此,模型转换与量化是交付链路中承上启下的关键环节:它把PyTorch/ONNX等框架下的浮点权重、激活值,映射为定点表示,并通过校准确定每一层的量化参数,最终生成可被地平线工具链编译部署的定点模型。

核心目标可以概括为一句话:在尽量保持精度的前提下,把浮点模型转换为INT8定点模型,使其能够在X3/X5的BPU上获得低延迟、低功耗、高吞吐的推理性能。

一、转换原理:从浮点到定点的数学映射

定点量化的本质是用整数近似表示浮点数。最常用的是线性量化(仿射量化),其公式为:

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上推荐的权重量化方式。

浮点模型 → 定点模型转换与量化流程 浮点模型 PyTorch / ONNX 模型解析 算子映射 / 图优化 校准 Calibration 统计激活值分布 量化参数生成 scale / zero_point INT8 定点模型 .onnx / .bin 精度评估 余弦相似度 / 误差 校准数据集 100~500 张样本 精度不达标 调整校准策略 校准数据分布应尽量覆盖真实推理场景,否则量化误差会显著增大

二、校准方法:如何确定激活值的动态范围

校准是量化过程中最影响精度的步骤。它的任务是:用一批有代表性的输入数据跑一遍浮点模型,统计每一层激活值的分布,从而确定合适的scale和zero_point。常见校准方法包括:

  • Min-Max校准:直接取激活值的最小值和最大值作为量化范围。实现简单,但对离群值非常敏感,容易导致大部分数值被压缩到很窄的整数区间。
  • KL散度校准:在min-max基础上,通过最小化量化前后分布的KL散度,截断部分极端值,寻找更优的截断阈值。这是地平线工具链中常用的方法,对检测、分类模型通常更友好。
  • 百分位校准:取99.9%或99.99%分位数作为范围,忽略极端离群点,适合激活分布长尾明显的模型。
  • MSE校准:以量化误差平方和最小为目标搜索最优截断值,计算量略大但精度稳定。
校准数据不需要标注,但必须来自真实场景。建议准备100~500张覆盖不同光照、角度、类别的样本。如果校准集与测试集分布差异大,量化后的精度评估会失真。

三、精度评估指标:量化后到底掉了多少

量化不是无损的,必须用可量化的指标评估精度损失。常用指标如下表所示:

指标 含义 适用场景 参考阈值
余弦相似度 浮点输出与定点输出向量的夹角余弦 逐层或最终输出对比 > 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的算力红利,又守住模型精度底线。