GPTQ(Generative Pre-trained Transformer Quantization)是一种训练后量化方法,可将大语言模型压缩至 4 位,同时尽量保持精度。它使用分组量化(group-wise quantization)技术,借助 Hessian 信息最小化量化误差。
用途
GPTQ 适用于以下场景:
- 需要在有限 GPU 显存中容纳大模型(70B 及以上)。
- 希望获得约 4 倍显存降低,且精度损失低于 2%。
- 在消费级 GPU(RTX 4090、3090)上部署模型。
- 需要更快的推理速度(相比 FP16 提升 3-4 倍)。
在以下情况可考虑替代方案:
- 需要略好的精度(损失低于 1%)、拥有较新 GPU(Ampere、Ada)或需要 Marlin 内核支持时,可考虑 AWQ。
- 需要与 transformers 简单集成、希望使用 8 位量化(压缩较少但质量更好)或不需要预量化模型文件时,可考虑 bitsandbytes。
主要能力
- 分组量化:将每个权重矩阵划分为若干组(通常每组 128 个元素),每组拥有自己的 scale 和 zero-point,从而在 4 位权重下接近 FP16 精度。
- 量化配置:通过 BaseQuantizeConfig 可设置 bits(如 4 位或 3 位)、group_size(如 32、128、256、1024 或 -1)、desc_act(激活顺序)、damp_percent(阻尼因子)等参数,在模型大小、精度和速度之间权衡。
- 内核后端:支持 ExLlamaV2(默认,最快)、Marlin(Ampere 及以上 GPU,A100/H100 上约 2 倍加速)、Triton(仅 Linux)以及 CUDA 后端。
- 与 transformers 集成:transformers 可自动检测 GPTQ 模型并直接加载使用。
- QLoRA 微调:可结合 PEFT 对 GPTQ 模型进行 LoRA 微调,实现显存高效的训练。
- 多 GPU 部署与 CPU 卸载:支持自动或手动 device_map,可将部分层卸载到 CPU 以运行超大模型。
- 批量推理:支持同时处理多个提示。
使用方式
安装 AutoGPTQ:
pip install auto-gptq
# 带 Triton(仅 Linux,更快)
pip install auto-gptq[triton]
# 带 CUDA 扩展(更快)
pip install auto-gptq --no-build-isolation
# 完整安装
pip install auto-gptq transformers accelerate
加载预量化模型:
from transformers import AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM
model_name = "TheBloke/Llama-2-7B-Chat-GPTQ"
model = AutoGPTQForCausalLM.from_quantized(
model_name,
device="cuda:0",
use_triton=False
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = "Explain quantum computing"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda:0")
outputs = model.generate(**inputs, max_new_tokens=200)
print(tokenizer.decode(outputs[0]))
自行量化模型:
from transformers import AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from datasets import load_dataset
model_name = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)
quantize_config = BaseQuantizeConfig(
bits=4,
group_size=128,
desc_act=False,
damp_percent=0.01
)
model = AutoGPTQForCausalLM.from_pretrained(
model_name,
quantize_config=quantize_config
)
dataset = load_dataset("c4", split="train", streaming=True)
calibration_data = [
tokenizer(example["text"])["input_ids"][:512]
for example in dataset.take(128)
]
model.quantize(calibration_data)
model.save_quantized("llama-2-7b-gptq")
tokenizer.save_pretrained("llama-2-7b-gptq")
model.push_to_hub("username/llama-2-7b-gptq")
适用场景
- 在单张 A100 80GB 上运行 70B 模型(FP16 需要 2 张 A100)。
- 在 3 张 A100 80GB 上运行 405B 模型(FP16 需要 11 张 A100)。
- 在 RTX 4090 24GB 上运行 13B 模型(FP16 会显存不足)。
- 需要更快推理速度的部署场景。
限制
- 量化会带来一定精度损失,具体程度取决于配置(如 4 位 group_size=128 时 WikiText-2 困惑度约增加 1.5%)。
- 不同内核后端有硬件与系统要求:Marlin 需要 NVIDIA Ampere 或更新架构(计算能力 ≥ 8.0);Triton 仅支持 Linux。
- 部分配置(如 desc_act=True)会降低速度。
- 关于收费、价格、平台支持范围等更多信息,资料中暂未提供。