3、模型量化基础:FP32、FP16、INT8量化原理,对称量化与非对称量化,校准数据集的选择
各位同学,今天我们来聊聊模型量化。
说实话,量化是我在嵌入式部署中遇到坑最多的地方。你想想看,一个好好的大模型,在服务器上跑得风生水起,一搬到嵌入式设备上,内存直接爆掉。这时候,量化就是你的救命稻草。
3.1 为什么需要量化?
先看一组数据。一个 7B 参数的模型,用 FP32 存,需要 28GB 显存。换成 INT8,只要 7GB。这差距,你品,你细品。
嵌入式设备上,内存和算力都有限。量化说白了,就是用更少的比特数来表示模型参数。代价是精度会掉一点,但换来的是体积缩小、速度提升。
核心收益:
- 模型体积缩小 4 倍(FP32 → INT8)
- 推理速度提升 2-4 倍
- 内存带宽需求大幅降低
- 功耗显著下降
3.2 量化原理:从 FP32 到 INT8
量化本质就是一个映射过程。把高精度的浮点数,映射到低精度的整数空间。
3.2.1 FP32 与 FP16
FP32 是单精度浮点数,32 位。FP16 是半精度,16 位。两者都是浮点表示,只是精度不同。
FP16 的量化很简单,直接截断低 16 位就行。我早期做语音模型部署时,试过直接转 FP16,精度几乎没掉。但要注意,有些算子不支持 FP16,得看硬件。
| 数据类型 | 位宽 | 指数位 | 尾数位 | 表示范围 |
|---|---|---|---|---|
| FP32 | 32 | 8 | 23 | ±3.4×10³⁸ |
| FP16 | 16 | 5 | 10 | ±6.5×10⁴ |
| INT8 | 8 | - | - | -128 ~ 127 |
3.2.2 INT8 量化原理
INT8 量化,就是把浮点数映射到 [-128, 127] 这个区间。核心公式就一个:
量化值 = round(浮点值 / 缩放因子) + 零点偏移
反过来,反量化就是:
浮点值 = (量化值 - 零点偏移) × 缩放因子
这里有两个关键参数:缩放因子(scale) 和 零点偏移(zero_point)。怎么算这两个值?这就引出了对称量化和非对称量化。
3.3 对称量化 vs 非对称量化
3.3.1 对称量化
对称量化,零点偏移固定为 0。也就是说,浮点数的 0 映射到 INT8 的 0。
公式简化成:
量化值 = round(浮点值 / 缩放因子)
缩放因子怎么算?取浮点数的绝对值的最大值:
缩放因子 = max(|浮点值|) / 127
我个人的习惯是,对于权重参数,优先用对称量化。因为权重分布通常比较对称,零点偏移为 0 能省掉一次加法运算,推理更快。
小技巧: 对称量化在 ReLU 激活函数后效果不太好。因为 ReLU 输出全是非负数,对称量化会浪费一半的表示范围。
3.3.2 非对称量化
非对称量化,零点偏移可以不为 0。它能更好地匹配数据的实际分布。
缩放因子和零点偏移的计算:
缩放因子 = (浮点最大值 - 浮点最小值) / 255
零点偏移 = round(-浮点最小值 / 缩放因子)
非对称量化更灵活。我在做 NLP 模型时,激活值经常出现偏态分布,非对称量化能保留更多信息。
| 对比项 | 对称量化 | 非对称量化 |
|---|---|---|
| 零点偏移 | 固定为 0 | 可调节 |
| 计算复杂度 | 低 | 高(多一次加法) |
| 适用场景 | 权重、对称分布数据 | 激活值、偏态分布数据 |
| 精度损失 | 分布对称时较小 | 分布偏态时更优 |
3.4 校准数据集的选择
校准数据集,是用来确定量化参数的。说白了,就是拿一小批数据跑一遍模型,统计出每层激活值的分布,然后算出 scale 和 zero_point。
这里有个坑。我曾经用 ImageNet 的验证集做校准,结果模型在特定场景下精度崩了。为什么?因为校准数据分布和实际部署数据分布不一致。
避坑指南: 校准数据集一定要能代表实际部署场景。比如你做车载语音识别,就别拿客厅录的音频做校准。
校准数据集的选择原则:
- 代表性: 覆盖实际场景的各种情况
- 多样性: 包含边缘案例和极端值
- 规模适中: 一般 100-500 张图片或 1000-5000 条文本就够了
- 避免过拟合: 不要用训练集做校准,否则量化参数会偏向训练分布
实际操作中,我一般会准备 3-5 个不同场景的校准集,分别量化后对比精度。选效果最好的那个。
3.5 量化精度评估
量化完,怎么知道精度掉了多少?跑一遍验证集,对比量化前后的指标。
常用的评估指标:
- 准确率差: 量化后准确率 - 原始准确率
- 余弦相似度: 比较每层输出的相似度
- KL 散度: 衡量分布差异
我一般要求准确率下降不超过 1%。如果超过 2%,就得考虑换量化方案了。
3.6 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你可以把它当作量化决策的路线图。
这张图把量化决策的关键要素都列出来了。你实际做项目时,可以对照着选方案。
3.7 实战建议
最后,给几个实战建议:
- 先试 FP16: 如果硬件支持,FP16 是最省心的,精度几乎无损
- 权重用对称,激活用非对称: 这是我试过很多次后的经验
- 校准集别偷懒: 随便拿几张图做校准,后果很严重
- 量化后一定要做精度验证: 别信什么「理论上不掉精度」
嗯,量化这块内容不少,但掌握了这些,你就能在嵌入式平台上把大模型跑起来了。下一节我们聊聊具体的量化工具和框架,到时候手把手带你们操作一遍。
公众号:蓝海资料掘金营,微信deep3321