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 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你可以把它当作量化决策的路线图。

模型量化知识体系 模型量化 量化数据类型 量化策略 校准数据集 FP32 FP16 INT8 对称量化 非对称量化 零点偏移 = 0 零点偏移 ≠ 0 代表性 多样性 规模适中 核心目标:在精度损失可控的前提下, 最大化模型在嵌入式平台上的运行效率

这张图把量化决策的关键要素都列出来了。你实际做项目时,可以对照着选方案。

3.7 实战建议

最后,给几个实战建议:

  • 先试 FP16: 如果硬件支持,FP16 是最省心的,精度几乎无损
  • 权重用对称,激活用非对称: 这是我试过很多次后的经验
  • 校准集别偷懒: 随便拿几张图做校准,后果很严重
  • 量化后一定要做精度验证: 别信什么「理论上不掉精度」

嗯,量化这块内容不少,但掌握了这些,你就能在嵌入式平台上把大模型跑起来了。下一节我们聊聊具体的量化工具和框架,到时候手把手带你们操作一遍。


公众号:蓝海资料掘金营,微信deep3321