一、量化基础概念

1. 什么是模型量化

将模型的高精度参数(FP32/FP16/BF16) 转换为低精度参数(INT8/INT4) 的技术,核心目标:

  • 减少模型显存占用(INT4 比 FP16 小 75%)
  • 提升推理速度、降低算力消耗
  • 保持模型精度尽可能接近原始模型

2. 核心术语

  • PTQ (Post-Training Quantization):训练后量化,无需训练 / 微调,直接对训练好的模型量化
  • QAT (Quantization-Aware Training):量化感知训练,模拟量化噪声训练,精度更高
  • Bit(位宽):常用 8bit、4bit,Transformers 原生优先支持 INT8/INT4
  • Calibration(校准):PTQ 中用少量数据统计参数分布,确定量化阈值
  • Scale/Zeropoint:量化核心参数,用于高精度 ↔ 低精度映射

3. Transformers 原生量化优势

  • 开箱即用,无需复杂代码,一行 API 调用
  • 兼容 Hugging Face 全生态(模型、数据集、Trainer)
  • 支持 GPU/CPU 推理,无缝对接 PEFT、LoRA 等技术
  • 官方维护,稳定性强,适配最新大模型(Llama、Qwen、GLM 等)

二、PTQ(训练后量化)

1. 核心定义

模型训练完成后,直接进行量化,不修改模型权重原始分布,仅做精度转换 + 校准。

2. 特点

✅ 优点:

  • 极速量化(秒级 / 分钟级)
  • 无需训练数据、无需微调
  • 零代码成本,适合快速部署❌ 缺点:
  • 精度损失比 QAT 大(尤其 4bit)
  • 不适合极低比特(2bit 及以下)

3. Transformers 原生支持的 PTQ 算法

算法类型 位宽 核心能力 适用场景
GPTQ 4bit/8bit 按通道量化,精度最优 大模型离线量化、生产部署
AWQ 4bit 激活感知量化,比 GPTQ 更快 主流开源大模型量化
FP8 8bit 硬件原生支持,几乎无精度损失 高端 GPU(H100/A100)
INT8 静态 / 动态量化 8bit CPU/GPU 通用,无依赖 轻量模型、边缘设备

官方推荐优先级:GPTQ > AWQ > INT8 > FP8

4. 原生使用示例(GPTQ 4bit PTQ)

from transformers import AutoModelForCausalLM, AutoTokenizer

# 一行代码加载 4bit PTQ 量化模型
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen-7B-Chat",
    # 核心量化配置
    quantization_config={
        "load_in_4bit": True,          # 4bit 量化
        "bnb_4bit_use_double_quant": True,
        "bnb_4bit_quant_type": "nf4",  # 推荐量化类型
        "bnb_4bit_compute_dtype": "bf16"
    },
    device_map="auto",
    trust_remote_code=True
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-7B-Chat")

# 推理(和原始模型完全一致)
inputs = tokenizer("你好", return_tensors="pt").to("cuda")
print(model.generate(**inputs, max_new_tokens=50))

5. PTQ 关键流程

  1. 加载预训练模型(FP16/BF16)
  2. 传入少量校准数据(GPTQ/AWQ 自动完成)
  3. 计算 Scale/Zeropoint
  4. 权重转换为 INT4/INT8 并保存
  5. 量化模型推理

三、QAT(量化感知训练)

1. 核心定义

训练中模拟量化噪声,让模型适应低精度,是精度最优的量化方案。

2. 特点

✅ 优点:

  • 精度无限接近原始 FP16 模型
  • 支持极低比特稳定推理
  • 结合 LoRA 成本极低❌ 缺点:
  • 需要少量训练数据 + 微调
  • 耗时比 PTQ 长(小时级)

3. Transformers 原生 QAT 能力

  • 完美集成 Trainer 训练框架
  • 支持 GPTQ-AWQ-QAT 混合量化
  • 支持 LoRA+QAT 轻量微调
  • 自动处理量化节点插入、梯度回传

4. 原生使用示例(LoRA + QAT 4bit)

from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig, get_peft_model
import torch

# 1. 加载基础模型 + 4bit 量化
model = AutoModelForCausalLM.from_pretrained(
    "Llama-2-7b-chat-hf",
    quantization_config={"load_in_4bit": True, "bnb_4bit_quant_type": "nf4"},
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("Llama-2-7b-chat-hf")

# 2. 开启 QAT + LoRA
model.quantization_config.qat = True  # 开启量化感知训练
lora_config = LoraConfig(r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, lora_config)

# 3. 训练(标准 Trainer 流程)
training_args = TrainingArguments(
    output_dir="./qat_model",
    per_device_train_batch_size=2,
    num_train_epochs=1,
    learning_rate=1e-4
)

# 4. 训练完成后,模型已适配量化,推理精度大幅提升

5. QAT 关键流程

  1. 初始化量化模型(PTQ 基础上)
  2. 插入伪量化节点(模拟 INT8/4 计算)
  3. 用任务数据微调模型
  4. 模型学习抵消量化误差
  5. 导出纯量化模型,高速推理

四、PTQ vs QAT 全面对比

维度 PTQ QAT
训练需求 ❌ 无需 ✅ 需要少量微调
精度 一般(4bit 有损失) 极高(接近 FP16)
速度 极快(秒级) 较慢(小时级)
代码成本 一行代码 简单训练代码
显存占用 极低 低(LoRA + 量化)
推荐场景 快速部署、测试、边缘设备 生产环境、高要求精度场景
Transformers 支持 ✅ 完全原生 ✅ 原生集成 Trainer

五、Transformers 量化最佳实践

1. 快速部署 → 用 PTQ(GPTQ 4bit)

  • 一行 load_in_4bit=True 搞定
  • 适合 7B~70B 大模型推理

2. 高精度部署 → 用 QAT

  • PTQ 量化 → LoRA+QAT 微调 → 部署
  • 精度损失 < 1%,显存降低 75%

3. 硬件适配

  • CPU / 低端 GPU:INT8 PTQ
  • 中端 GPU:4bit GPTQ PTQ
  • 高端 GPU:4bit QAT / FP8

4. 必开优化

quantization_config = {
    "load_in_4bit": True,
    "bnb_4bit_quant_type": "nf4",    # 最优量化类型
    "bnb_4bit_use_double_quant": True, # 二次量化,提升精度
}

六、总结

  1. PTQ:训练后量化,零训练成本、速度快,适合快速落地
  2. QAT:量化感知训练,精度最高,适合生产环境
  3. Transformers 原生:一行 API 实现量化,兼容全生态
  4. 最佳组合:PTQ 快速量化 + QAT 微调提升精度

关键点回顾

  1. PTQ:无需训练、极速量化、精度一般,适合快速部署
  2. QAT:模拟量化噪声训练、精度极高、适合生产
  3. Transformers 原生支持 GPTQ/AWQ/INT8/FP8,开箱即用
  4. 优先使用 4bit nf4 量化,平衡速度、显存、精度
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