一、量化基础概述

1.1 什么是模型量化?

模型量化(Model Quantization) 是将深度学习模型中的高精度浮点参数(如FP32)转换为低精度整数(如INT8)的技术,以减少模型大小、提升推理速度、降低功耗。

  • 目标:在保留精度的前提下,实现模型轻量化。
  • 常见量化格式:
    • INT8:8位整数(0~255)
    • INT4:4位整数
    • FP16:半精度浮点
    • BF16:宽浮点(更稳定)

🌟 量化的优势:

  • 模型体积缩小 4 倍(FP32 → INT8)
  • 推理速度提升 2~4 倍
  • 节省内存,支持边缘设备部署(手机、NPU、MCU)

二、量化分类与策略

2.1 按训练阶段分类

类型简称是否需要重新训练是否需要训练数据说明
后训练量化PTQ❌ 否✅ 仅校准推荐部署快
量化感知训练QAT✅ 是✅ 有效果更好
端到端优化E2E✅ 是✅ 有结合剪枝、蒸馏等

✅ QAT 更适合:复杂模型、高精度要求
❌ PTQ 更适合:快速部署、轻量模型


2.2 按量化粒度分类

类型说明适用场景
逐权重量化(Weight-only)权重量化,激活不变简单模型
权重+激活量化双方量化复杂模型(CNN、Transformer)
混合精度量化不同层不同精度(如INT8 + FP16)大模型、边缘端
动态/静态量化见下文推荐结合使用

三、后训练量化(PTQ)

3.1 定义

在 模型训练完成后,直接进行量化,无需重新训练,仅利用少量校准数据统计激活分布。

3.2 核心流程

FP32模型
量化策略
选择量化方式
调用校准数据
收集激活统计信息
生成量化参数
权重&激活量化
生成INT8模型

3.3 PTQ 的两种主要方式

类型特点是否需校准适用场景
静态量化预先校准,参数固定✅ 是CNN / Transformer
动态量化激活实时量化,无校准❌ 否LSTM / MLP

🔍 重点区分:

  • 静态量化:离线校准,模型部署前确定 scale 和 zero_point
  • 动态量化:运行时计算范围,每次前向重新量化

四、动态量化 vs 静态量化

项目动态量化静态量化
是否需要校准数据❌ 不需要✅ 必需
权重量化✅ INT8✅ INT8
激活量化✅ 实时动态计算✅ 静态范围
量化方式每层每批输入动态计算 min/max校准阶段固定 scale
速度略慢(实时计算)更快(预存参数)
精度略低(范围不稳定)更高(精准统计)
适用模型LSTM、RNN、MLPResNet、BERT、CNN
支持框架PyTorchPyTorch / TensorFlow / TensorRT
推荐函数quantize_dynamic()prepare() + convert()

✅ 框架支持示例:

  • PyTorch:torch.quantization.quantize_dynamic
  • TensorFlow:tf.quantization.quantize
  • TensorRT:仅支持静态量化

五、量化感知训练(QAT)

5.1 定义

QAT(Quantization-Aware Training) 是在模型训练过程中模拟量化操作,使模型“提前适应”量化带来的数值误差。

5.2 核心机制:Fake Quantization(伪量化)

在训练时,对权重和激活添加“虚拟量化”操作,模拟真实 INT8 量化,但梯度可导(使用 STO:直通估计器)。

class FakeQuant(torch.autograd.Function):
    @staticmethod
    def forward(ctx, x):
        # 模拟量化:x → INT8 → 反量化
        return scale * round(x / scale)
  
    @staticmethod
    def backward(ctx, grad):
        # 梯度不经过量化,直接返回
        return grad

5.3 QAT 流程(PyTorch 示例)

model = MyModel()
model.quant = QuantStub()
model.dequant = DeQuantStub()

# 设置量化配置
model.qconfig = torch.quantization.get_default_qconfig('fbgemm')
torch.quantization.prepare(model, inplace=True)

# 训练:假“量化的前向传播”
for data, target in train_loader:
    output = model(data)
    loss = criterion(output, target)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

# 转换为真实量化模型
torch.quantization.convert(model, inplace=True)

🧠 注意:没有伪量化 ⛔ 无法训练 QAT 模型!


