一、量化基础概述

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

🔍 重点区分:

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

四、动态量化 vs 静态量化

项目 动态量化 静态量化
是否需要校准数据 ❌ 不需要 ✅ 必需
权重量化 ✅ INT8 ✅ INT8
激活量化 ✅ 实时动态计算 ✅ 静态范围
量化方式 每层每批输入动态计算 min/max 校准阶段固定 scale
速度 略慢(实时计算) 更快(预存参数)
精度 略低(范围不稳定) 更高(精准统计)
适用模型 LSTM、RNN、MLP ResNet、BERT、CNN
支持框架 PyTorch PyTorch / 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 对比总结

维度 QAT PTQ
是否需要重训 ✅ 是 ❌ 否
是否需要校准数据 ❌ 否 ✅ 是
精度损失 ⬇️ 小(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 模块
TensorFlow tf.quantizationTF Lite
TensorRT 支持 INT8 静态量化,需校准
OpenVINO Intel 推荐 E2E 量化工具(支持 QAT)
NNCF Open 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 Quant QAT 的核心操作
QuantStub / DeQuantStub PyTorch 量化辅助模块

附录:参考资源

Logo

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

更多推荐