一、量化初探:什么是模型量化?为什么需要量化?
1.1 从一个让我头疼的项目说起
几年前我接手过一个移动端人脸检测项目。模型在 GPU 上跑得飞快,一放到手机就卡成 PPT。我盯着 200MB 的模型文件发呆——这玩意儿根本塞不进手机内存。
后来我试了剪枝、蒸馏,效果都不理想。直到我尝试了量化——把模型从 FP32 转成 INT8。模型体积直接缩到原来的四分之一,推理速度翻了将近三倍。最关键的是,精度只掉了 0.3%。
嗯,从那天起,我就把量化当成了模型部署的标配。
一句话总结:模型量化就是用更低精度的数值格式(如 INT8)来近似表示高精度模型(如 FP32),从而换取更小的体积和更快的速度。
1.2 什么是模型量化?
量化这个词,说白了就是「压缩」。把连续的值映射到离散的整数上。
在深度学习里,我们训练时用的参数大多是 FP32——每个数占 32 位,约 40 亿个离散值。但推理时,很多场景根本不需要这么高的精度。你想想看,人眼对 256 级灰度就够敏感了,模型对数值的敏感度也没那么夸张。
量化的核心操作就两步:
- 确定缩放因子(Scale)和零点(Zero Point)
- 把浮点数映射到整数范围
公式其实很简单:
// 量化:浮点数 → 整数
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 对整数乘法、加法有专门的硬件加速单元。浮点运算需要额外的指数对齐、尾数运算,慢得多。
量化的核心流程可以画成一张图:
这张图我每次讲量化都会画一遍。你看,整个流程其实不复杂——关键就两步:统计分布和计算参数。但这两步做不好,后面全白搭。
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,从理论到动手实践。准备好了吗?