mcpField
G
gptq

gptq

github.com/orchestra-research开发14.1k958 次安装19 周前更新
代码仓库

关于 gptq

GPTQ 是一种面向 LLM 的训练后量化方法,可将权重量化到低比特表示,以减少模型占用并支持推理部署。它适合需要在有限 GPU 显存中运行模型的开发者,并提供分组量化配置及多种推理内核选项。

主要功能

  1. 01训练后权重量化
  2. 02支持 4-bit 与 3-bit 配置
  3. 03按组设置量化参数
  4. 04ExLlamaV2、Marlin 与 Triton 内核
  5. 05加载预量化模型

适用场景

  1. 01在显存有限的 GPU 上部署大型模型
  2. 02量化模型以减少显存占用
  3. 03为推理选择不同量化内核

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/orchestra-research/ai-research-skills --skill gptq

安装后在 Claude Code 中输入/gptq确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
calibration.md
integration.md
troubleshooting.md

详细介绍

GPTQ(生成式预训练 Transformer 量化)

训练后量化方法,通过分组量化将大模型压缩至 4 bit,同时最大限度减少精度损失。

何时使用 GPTQ

在以下情况下使用 GPTQ:

  • 需要在有限的 GPU 内存中运行大型模型(70B 及以上)
  • 希望将内存占用降低 4 倍,同时精度损失小于 2%
  • 在消费级 GPU(RTX 4090、3090)上部署
  • 需要更快的推理速度(相比 FP16 提速 3~4 倍)

在以下情况下改用 AWQ:

  • 需要略高的精度(损失小于 1%)
  • 使用较新的 GPU(Ampere、Ada)
  • 希望支持 Marlin 内核(部分 GPU 上速度提升 2 倍)

在以下情况下改用 bitsandbytes:

  • 需要与 transformers 简单集成
  • 希望进行 8 bit 量化(压缩率较低,质量较好)
  • 不需要预量化的模型文件

快速开始

安装
# Install AutoGPTQ
pip install auto-gptq

# With Triton (Linux only, faster)
pip install auto-gptq[triton]

# With CUDA extensions (faster)
pip install auto-gptq --no-build-isolation

# Full installation
pip install auto-gptq transformers accelerate
加载预量化模型
from transformers import AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM

# Load quantized model from HuggingFace
model_name = "TheBloke/Llama-2-7B-Chat-GPTQ"

model = AutoGPTQForCausalLM.from_quantized(
    model_name,
    device="cuda:0",
    use_triton=False  # Set True on Linux for speed
)

tokenizer = AutoTokenizer.from_pretrained(model_name)

# Generate
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

# Load model
model_name = "meta-llama/Llama-2-7b-chat-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name)

# Quantization config
quantize_config = BaseQuantizeConfig(
    bits=4,              # 4-bit quantization
    group_size=128,      # Group size (recommended: 128)
    desc_act=False,      # Activation order (False for CUDA kernel)
    damp_percent=0.01    # Dampening factor
)

# Load model for quantization
model = AutoGPTQForCausalLM.from_pretrained(
    model_name,
    quantize_config=quantize_config
)

# Prepare calibration data
dataset = load_dataset("c4", split="train", streaming=True)
calibration_data = [
    tokenizer(example["text"])["input_ids"][:512]
    for example in dataset.take(128)
]

# Quantize
model.quantize(calibration_data)

# Save quantized model
model.save_quantized("llama-2-7b-gptq")
tokenizer.save_pretrained("llama-2-7b-gptq")

# Push to HuggingFace
model.push_to_hub("username/llama-2-7b-gptq")

分组量化

GPTQ 的工作原理:

  1. 对权重分组:将每个权重矩阵划分为多个组(通常每组包含 128 个元素)
  2. 按组量化:每组都有自己的缩放因子/零点
  3. 最小化误差:利用 Hessian 信息将量化误差降至最低
  4. 结果:获得精度接近 FP16 的 4 bit 权重

组大小的权衡:

