1. 课程导入
当你把一个在服务器 GPU 上训练好的检测或分割模型,直接搬到地平线征程(Journey)系列芯片上运行时,往往会遇到三个非常现实的问题:模型体积太大、推理延迟太高、内存带宽吃紧。模型量化正是解决这三类问题的核心技术手段。本节作为整门课程的开篇,先建立对量化“为什么做、在地平线上怎么做、学完能做什么”的整体认知,为后续校准数据、精度评估与部署验证三条主线打下基础。
一、核心原理:量化到底改变了什么
深度学习模型在训练阶段通常使用 FP32(32 位浮点)表示权重和激活值。量化则是把高精度浮点数值映射到低比特整数(如 INT8、INT16),用更少的比特表达相近的数值信息。其本质是一个“缩放 + 取整”的仿射映射:
q = round(x / scale) + zero_point
x ≈ (q - zero_point) * scale
其中:
x 原始浮点值
q 量化后的整数
scale 缩放因子(浮点)
zero_point 零点偏移(整数),保证 0 能精确表示
量化带来的收益是直接的:INT8 相比 FP32,理论存储占用降为 1/4,在支持 INT8 加速的硬件上算力吞吐可提升数倍,同时显著降低功耗与内存带宽压力。代价则是数值精度损失,若校准不当,会出现检测框抖动、小目标漏检、分类置信度偏移等现象。因此量化不是“一键压缩”,而是一套需要校准、评估、验证的工程流程。
二、地平线平台量化特点
地平线征程芯片采用自研 BPU(Brain Processing Unit)架构,其量化工具链与通用 GPU 生态有明显差异,理解这些差异是避免踩坑的前提:
- 以 INT8 为主力精度:BPU 对 INT8 有专门的乘加阵列优化,INT8 是获得最佳能效比的精度档位;部分场景可使用 INT16 或混合精度缓解敏感层精度问题。
- 依赖校准数据确定 scale:量化参数不是训练时学出来的,而是通过一批代表性输入数据统计激活值分布得到,因此校准集的质量直接决定量化精度。
- 算子支持有边界:并非所有 PyTorch/ONNX 算子都能被 BPU 高效支持,部分算子会被拆分、回退到 CPU 或需要替换为等价结构,量化前需做算子检查。
- 量化感知训练(QAT)与训练后量化(PTQ)并存:PTQ 快速但精度有限,QAT 精度更好但需要训练资源,需按项目阶段选择。
- 部署链路固定:典型路径为 训练框架模型 → ONNX → 地平线量化编译工具 → 板端可执行模型,每一步都有对应的校验点。
下图展示了从浮点模型到板端部署的完整量化链路,以及各环节的核心对象与校验点,帮助你在后续章节中快速定位自己处在哪一步。
三、案例场景:一次典型的量化落地
假设你在做一个车载前视感知项目,模型是 YOLO 系列的轻量检测网络,输入 640×640,原始 FP32 模型在服务器上 mAP 为 0.42。直接量化部署到征程芯片后,发现 mAP 掉到 0.36,且夜间场景漏检明显。排查路径通常是:
- 先确认 ONNX 导出后算子是否全部被支持,是否存在被回退到 CPU 的算子导致数值路径不一致。
- 检查校准集是否只用了白天数据,导致夜间激活值分布未被覆盖,scale 估计偏大或偏小。
- 对敏感层(如检测头前的卷积、小目标分支)尝试保留 INT16 或调整量化粒度。
- 若 PTQ 仍不达标,引入 QAT,在训练中模拟量化误差,让权重适应低比特表示。
- 板端实测端到端指标,确认与仿真结果一致,避免“仿真达标、上板翻车”。
四、常见误区与复盘
| 误区 | 表现 | 正确做法 |
|---|---|---|
| 校准集随便抽几十张图 | 仿真精度尚可,实车场景掉点严重 | 校准集需覆盖光照、天气、目标尺度等真实分布 |
| 只看最终 mAP,不看逐层误差 | 知道掉点却不知从哪层开始 | 逐层对比量化前后输出,定位首个显著偏差层 |
| 认为量化后精度必然下降 | 放弃优化,接受低指标 | 合理校准 + 混合精度 + QAT 可接近甚至持平 FP32 |
| 仿真通过就直接量产 | 板端出现数值不一致或性能不达标 | 必须做板端一致性验证与性能实测 |
五、课程学习目标与整体框架
学完本课程,你应当能够独立完成一条从浮点模型到地平线板端可执行模型的量化部署链路,并具备定位与解决精度问题的能力。具体目标包括:
- 理解量化的数学原理与地平线 BPU 的精度特性,能判断一个模型是否适合量化。
- 掌握校准数据的挑选、组织与覆盖度评估方法,能构建有代表性的校准集。
- 掌握逐层精度对比、指标回归、误差归因等评估手段,能定位精度损失来源。
- 熟悉量化编译工具链的关键参数与输出日志,能读懂量化报告。
- 具备板端部署验证与排障能力,能处理仿真与实机不一致的问题。