3. 模型量化基础:从FP32到INT8,量化原理与精度损失分析
好,咱们今天聊聊量化。说实话,这是端侧部署里最核心的一环,没有之一。
我刚开始做端侧优化的时候,总觉得量化就是个「把精度砍一刀」的糙活。直到有一次,我把一个检测模型从FP32硬压到INT8,结果在开发板上跑出来的结果——嗯,画面太美我不敢看。从那以后,我才真正沉下心来研究量化背后的原理。
说白了,量化就是用更少的比特去表示一个数值。FP32用32位,INT8用8位,存储直接缩到四分之一。但代价呢?精度会丢。怎么丢的?丢多少?能不能补回来?这就是我们今天要啃的硬骨头。
3.1 为什么非量化不可?
你想想看,一个BERT-large模型,FP32权重大概1.2GB。手机端侧能扛得住吗?扛不住。量化到INT8,直接降到300MB。不光省存储,推理速度也能翻倍——因为INT8的乘加运算在硬件上比FP32快得多。
我个人的经验是:量化是端侧部署的入场券。不量化,你连跑都跑不起来。
核心收益:
- 模型体积缩小4倍(FP32→INT8)
- 推理速度提升2-4倍(取决于硬件)
- 内存带宽占用降低75%
- 功耗显著下降(少搬数据=少耗电)
3.2 量化原理:从浮点到定点
量化本质是一个映射过程。把FP32的连续值域,映射到INT8的离散值域上。
公式很简单:
Q = round( (x - zero_point) / scale )
反过来,反量化:
x_approx = Q * scale + zero_point
这里有两个关键参数:scale(缩放因子)和 zero_point(零点偏移)。
scale 决定了每个INT8步长代表多少FP32值。zero_point 确保FP32的0能精确映射到INT8的某个值——这个很重要,因为很多网络层里0有特殊意义(比如padding)。
我的小技巧: 实际项目中,我习惯先统计权重和激活值的分布范围,再决定scale和zero_point。如果分布有长尾,直接min-max映射会浪费大量量化精度。这时候我会用「截断法」——把两端极端值砍掉,让量化步长更精细。
3.3 对称量化 vs 非对称量化
这里有个选择题:对称还是非对称?
| 类型 | zero_point | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 对称量化 | 固定为0 | 权重(通常对称分布) | 计算简单,硬件友好 | 对偏态分布不友好 |
| 非对称量化 | 可调 | 激活值(通常偏态分布) | 更充分利用INT8值域 | 计算稍复杂 |
我在项目中遇到过这样的情况:ReLU后的激活值全是非负的,如果用对称量化,INT8的负半区全浪费了。这时候非对称量化能把[-128, 127]全部映射到[0, 正无穷),精度明显提升。
3.4 精度损失从哪来?
量化一定会丢精度,但丢在哪?我总结了三个主要来源:
- 截断误差:超出量化范围的数值被硬砍掉。比如FP32里有个3.14,但INT8最大只能表示2.0,那1.14就丢了。
- 舍入误差:round操作带来的信息损失。比如2.3量化成2,0.3就没了。
- 梯度误差:反向传播时,量化函数的梯度几乎处处为0,导致训练无法正常进行。这就是为什么量化感知训练(QAT)要用直通估计器(STE)来近似梯度。
曾经踩过的坑: 有一次我量化一个轻量级模型,精度掉了8个点。排查了半天,发现是某个层的激活值分布特别宽,scale设得太大,导致大部分值都被截断了。后来改用逐通道量化(per-channel quantization),精度只掉了1.2个点。所以——别偷懒用逐层量化,能逐通道就逐通道。
3.5 量化方法对比:PTQ vs QAT
目前主流就两条路:训练后量化(PTQ)和量化感知训练(QAT)。
PTQ:模型训练完,直接拿一批校准数据跑一遍,统计出scale和zero_point。快,但精度损失大。
QAT:在训练过程中模拟量化效果,让模型自己学会适应量化误差。慢,但精度高。
我个人的建议是:
- 大模型(>100M参数)优先PTQ,因为QAT训练成本太高
- 小模型或精度敏感场景,老老实实上QAT
- 实在不行,先PTQ再微调几轮,效果往往不错
3.6 量化精度评估:怎么才算「够用」?
量化后的模型,精度掉多少算正常?
没有标准答案。但我有个经验法则:
- 分类任务:Top-1精度掉 < 1% 算优秀,< 3% 可接受
- 检测任务:mAP掉 < 2% 算不错,< 5% 还能忍
- 分割任务:mIoU掉 < 3% 算正常
当然,具体还得看业务容忍度。有些场景(比如工业质检),掉0.5%就是灾难。
避坑指南: 评估量化精度时,别只看最终指标。我习惯逐层对比FP32和INT8的输出余弦相似度。如果某层相似度低于0.99,那这层就是精度瓶颈。针对性地调一下这层的量化参数,往往事半功倍。
3.7 知识体系总览
下面这张图,是我梳理的量化知识体系。建议你保存下来,遇到问题先对着图定位。
量化这条路,说难不难,说简单也不简单。核心就三件事:理解映射关系、选对量化策略、精准评估损失。把这三点吃透了,端侧部署就成功了一半。
嗯,今天就先聊到这。量化是个实操活,光看理论没用,建议你找个模型动手试试。从PTQ开始,感受一下精度变化,再慢慢调参数。相信我,踩过几个坑之后,你就再也不会觉得量化是「玄学」了。
公众号:蓝海资料掘金营,微信deep3321