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 |
性能对比
| 模型 | FP16 | GPTQ-4bit | 精度损失 |
|---|---|---|---|
| LLaMA-7B | 5.68 | 5.72 | 0.7% |
| LLaMA-13B | 5.18 | 5.22 | 0.8% |
| LLaMA-65B | 4.48 | 4.52 | 0.9% |
WikiText2困惑度对比,GPTQ量化精度损失极小。
GPTQ vs AWQ
| 特性 | GPTQ | AWQ |
|---|---|---|
| 量化速度 | 快 | 更快 |
| 精度 | 高 | 略高 |
| 推理速度 | 快 | 更快 |
| 校准数据需求 | 需要 | 需要 |
| 社区支持 | 广泛 | 广泛 |
最佳实践
- 使用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)
----