一、量化基础概念:什么是模型量化、量化的目的与收益、量化的数学原理
各位同学好,我是你们这门课的主讲。今天咱们正式进入 YOLOv11 模型量化工具链 的学习。第一节课,先把地基打牢——聊聊量化到底是什么,为什么我们要用它,以及它背后的数学逻辑。
说实话,我最早接触量化是在做嵌入式部署的时候。那时候模型跑在 Jetson Nano 上,帧率死活上不去,急得我直挠头。后来导师丢给我一句话:「试试 INT8 量化。」嗯,从那以后,我就再也没离开过这个领域了。
1.1 什么是模型量化?
模型量化,说白了就是把模型里的高精度数值(比如 FP32),用更低精度的数值(比如 INT8)来表示。
你想想看,一个 FP32 的浮点数占 4 个字节,一个 INT8 的整数只占 1 个字节。模型里动辄几千万个参数,这一下子就能省出 75% 的内存空间。
但问题来了——精度降低了,模型还能正常工作吗?
嗯,这就是量化的核心挑战:在精度和效率之间找平衡。
输入:FP32 权重/激活值 → 映射函数 → 输出:INT8 整数
核心思想:用更少的比特位,近似表达原始浮点数值
1.2 量化的目的与收益
我习惯把量化的收益归纳为四个维度。直接看表:
| 维度 | FP32 模型 | INT8 量化模型 | 收益 |
|---|---|---|---|
| 模型体积 | 100 MB | ~25 MB | 减少 75% |
| 内存带宽 | 高 | 低 | 降低 3-4 倍 |
| 推理速度 | 基准 | 2-4 倍加速 | 显著提升 |
| 功耗 | 高 | 低 | 更适合边缘设备 |
我在项目中遇到过最典型的场景:一个 YOLOv11s 模型,FP32 版本在树莓派上只能跑 3 FPS。量化到 INT8 之后,直接飙到 12 FPS。你说这收益大不大?
当然,收益不是白来的。量化会带来一定的精度损失,通常控制在 1%-3% 以内就算合格。后面我们会专门讲怎么校准、怎么补偿。
量化不是「一刀切」。如果你的模型部署在云端服务器,GPU 算力充足,那 FP16 甚至 FP32 完全够用。但如果是手机、摄像头、机器人这些边缘设备——量化几乎是必选项。
1.3 量化的数学原理
好,接下来是硬核部分。别怕,我会用最直白的方式讲清楚。
量化的数学本质,就是一个数值映射问题。我们把一个连续的浮点数范围,映射到离散的整数范围上。
公式长这样:
Q = round( (R - zero_point) / scale )
其中:
- R:原始浮点数值(FP32)
- Q:量化后的整数值(INT8)
- scale:缩放因子,决定每个整数步长代表多少浮点数
- zero_point:零点偏移,保证浮点 0 能精确映射到整数
反过来,反量化公式:
R ≈ Q * scale + zero_point
这里有两个关键概念:对称量化 和 非对称量化。我画了张图,帮你一眼看明白。
1.4 对称量化 vs 非对称量化:怎么选?
这个问题,我当年也纠结过。后来踩了几个坑,总结出几条经验:
- 权重(Weights):通常用对称量化。因为权重分布大致以 0 为中心,正负对称,用对称量化不会浪费整数范围。
- 激活值(Activations):建议用非对称量化。ReLU 之后的激活值全是非负的,用对称量化会浪费一半的整数范围。
- YOLOv11 的实践:我习惯对权重用对称量化,对激活值用非对称量化。这样精度损失最小。
我曾经在一个项目中,对激活值也用了对称量化。结果 mAP 掉了 5 个点,排查了两天才发现是量化方式选错了。记住:激活值用非对称,权重用对称,这是大多数框架的默认配置,也是经过验证的最佳实践。
1.5 量化粒度:逐层 vs 逐通道
除了对称/非对称,还有一个重要概念——量化粒度。
| 粒度 | 描述 | 优点 | 缺点 |
|---|---|---|---|
| 逐层量化 | 整层共享一组 scale 和 zero_point | 计算简单,开销小 | 精度损失较大 |
| 逐通道量化 | 每个输出通道独立一组参数 | 精度更高,适应性强 | 计算稍复杂 |
YOLOv11 的量化工具链默认使用逐通道量化。我个人也推荐这个配置。虽然计算量稍微大一点,但精度收益非常明显。
1.6 本章小结
好,第一节课的内容就到这里。我们快速回顾一下:
- 量化:把 FP32 映射到 INT8,用精度换效率
- 收益:体积缩小 75%,速度提升 2-4 倍,功耗降低
- 对称量化:zero_point=0,适合权重
- 非对称量化:zero_point≠0,适合激活值
- 量化粒度:逐通道优于逐层