2、模型量化基础:从FP32到INT8,原理与精度损失分析
聊到推理加速,量化是绕不开的一步。说白了,就是把模型里那些占地方的FP32参数,换成更紧凑的INT8。我刚开始接触这玩意儿的时候,也觉得不就是精度降一降嘛,能有多大区别?后来在一条手机盖板检测线上栽了跟头——量化后模型跑得快了,但划痕漏检率直接翻倍。嗯,从那以后我才老老实实把量化原理啃透。
2.1 为什么要做量化?
工业缺陷检测的场景很现实:产线节拍要求每张图50ms内出结果,工控机预算就那么多,GPU还经常缺货。FP32模型在边缘设备上跑,要么显存爆了,要么延迟超标。
量化的核心收益就两条:
- 体积缩小4倍:模型从FP32变成INT8,存储和带宽压力骤降。
- 计算加速2~4倍:INT8的乘加运算在专用硬件(如TensorRT、Tengine)上比FP32快得多。
我个人的习惯是,只要目标设备支持INT8指令集,就优先尝试量化。哪怕精度掉1~2个点,通过后续的校准和微调,大部分场景都能拉回来。
2.2 量化原理:从FP32到INT8的映射
量化的数学本质很简单——就是一个线性映射。把FP32的数值范围压缩到INT8的[-128, 127]区间。
公式长这样:
INT8值 = round(FP32值 / 缩放因子) + 零点偏移
反过来,推理时再还原:
FP32近似值 = (INT8值 - 零点偏移) × 缩放因子
这里有两个关键参数:
- 缩放因子(Scale):决定了映射的步长。步长越小,精度损失越小,但INT8能表示的范围也越小。
- 零点偏移(Zero Point):用来对齐FP32的零点。比如ReLU后的激活值全是非负的,零点偏移可以把INT8的0映射到FP32的0。
我在项目中遇到过最坑的情况是:某个卷积层的权重分布特别宽,有±10,但大部分值集中在±0.1附近。直接用全局最大最小值算缩放因子,结果小值全被量化成了0,精度直接崩了。后来改用百分位裁剪,才稳住。
2.3 量化方式:对称 vs 非对称
实际工程里,量化方式主要分两种。我列个表,方便你对比:
| 对比项 | 对称量化 | 非对称量化 |
|---|---|---|
| 零点偏移 | 固定为0 | 可调节 |
| 适用场景 | 权重(分布对称) | 激活值(分布偏斜) |
| 计算复杂度 | 低 | 略高 |
| 精度损失 | 分布不对称时较大 | 更灵活,损失更小 |
我个人习惯:权重用对称量化,激活值用非对称量化。这样既保证了计算效率,又减少了精度损失。
2.4 精度损失分析:到底丢在哪?
量化不是无损的。精度损失主要来自三个环节:
- 截断误差:FP32的数值范围比INT8大得多,超出INT8范围的值会被截断。比如权重里有个3.5,INT8最大只能表示到127,如果缩放因子设得小,3.5可能被截成127,误差就大了。
- 舍入误差:映射时的小数部分被舍去。比如1.3量化成1,0.3的信息就丢了。这种误差在深层网络里会累积。
- 分布偏移:量化后的数值分布和原始分布不一致。尤其是激活值,经过ReLU后分布偏斜,非对称量化能缓解,但不能完全消除。
你想想看,一个100层的网络,每层丢0.1%的精度,累积下来就是10%。这就是为什么有些模型量化后直接废了。
2.5 量化粒度:逐层 vs 逐通道
量化粒度决定了每个缩放因子的作用范围。粒度越细,精度越高,但计算开销也越大。
- 逐层量化(Per-Tensor):整个张量共用一个缩放因子。实现简单,但精度损失大。适合对精度不敏感的场景。
- 逐通道量化(Per-Channel):每个输出通道独立计算缩放因子。精度更高,尤其适合卷积层。我推荐在权重上使用逐通道量化。
- 逐组量化(Per-Group):把通道分成若干组,每组一个缩放因子。精度和计算量的折中方案,用得不多。
我在做玻璃缺陷检测模型时,试过逐层量化,结果精度掉了2.3%。换成逐通道量化后,只掉了0.4%。所以,别省那点计算量,逐通道量化是工业场景的标配。
2.6 量化流程:校准与微调
量化不是直接转换就完事了。标准流程分三步:
- 校准(Calibration):用一小批真实数据跑一遍FP32模型,统计每层激活值的分布,确定缩放因子和零点偏移。数据量不用大,几百张图就够了。
- 量化转换:根据校准结果,把权重和激活值转成INT8。
- 微调(QAT):如果精度损失超标,就用量化感知训练(Quantization-Aware Training)微调几轮。在训练时模拟量化误差,让模型自己适应。
我个人习惯:先做校准,精度损失在1%以内就直接用。超过1%就上QAT,一般微调5~10个epoch就能拉回来。
2.7 量化效果对比:一个真实案例
拿我之前做的一个金属表面缺陷检测模型来说:
| 指标 | FP32 | INT8(逐层) | INT8(逐通道+QAT) |
|---|---|---|---|
| 模型大小 | 120 MB | 30 MB | 30 MB |
| 推理延迟 | 45 ms | 18 ms | 20 ms |
| mAP@0.5 | 92.3% | 89.7% | 91.8% |
你看,逐层量化掉了2.6个点,但加上逐通道和QAT,只掉了0.5个点。而推理延迟从45ms降到了20ms,产线节拍完全能跑满。
2.8 量化知识体系总览
下面这张图把量化的核心逻辑串起来了,方便你理解整体脉络:
从FP32到INT8,核心就是找到合适的映射参数。校准数据选对了,精度损失就能控住。如果还不行,就上QAT微调。这套流程我在三条产线上验证过,效果稳定。