GPTQ量化

Accurate Post-Training Quantization for Generative Pre-trained Transformers

概述

GPTQ是一种基于最优脑量化(OBQ)的LLM后训练量化方法。通过逐层量化并考虑层间依赖关系, 能够在极短时间内将模型量化到4-bit,同时保持极小的精度损失。

核心优势:量化速度快(175B模型约4小时),精度损失小,支持多种量化精度。

原理详解

最优脑量化 (OBQ)

GPTQ基于OBQ方法,核心思想是:

  • 逐个量化权重,选择对输出影响最小的顺序
  • 量化每个权重后,更新未量化的权重以补偿误差
  • 使用Hessian矩阵指导量化和更新过程

GPTQ改进

GPTQ对OBQ进行了关键改进:

  • 任意顺序量化:按行顺序量化,而非贪心选择
  • 批量更新:使用Cholesky分解加速Hessian逆计算
  • 数值稳定:添加阻尼因子提高稳定性
  • 高效实现:利用GPU并行加速

量化流程

for each layer:

1. 计算Hessian矩阵 H = 2X^T X

2. for each row:

a. 找到量化误差最小的权重

b. 量化该权重

c. 更新未量化权重补偿误差

3. 保存量化后的权重和缩放因子

使用方法

# 安装AutoGPTQ
pip install auto-gptq

# 量化模型
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from transformers import AutoTokenizer

# 量化配置
quantize_config = BaseQuantizeConfig(
    bits=4,                # 量化位数
    group_size=128,        # 分组大小
    desc_act=True,         # 激活排序(提高精度)
    sym=False,             # 非对称量化
    true_sequential=True,  # 顺序量化
    damp_percent=0.01      # 阻尼系数
)

# 加载模型
model = AutoGPTQForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantize_config
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")

# 准备校准数据
calibration_data = ["sample text 1", "sample text 2", ...]

# 执行量化
model.quantize(calibration_data)

# 保存量化模型
model.save_quantized("./llama-2-7b-gptq")

推理使用

# 加载GPTQ量化模型
from auto_gptq import AutoGPTQForCausalLM
from transformers import AutoTokenizer

model = AutoGPTQForCausalLM.from_quantized(
    "./llama-2-7b-gptq",
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("./llama-2-7b-gptq")

# 推理
inputs = tokenizer("Hello, how are you?", return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(outputs[0]))

# vLLM加载
from vllm import LLM
llm = LLM(model="./llama-2-7b-gptq", quantization="gptq")

参数配置

参数说明推荐值
bits量化位数4
group_size每组权重共享缩放因子128
desc_act激活排序True
sym对称量化False
damp_percent阻尼系数0.01-0.1

性能对比

模型FP16GPTQ-4bit精度损失
LLaMA-7B5.685.720.7%
LLaMA-13B5.185.220.8%
LLaMA-65B4.484.520.9%

WikiText2困惑度对比,GPTQ量化精度损失极小。

GPTQ vs AWQ

特性GPTQAWQ
量化速度更快
精度略高
推理速度更快
校准数据需求需要需要
社区支持广泛广泛

最佳实践

  • 使用group_size=128获得最佳平衡
  • 开启desc_act提高精度
  • 校准数据应覆盖目标任务领域
  • 使用vLLM或TGI获得最佳推理性能
  • 量化后验证目标任务性能

参考资料

  • GPTQ: Accurate Post-Training Quantization (Frantar et al., 2023)
  • AutoGPTQ GitHub Repository
  • Optimal Brain Quantization (Frantar & Alistarh, 2022)
----