组大小模型大小精度速度建议
-1(按列)最小最佳最慢仅用于研究
32较小较好较慢需要高精度时使用
128中等良好快推荐默认值
256较大较低更快速度至关重要时使用
1024最大最低最快不推荐

示例:

Weight matrix: [1024, 4096] = 4.2M elements

Group size = 128:
- Groups: 4.2M / 128 = 32,768 groups
- Each group: own 4-bit scale + zero-point
- Result: Better granularity → better accuracy

量化配置

标准 4 bit(推荐)
from auto_gptq import BaseQuantizeConfig

config = BaseQuantizeConfig(
    bits=4,              # 4-bit quantization
    group_size=128,      # Standard group size
    desc_act=False,      # Faster CUDA kernel
    damp_percent=0.01    # Dampening factor
)

性能:

  • 内存:减少 4 倍(70B 模型:140GB → 35GB)
  • 精度:困惑度增加约 1.5%
  • 速度:比 FP16 快 3~4 倍
高精度(使用更大分组的 3 bit 量化)
config = BaseQuantizeConfig(
    bits=3,              # 3-bit (more compression)
    group_size=128,      # Keep standard group size
    desc_act=True,       # Better accuracy (slower)
    damp_percent=0.01
)

权衡:

  • 内存:减少 5 倍
  • 精度:困惑度增加约 3%
  • 速度:快 5 倍(但精度较低)
最高精度(使用较小分组的 4 bit 量化)
config = BaseQuantizeConfig(
    bits=4,
    group_size=32,       # Smaller groups (better accuracy)
    desc_act=True,       # Activation reordering
    damp_percent=0.005   # Lower dampening
)

权衡:

  • 内存:减少 3.5 倍(占用略大)
  • 精度:困惑度增加约 0.8%(最佳)
  • 速度:快 2~3 倍(内核开销)

内核后端

ExLlamaV2(默认,速度最快)
model = AutoGPTQForCausalLM.from_quantized(
    model_name,
    device="cuda:0",
    use_exllama=True,      # Use ExLlamaV2
    exllama_config={"version": 2}
)

性能:比 Triton 快 1.5~2 倍

Marlin(Ampere 及更新的 GPU)
# Quantize with Marlin format
config = BaseQuantizeConfig(
    bits=4,
    group_size=128,
    desc_act=False  # Required for Marlin
)

model.quantize(calibration_data, use_marlin=True)

# Load with Marlin
model = AutoGPTQForCausalLM.from_quantized(
    model_name,
    device="cuda:0",
    use_marlin=True  # 2× faster on A100/H100
)

要求:

  • NVIDIA Ampere 或更新架构(A100、H100、RTX 40xx)
  • 计算能力 ≥ 8.0
Triton(仅限 Linux)
model = AutoGPTQForCausalLM.from_quantized(
    model_name,
    device="cuda:0",
    use_triton=True  # Linux only
)

性能:比 CUDA 后端快 1.2~1.5 倍

与 transformers 集成

直接使用 transformers
from transformers import AutoModelForCausalLM, AutoTokenizer

# Load quantized model (transformers auto-detects GPTQ)
model = AutoModelForCausalLM.from_pretrained(
    "TheBloke/Llama-2-13B-Chat-GPTQ",
    device_map="auto",
    trust_remote_code=False
)

tokenizer = AutoTokenizer.from_pretrained("TheBloke/Llama-2-13B-Chat-GPTQ")

# Use like any transformers model
inputs = tokenizer("Hello", return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=100)
QLoRA 微调(GPTQ + LoRA)
from transformers import AutoModelForCausalLM
from peft import prepare_model_for_kbit_training, LoraConfig, get_peft_model

# Load GPTQ model
model = AutoModelForCausalLM.from_pretrained(
    "TheBloke/Llama-2-7B-GPTQ",
    device_map="auto"
)

# Prepare for LoRA training
model = prepare_model_for_kbit_training(model)

