1. 量化初探

1.1 从一个让我头疼的项目说起

几年前我接手过一个移动端人脸检测项目。模型在 GPU 上跑得飞快,一放到手机就卡成 PPT。我盯着 200MB 的模型文件发呆——这玩意儿根本塞不进手机内存。

后来我试了剪枝、蒸馏,效果都不理想。直到我尝试了量化——把模型从 FP32 转成 INT8。模型体积直接缩到原来的四分之一,推理速度翻了将近三倍。最关键的是,精度只掉了 0.3%。

嗯,从那天起,我就把量化当成了模型部署的标配。

一句话总结:模型量化就是用更低精度的数值格式(如 INT8)来近似表示高精度模型(如 FP32),从而换取更小的体积和更快的速度。

1.2 什么是模型量化?

量化这个词,说白了就是「压缩」。把连续的值映射到离散的整数上。

在深度学习里,我们训练时用的参数大多是 FP32——每个数占 32 位,约 40 亿个离散值。但推理时,很多场景根本不需要这么高的精度。你想想看,人眼对 256 级灰度就够敏感了,模型对数值的敏感度也没那么夸张。

量化的核心操作就两步:

  1. 确定缩放因子(Scale)和零点(Zero Point)
  2. 把浮点数映射到整数范围

公式其实很简单:

// 量化:浮点数 → 整数
q = round(r / scale) + zero_point

// 反量化:整数 → 浮点数
r = (q - zero_point) × scale

其中 r 是原始浮点数,q 是量化后的整数,scale 和 zero_point 就是我们要算的两个关键参数。

我的习惯:刚开始做量化时,我总喜欢先打印出权重和激活值的分布直方图。看一眼数据范围,心里就有底了。scale 和 zero_point 不是拍脑袋定的,它们完全取决于你的数据分布。

1.3 为什么需要量化?

这个问题我经常被问到。答案其实就三个字:性价比。

咱们直接看数据:

指标 FP32 INT8 收益
模型体积 100 MB 25 MB 缩小 75%
内存占用 高 低 减少 3-4 倍
推理速度(CPU) 慢 快 提升 2-4 倍
功耗 高 低 显著降低
精度损失 基准 通常 < 1% 可接受

你想想看,在边缘设备上,内存和算力都是稀缺资源。量化相当于用 1% 不到的精度损失,换来了 4 倍的速度提升。这笔账怎么算都划算。

我曾经踩过的坑:有一次我急着上线,直接对整个模型做了全局量化。结果某个敏感层精度崩了,整个模型直接废掉。后来我学乖了——先做逐层精度评估,再决定哪些层量化、哪些层保留 FP32。这叫混合精度量化,后面章节会细讲。

1.4 量化的核心思想

量化的本质,我理解就四个字:以整代浮。

为什么整数运算更快?因为 CPU 和 NPU 对整数乘法、加法有专门的硬件加速单元。浮点运算需要额外的指数对齐、尾数运算,慢得多。

量化的核心流程可以画成一张图:

模型量化核心流程 FP32 预训练模型 校准数据集(Calibration) 统计权重 & 激活值分布 计算 Scale & Zero Point INT8 量化模型 关键说明 • 校准集需覆盖真实数据分布 • 常用校准方法:MinMax、KL • 每层独立计算 scale/zp • 量化后需做精度验证

这张图我每次讲量化都会画一遍。你看,整个流程其实不复杂——关键就两步:统计分布和计算参数。但这两步做不好,后面全白搭。

1.5 量化的收益到底有多大?

我直接说几个真实项目里的数字:

  • 模型体积:ResNet-50 从 98MB 降到 25MB,手机端直接下载安装
  • 推理速度:在骁龙 865 上,INT8 比 FP32 快 2.8 倍
  • 功耗:量化后的模型,电池续航提升约 30%
  • 精度:Top-1 准确率从 76.1% 降到 75.8%,只掉了 0.3%

你想想看,如果你的模型要部署到千万台手机上,每台省 30% 的功耗,这是什么概念?

我的建议:不要一上来就追求极致压缩。先做 INT8 量化,看看精度损失。如果损失在 1% 以内,直接上线。如果损失大,再考虑混合精度或量化感知训练。步子迈大了容易扯着蛋。

1.6 量化的分类

量化不是只有一种玩法。根据不同的维度,可以分成几类:

分类维度 类型 说明
量化时机 训练后量化(PTQ) 模型训练完再做量化,简单快速
量化感知训练(QAT) 训练时模拟量化效果,精度更高
量化范围 逐层量化 每层独立计算 scale/zp
逐通道量化 每个卷积核独立量化,更精细
对称性 对称量化 zero_point = 0,适合权重
非对称量化 zero_point ≠ 0,适合激活值

我个人习惯是:先用 PTQ 快速验证可行性,再用 QAT 做精度调优。这样效率最高。

一个小技巧:如果你用的是 PyTorch,可以直接用 torch.quantization 模块。几行代码就能跑通 PTQ。我刚开始学量化时,就是靠这个模块快速上手的。

1.7 量化真的无损吗?

别天真了。量化一定会有精度损失,只是多少的问题。

为什么会损失?因为 INT8 只有 256 个离散值,而 FP32 有约 40 亿个。你把 40 亿个值硬塞进 256 个格子里,肯定会有信息丢失。

但好消息是:深度学习模型对噪声有很强的鲁棒性。你想想看,训练时我们加了那么多数据增强、Dropout,模型早就习惯了各种扰动。量化带来的误差,在模型看来可能只是另一种噪声。

我曾经翻过车:有一次量化一个目标检测模型,精度直接掉了 5%。排查了半天,发现是某个层的激活值分布特别不均匀——大部分值集中在 0 附近,但有几个离群点特别大。MinMax 量化被离群点带偏了,导致有效量化区间浪费了。后来改用 KL 散度校准,精度才恢复正常。

1.8 本章小结

量化不是什么黑科技。说白了就是:用更少的比特,干更多的活。

  • 模型量化把 FP32 转成 INT8,体积缩小 4 倍,速度提升 2-4 倍
  • 核心操作是计算 scale 和 zero_point,然后做映射
  • 精度损失通常在 1% 以内,可以接受
  • PTQ 适合快速验证,QAT 适合精度调优
  • 注意数据分布,别被离群点坑了

嗯,第一章就到这里。量化的大门已经打开了,后面我们会一步步深入——从校准方法到混合精度,从 PTQ 到 QAT,从理论到动手实践。准备好了吗?