大模型的量化方法主要分为两个大类:
PTQ 是指在模型 训练完成后,直接对其参数(权重和激活值)进行量化处理,不再参与额外训练。
方面 | 静态量化 | 动态量化 |
---|---|---|
激活值处理 | 使用校准集离线计算参数 | 实时根据输入动态计算 |
精度 | 稍低 | 更高 |
计算开销 | 更低,推理快 | 略高,推理需实时计算 |
应用场景 | 移动端、嵌入式设备等 | LLM、对话系统等复杂模型 |
QAT 是在训练/微调阶段,就引入“伪量化”模块,让模型提前“感知”量化所带来的误差,从而学习对这种误差的鲁棒性。
[Step 1] FP32权重 → 伪量化为INT4 → 前向传播
[Step 2] 模拟量化误差 → 反向传播更新参数
[Step 3] 权重渐渐适应INT4表示 → 精度损失变小
原始训练: FP32 → 推理INT4,性能下降
QAT训练: 模拟INT4 → 模型学会适应INT4 → 精度维持
方法类型 | 是否需要重新训练 | 精度表现 | 实施难度 | 适用位宽 | 典型应用 |
---|---|---|---|---|---|
PTQ(静态) | 否 | 中等 | 简单 | INT8 | 移动端模型压缩 |
PTQ(动态) | 否 | 中上 | 中等 | INT8 | LLM 推理部署 |
QAT | 是 | 最佳 | 较高 | INT4 及以下 | 高端设备、低精度部署 |
PTQ 简单快捷、适合部署,而 QAT 精度更强、适合极低位宽模型的真实上线。
太好了,你现在已经掌握了很多量化基础!那我们来深入讲解 ✅ 6.2 量化感知训练(QAT) 的详细 流程与关键原理,从 动机 到 核心组件,再到 训练细节 和 部署方式,一次讲透
QAT 是在模型训练或微调阶段引入“伪量化(Fake Quantization)”操作,使模型在训练过程中提前**“感知”量化误差**,从而提升其在推理阶段的低精度表现能力(如 INT8、INT4)。
问题 | QAT 解决方案 |
---|---|
PTQ 忽略量化误差,精度下降 | QAT 把误差纳入训练目标 |
INT4/INT2 精度损失太大 | QAT 更鲁棒,更适配低比特部署 |
激活值分布难以建模 | QAT 训练时自动学习出稳定特征 |
┌────────────┐
│ 原始模型(FP32)│
└──────┬─────┘
↓
[Step 1] 注入伪量化模块(FakeQuant)
↓
[Step 2] 前向传播时进行伪量化(模拟INT表示)
↓
[Step 3] 反向传播时仍用FP32计算梯度
↓
[Step 4] 模型学会对量化误差做出“适配性调整”
↓
[Step 5] 训练结束后,导出真实量化模型(INT8/INT4)
在权重(Weight)和激活值(Activation)前后加上伪量化模块(比如 PyTorch 的 FakeQuantize
):
这一步保证前向传播模拟的是推理时真实量化的效果!
举例:原本 FP32 权重为
1.76
,在 INT8 伪量化后变为1.75
,这是训练中的“噪声”
这种技术称为 Straight Through Estimator(STE)
即:量化操作是不可导的,但我们近似地让它“通过”反向传播。
✅ 最终,模型对量化误差不敏感,部署后精度更高!
# PyTorch 示例
import torch
from torch.quantization import QuantStub, DeQuantStub, prepare_qat, convert
class QATModel(torch.nn.Module):
def __init__(self):
super().__init__()
self.quant = QuantStub() # 模拟量化输入
self.fc = torch.nn.Linear(128, 64)
self.relu = torch.nn.ReLU()
self.dequant = DeQuantStub() # 模拟反量化输出
def forward(self, x):
x = self.quant(x)
x = self.fc(x)
x = self.relu(x)
x = self.dequant(x)
return x
# QAT流程
model = QATModel()
model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm') # 指定QAT配置
prepare_qat(model, inplace=True) # 插入伪量化模块
# 开始训练
for epoch in range(epochs):
for batch in data_loader:
output = model(batch)
loss = criterion(output, label)
loss.backward()
optimizer.step()
# 导出量化模型
quantized_model = convert(model.eval(), inplace=False)
场景 | 是否推荐使用 QAT |
---|---|
追求极致精度(INT4/INT2) | ✅ 强烈推荐 |
高端服务器部署 | ✅ 推荐 |
嵌入式设备部署 | ✅ 推荐 |
快速部署、精度容忍高 | ❌ 可用 PTQ 代替 |
内容 | 说明 |
---|---|
核心目标 | 在训练中让模型适应量化误差 |
技术原理 | 前向模拟量化 + 反向FP32梯度更新(STE) |
精度表现 | 通常显著优于 PTQ,尤其在 INT4 以下 |
实施工具 | PyTorch QAT、TensorFlow QAT、HuggingFace Optimum |