SuperAPI AI 工具集

gptq

智能体与模型

查看项目

更新于 10-15 13:07

技能介绍

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)会降低速度。
  • 关于收费、价格、平台支持范围等更多信息,资料中暂未提供。