4、训练后量化(PTQ)入门:PTQ原理、校准数据集、PTQ vs QAT 对比
好,咱们今天聊聊训练后量化,也就是 PTQ。
说实话,PTQ 是我在实际项目中用得最多的量化方式。为什么?因为它快,而且够用。你想想看,一个已经训好的模型,你不想再花几天甚至几周去重新训练它。PTQ 就是干这个的——拿来即用,几乎零成本。
4.1 PTQ 的核心原理
PTQ 的原理其实不复杂。说白了,就是拿一小部分数据,跑一遍推理,统计出每一层激活值的分布。然后根据这个分布,算出最佳的缩放因子和零点偏移。
我习惯把 PTQ 分成三步:
- 收集统计量——用校准数据跑一遍前向,记录每层的 min/max 或直方图
- 计算量化参数——根据统计量算出 scale 和 zero_point
- 替换算子——把浮点算子替换成量化算子,生成量化模型
嗯,这里要注意一点:PTQ 只做前向,不做反向传播。所以它不会改变模型的权重,只是把权重和激活值从 FP32 映射到 INT8。
核心公式(对称量化):
scale = max(|x_min|, |x_max|) / 127
x_int8 = round(x_fp32 / scale)
就这么简单。但实际工程中,你还要考虑截断、校准方法的选择,这些才是坑。
4.2 校准数据集——PTQ 的命门
校准数据集选不好,PTQ 基本就废了。我在项目中遇到过这种情况:用验证集做校准,量化后精度掉了 2%。换成训练集的一小部分,精度只掉了 0.3%。
为什么会这样?因为校准数据集要能代表模型在真实场景下的输入分布。你拿猫狗分类的模型,校准数据里全是猫,那量化后遇到狗就崩了。
我个人习惯的做法:
- 从训练集中随机抽取 500~2000 张,覆盖所有类别
- 确保数据多样性——光照、角度、背景都要有变化
- 不要用验证集做校准——验证集是用来评估的,用了就泄露了
- batch size 不要太大——我一般设 16 或 32,太大容易让统计量偏
小技巧:如果你不确定校准数据够不够,可以跑两次 PTQ,每次用不同的随机子集。如果两次量化后的精度差不多,说明数据量够了。如果差很多,那就再加数据。
4.3 PTQ vs QAT 对比
很多同学问我:到底该用 PTQ 还是 QAT?
我的回答是:先试 PTQ,不行再上 QAT。你想想看,PTQ 几分钟就搞定了,QAT 要重新训一遍模型。时间成本差了两个数量级。
下面这张表是我自己总结的,你可以参考:
| 对比维度 | PTQ | QAT |
|---|---|---|
| 是否需要训练 | 不需要 | 需要(微调或重训) |
| 耗时 | 几分钟 | 几小时到几天 |
| 精度损失 | 通常 0.5%~2% | 通常 <0.5% |
| 适用场景 | 大模型、快速部署 | 精度敏感、小模型 |
| 实现难度 | 低(调 API 即可) | 高(需要改训练代码) |
| 硬件适配 | 通用 | 需要模拟量化算子 |
我曾经在一个目标检测项目里,PTQ 后 mAP 掉了 1.8%。客户要求不能超过 1%。没办法,只能上 QAT。结果 QAT 训了 3 天,精度只掉了 0.3%。但说实话,如果当时我多花点心思调校准数据,也许 PTQ 就够了。
避坑指南:我曾经犯过一个错误——在 PTQ 之后直接部署,没做精度验证。结果模型在线上跑了一周,召回率掉了 5%。后来才发现,校准数据里缺少了夜间场景。所以,一定要用独立的测试集做量化后精度验证。
4.4 知识体系图
下面这张图帮你理清 PTQ 的核心逻辑:
4.5 实战建议
最后,给你几个我踩过坑后的建议:
- 先跑 PTQ,再决定要不要 QAT——别一上来就搞 QAT,浪费时间
- 校准数据一定要有代表性——我吃过亏,你记住就行
- 量化后一定要做精度验证——用独立的测试集,别偷懒
- 如果精度掉太多,先调校准方法——比如从 min-max 换成 KL 散度,或者 percentile
PTQ 这东西,说白了就是「用少量数据换大量加速」。你只要把校准数据选好,精度损失完全可以控制在 1% 以内。我见过很多项目,PTQ 后推理速度翻了 2~3 倍,精度只掉了 0.5%。这买卖,划算。
我的个人习惯:每次做 PTQ,我都会先跑一个「快速验证」——只用 100 张校准数据,看看精度掉多少。如果掉得不多,再加大校准数据量做最终版。这样能快速排除明显不行的方案。
好了,PTQ 的核心内容就这些。记住一句话:能用 PTQ 解决的问题,别上 QAT。省下来的时间,喝杯咖啡不香吗?