结论:80%模型体积缩减不可稳定达成,实际压缩率通常为65%–75%;pytorch静态量化必须校准,否则精度严重下降,且需匹配backend并验证dtype与op类型。

直接说结论:用 torch.quantization 或 tf.lite.TFLiteConverter 做训练后量化(PTQ),80% 的模型体积缩减能稳定达成,前提是校准数据有代表性、硬件后端匹配。
PyTorch 静态量化必须做校准,否则精度崩得很快
静态量化依赖representative_dataset 估算激活值分布,没这步就直接 convert(),模型会跑出完全错误的输出。
- 校准数据不需要标签,但必须覆盖真实推理场景的输入范围(比如图像分类就用一批典型测试图,不是随机噪声)
- 数据量不用多,50–100 张图通常够用;太少会导致 scale/zp 计算失真
- 必须用和部署环境一致的 backend:CPU 上用 'fbgemm',ARM 设备上可能得切到 'qnnpack'
- 示例关键链路:model.qconfig = get_default_qconfig('fbgemm') → prepare() → 跑校准数据 → convert()TensorFlow Lite 的 Optimize.DEFAULT 不等于全量化
只设 converter.optimizations = [tf.lite.Optimize.DEFAULT],默认只做权重压缩(比如 float32 → float16),不会生成 int8 模型。
- 要真正进 INT8,必须显式加三行:
converter.representative_dataset = representative_data_genconverter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8]converter.inference_input_type = tf.int8(输出同理)
- representative_data_gen 必须是可迭代的 generator,返回 shape 匹配的 tf.Tensor,不能是 list 或 numpy array 直接塞进去
- 错误写法:converter.representative_dataset = calib_data(列表)→ 运行时报 TypeError: 'list' object is not callable量化后模型体积没变小?先检查 backend 和导出格式
常见假阴性原因: - PyTorch 导出的是torch.jit.script 或 torch.jit.trace 模型,没走 torch.quantization.convert(),实际还是 float32 权重
- TensorFlow 中用了 from_keras_model() 却没关 eager mode,某些层会跳过量化节点插入
- TFLite 模型用 netron 打开一看,Op 类型全是 CONV_2D 而不是 CONV_2D_INT8,说明量化没生效
- PyTorch 的 torch.quantization.convert() 后,用 print(next(model.parameters()).dtype) 确认是否变成 torch.qint8真正卡住的地方不在代码行数,而在校准数据是否“像真实输入”、backend 是否启用、以及导出后有没有验证 dtype 和 op 类型——这三个点漏掉任何一个,量化都只是看起来跑通了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