# LoRA config
lora_config = LoraConfig(
    r=16,
    lora_alpha=32,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM"
)

# Add LoRA adapters
model = get_peft_model(model, lora_config)

# Fine-tune (memory efficient!)
# 70B model trainable on single A100 80GB

性能基准

内存占用降低
模型FP16GPTQ 4 bit降幅
Llama 2-7B14 GB3.5 GB4 倍
Llama 2-13B26 GB6.5 GB4 倍
Llama 2-70B140 GB35 GB4 倍
Llama 3-405B810 GB203 GB4 倍

可实现:

  • 在单张 A100 80GB 上运行 70B(FP16 则需要 2 张 A100)
  • 在 3 张 A100 80GB 上运行 405B(FP16 则需要 11 张 A100)
  • 在 RTX 4090 24GB 上运行 13B(FP16 则会因显存不足而失败)
推理速度(Llama 2-7B,A100)
精度Tokens/秒相比 FP16
FP1625 tok/s1 倍
GPTQ 4 bit(CUDA)85 tok/s3.4 倍
GPTQ 4 bit(ExLlama)105 tok/s4.2 倍
GPTQ 4 bit(Marlin)120 tok/s4.8 倍
精度(WikiText-2 上的困惑度)
模型FP16GPTQ 4 bit(g=128)精度下降
Llama 2-7B5.475.55+1.5%
Llama 2-13B4.884.95+1.4%
Llama 2-70B3.323.38+1.8%

质量保留效果出色——精度下降不到 2%!

常见用法

多 GPU 部署
# Automatic device mapping
model = AutoGPTQForCausalLM.from_quantized(
    "TheBloke/Llama-2-70B-GPTQ",
    device_map="auto",  # Automatically split across GPUs
    max_memory={0: "40GB", 1: "40GB"}  # Limit per GPU
)

# Manual device mapping
device_map = {
    "model.embed_tokens": 0,
    "model.layers.0-39": 0,  # First 40 layers on GPU 0
    "model.layers.40-79": 1,  # Last 40 layers on GPU 1
    "model.norm": 1,
    "lm_head": 1
}

model = AutoGPTQForCausalLM.from_quantized(
    model_name,
    device_map=device_map
)
CPU 卸载
# Offload some layers to CPU (for very large models)
model = AutoGPTQForCausalLM.from_quantized(
    "TheBloke/Llama-2-405B-GPTQ",
    device_map="auto",
    max_memory={
        0: "80GB",  # GPU 0
        1: "80GB",  # GPU 1
        2: "80GB",  # GPU 2
        "cpu": "200GB"  # Offload overflow to CPU
    }
)
批量推理
# Process multiple prompts efficiently
prompts = [
    "Explain AI",
    "Explain ML",
    "Explain DL"
]

inputs = tokenizer(prompts, return_tensors="pt", padding=True).to("cuda")

outputs = model.generate(
    **inputs,
    max_new_tokens=100,
    pad_token_id=tokenizer.eos_token_id
)

for i, output in enumerate(outputs):
    print(f"Prompt {i}: {tokenizer.decode(output)}")

查找预量化模型

HuggingFace 上的 TheBloke:

搜索:

# Find GPTQ models on HuggingFace
https://huggingface.co/models?library=gptq

下载:

from auto_gptq import AutoGPTQForCausalLM

# Automatically downloads from HuggingFace
model = AutoGPTQForCausalLM.from_quantized(
    "TheBloke/Llama-2-70B-Chat-GPTQ",
    device="cuda:0"
)

支持的模型

  • LLaMA 系列:Llama 2、Llama 3、Code Llama
  • Mistral:Mistral 7B、Mixtral 8x7B、8x22B
  • Qwen:Qwen、Qwen2、QwQ
  • DeepSeek:V2、V3
  • Phi:Phi-2、Phi-3
  • Yi、Falcon、BLOOM、OPT
  • HuggingFace 上有 100 多个模型

参考资料

资源

评论

支持 Markdown