mcpField
G
gptq

gptq

github.com/kalarislabs開発9657 回インストール3 日前に更新
リポジトリ

gptq について

GPTQ の事後量子化で LLM を圧縮・展開する開発者向けガイドです。AutoGPTQ の手順、グループ単位の設定、推論バックエンド、Transformers との連携を説明します。

主な機能

  1. 01グループ単位の量子化でモデルの重みを圧縮
  2. 02ビット幅、グループサイズ、設定値を調整
  3. 03ExLlamaV2、Marlin、Triton のバックエンドを利用
  4. 04Transformers 経由で GPTQ モデルを読み込み
  5. 05複数 GPU への割り当てとバッチ推論に対応

活用シーン

  1. 01限られた GPU メモリに大規模モデルを収める
  2. 02事前量子化済み HuggingFace モデルを読み込む
  3. 03推論用にモデルを量子化
  4. 04複数 GPU に大規模モデルを分散

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kalarislabs/research-agent-skills --skill gptq

インストール後、Claude Code で/gptqを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
calibration.md
integration.md
troubleshooting.md

詳細

GPTQ (Generative Pre-trained Transformer Quantization)

グループ単位の量子化を用いて、LLM を最小限の精度低下で 4 ビットに圧縮する学習後量子化手法です。

GPTQ を使うべき場面

GPTQ を使うべき場合:

  • 大規模モデル(70B 以上)を限られた GPU メモリに収める必要がある
  • 精度低下 2% 未満で 4× のメモリ削減を得たい
  • コンシューマー向け GPU(RTX 4090、3090)にデプロイする
  • より高速な推論が必要である(FP16 比で 3〜4× の高速化)

代わりに AWQ を使うべき場合:

  • わずかに高い精度(損失 1% 未満)が必要である
  • 新しい GPU(Ampere、Ada)を使用している
  • Marlin カーネルのサポートが欲しい(一部の GPU で 2× 高速)

代わりに bitsandbytes を使うべき場合:

  • transformers との簡単な統合が必要である
  • 8 ビット量子化が欲しい(圧縮率は低いが品質は高い)
  • 事前量子化済みのモデルファイルは不要である

クイックスタート

インストール
# 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. 誤差の最小化: ヘッセ行列の情報を用いて量子化誤差を最小化する
  4. 結果: FP16 にほぼ匹敵する精度を持つ 4 ビットの重み

グループサイズのトレードオフ:

グループサイズモデルサイズ精度速度推奨
-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 ビット(推奨)
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 ビット)
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 ビット)
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)
  • Compute capability ≥ 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 では OOM)
推論速度(Llama 2-7B、A100)
精度トークン/秒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:

  • https://huggingface.co/TheBloke
  • GPTQ 形式のモデルが 1000 以上あります
  • 複数のグループサイズ(32、128)に対応しています
  • CUDA 形式と Marlin 形式の両方に対応しています

検索:

# 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 以上のモデルがあります

参考資料

リソース

エージェントの作業手順

  1. 環境を確認します。 GPU の種類、メモリ、ドライバー/CUDA のバージョン(nvidia-smi)、フレームワークのバージョン、データセットの場所とサイズを確認します。
  2. 入力を特定します。 データまたはユーザーに確認して、形式、識別子、パラメーターを確定します。結果に影響する値は推測せず、質問してください。
  3. まず小規模に実行します。 スモークテストを行います。小さなモデルまたはサブセットを使い、少ないステップ数で実行して、損失が減少しチェックポイントが保存されることを確認します。
  4. 上記の手順と参考資料を使って、タスク全体を実行します。
  5. 結果を検証します。 保留データで指標を追跡し、ベースラインと比較して、シード、設定、ハードウェアを記録します。
  6. 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未確定の事項を明記します。
発生した場合対応
CUDA のメモリ不足バッチサイズを小さくする、勾配蓄積/チェックポイント機能または混合精度を有効にする、あるいはモデルをシャーディングします。
損失が NaN になる、または発散する学習率を下げ、データに無効な値がないか確認し、勾配クリッピングを有効にします。
これらの手順に記載された関数、フラグ、エンドポイントがインストール済みバージョンにないインストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認して適宜対応し、ユーザーに伝えます。API を捏造してはいけません。
必須の入力、識別子、パラメーターが曖昧ユーザーに質問するか、実行前に仮定を明示します。

誠実性に関するルール

  • 結果、パラメーター、識別子、引用、統計情報を捏造してはいけません。実行または検証できない場合は、その旨を明確に伝えます。
  • ログなしに学習結果を主張してはいけません。大規模なジョブを開始する前に、計算コストを見積もります。
  • ここに記載されたバージョン固有の詳細は古くなっている可能性があります。インストール済みバージョンの公式ドキュメントと照合してください。
  • 費用が発生する場合、共有 GPU やクラウドのクォータを消費する場合、個人データや患者データに触れる場合、または取り消せない操作を行う場合は、事前に確認してください。

関連スキル

  • quantizing-models-bitsandbytes:精度の低下を最小限に抑えながら、LLM を 8 ビットまたは 4 ビットに量子化し、メモリ使用量を 50~75%削減します。
  • hqq-quantization:キャリブレーションデータを使用しない、LLM 向けの Half-Quadratic Quantization です。
  • awq-quantization:精度の低下を最小限に抑え、3 倍の高速化を実現する、4 ビット LLM 圧縮向けのアクティベーション対応重み量子化です。

コメント