5.4 QAT 与 PTQ 对比总结

维度QATPTQ
是否需要重训✅ 是❌ 否
是否需要校准数据❌ 否✅ 是
精度损失⬇️ 小(0.3~1%)⬆️ 大(1~5%)
训练成本高(1~2倍时间)低
部署复杂度高低
适用场景BERT / ResNet / 大模型LSTM / 轻量模型

✅ QAT 适用场景:

  • 模型架构复杂(如Transformer)
  • 精度损失容忍度低
  • 需要部署到:TensorRT、OpenVINO、NPU

六、量化关键技术

6.1 量化方式

类型说明
均匀量化(Uniform Quantization)按等间距划分范围(线性分布)
非均匀量化(Non-uniform)使用分段线性逼近(如KL散度优化)
对称量化对称于0(如[-128,127])
非对称量化范围不受对称限制(如[0,255])

✅ 常用:非对称量化(避免零点偏移)


6.2 量化参数计算

模型量化公式说明
Scale = $ \frac{x_{\max} - x_{\min}}{Q_{\max} - Q_{\min}} $缩放因子
Zero_point = $ -\frac{x_{\min}}{scale} $零点(定点偏移)
Quantized value = $ \text{round}(x / \text{scale} + \text{zero_point}) $整数表示

✅ 作用:将浮点数 $ x \in [x_{\min}, x_{\max}] $ 映射到整数 [ Q min ⁡ , Q max ⁡ ] [Q_{\min}, Q_{\max}] [Qmin​,Qmax​]


6.3 进阶技术

技术说明
Per-channel 量化卷积层每个通道独立量化,更准
混合精度量化有些层用 INT8,有些用 FP16
渐进式量化从 FP32 → FP16 → INT8,逐步逼近
二值化/三值化极端压缩(如BNN)

七、典型模型与工程选择建议

模型推荐量化方式原因
LSTM / RNN✅ 动态量化激活稳定,无需校准
ResNet / CNN✅ 静态量化高精度要求,校准可靠
BERT / Transformers✅ QAT + 静态量化非常敏感于精度损失
MobileNet / YOLO✅ PTQ(静态)推荐均衡速度/精度
自定义结构✅ 混合策略如 Linear 用动态,Conv 用静态

八、部署与工具链推荐

工具说明
PyTorch完整支持 PTQ / QAT,torch.quantization 模块
TensorFlowtf.quantization 与 TF Lite
TensorRT支持 INT8 静态量化,需校准
OpenVINOIntel 推荐 E2E 量化工具(支持 QAT)
NNCFOpen source 量化框架(PyTorch/TensorFlow)

🛠️ 推荐流程:

  1. 使用 PyTorch 训练模型
  2. 使用 QAT / PTQ 量化
  3. 转换为 ONNX / TensorRT / OpenVINO
  4. 部署到目标设备

九、常见问题(FAQ)

问题回答
❓ QAT 需要重新训练吗?✅ 是,必须重新训练
❓ 只做权重量化可以吗?✅ 可以,但激活不量化会降低效果
❓ 动态量化能否用于卷积?❌ 不建议,TensorRT 不支持,精度也下降
❓ 如何判断是否需 QAT?看 PTQ 后精度下降 >1% → 用 QAT
❓ 量化会增加训练时间吗?✅ 是,QAT 比 FP32 慢 1~2 倍

十、总结与学习建议

🧩 量化核心思路

“让模型在高精度训练中学会在低精度下工作!”
—— QAT 是关键,PTQ 是基础

📚 学习路线图

  1. ✅ 掌握 FP32 模型训练
  2. ✅ 理解量化原理(缩放、零点、范围)
  3. ✅ 实现 PTQ(静态 + 动态)
  4. ✅ 实践 QAT(Fake Quant)
  5. ✅ 对比精度与速度
  6. ✅ 部署到边端设备

🎯 重点记忆点

术语含义
PTQ训练完成后直接量化,无需重训
QAT训练时模拟量化,提升精度
静态量化需要校准,参数固定
动态量化不需要校准,实时计算
Fake QuantQAT 的核心操作
QuantStub / DeQuantStubPyTorch 量化辅助模块

附录:参考资源

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