gptq について
GPTQ の事後量子化で LLM を圧縮・展開する開発者向けガイドです。AutoGPTQ の手順、グループ単位の設定、推論バックエンド、Transformers との連携を説明します。
主な機能
- 01グループ単位の量子化でモデルの重みを圧縮
- 02ビット幅、グループサイズ、設定値を調整
- 03ExLlamaV2、Marlin、Triton のバックエンドを利用
- 04Transformers 経由で GPTQ モデルを読み込み
- 05複数 GPU への割り当てとバッチ推論に対応
活用シーン
- 01限られた GPU メモリに大規模モデルを収める
- 02事前量子化済み HuggingFace モデルを読み込む
- 03推論用にモデルを量子化
- 04複数 GPU に大規模モデルを分散
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill gptqインストール後、Claude Code で/gptqを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/calibration.mdintegration.mdtroubleshooting.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 の仕組み:
- 重みのグループ化: 各重み行列を(通常 128 要素の)グループに分割する
- グループごとの量子化: 各グループが独自のスケール/ゼロ点を持つ
- 誤差の最小化: ヘッセ行列の情報を用いて量子化誤差を最小化する
- 結果: 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
性能ベンチマーク
メモリ削減
| モデル | FP16 | GPTQ 4-bit | 削減率 |
|---|---|---|---|
| Llama 2-7B | 14 GB | 3.5 GB | 4× |
| Llama 2-13B | 26 GB | 6.5 GB | 4× |
| Llama 2-70B | 140 GB | 35 GB | 4× |
| Llama 3-405B | 810 GB | 203 GB | 4× |
可能になること:
- 単一の A100 80GB で 70B を実行(FP16 では 2× A100 が必要)
- 3× A100 80GB で 405B を実行(FP16 では 11× A100 が必要)
- RTX 4090 24GB で 13B を実行(FP16 では OOM)
推論速度(Llama 2-7B、A100)
| 精度 | トークン/秒 | FP16 比 |
|---|---|---|
| FP16 | 25 tok/s | 1× |
| GPTQ 4-bit(CUDA) | 85 tok/s | 3.4× |
| GPTQ 4-bit(ExLlama) | 105 tok/s | 4.2× |
| GPTQ 4-bit(Marlin) | 120 tok/s | 4.8× |
精度(WikiText-2 でのパープレキシティ)
| モデル | FP16 | GPTQ 4-bit(g=128) | 劣化 |
|---|---|---|---|
| Llama 2-7B | 5.47 | 5.55 | +1.5% |
| Llama 2-13B | 4.88 | 4.95 | +1.4% |
| Llama 2-70B | 3.32 | 3.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 以上のモデルがあります
参考資料
- キャリブレーションガイド - データセットの選定、量子化プロセス、品質の最適化
- 統合ガイド - Transformers、PEFT、vLLM、TensorRT-LLM
- トラブルシューティング - よくある問題、パフォーマンスの最適化
リソース
- GitHub:https://github.com/AutoGPTQ/AutoGPTQ
- 論文:GPTQ: Accurate Post-Training Quantization(arXiv:2210.17323)
- モデル:https://huggingface.co/models?library=gptq
- Discord:https://discord.gg/autogptq
エージェントの作業手順
- 環境を確認します。 GPU の種類、メモリ、ドライバー/CUDA のバージョン(
nvidia-smi)、フレームワークのバージョン、データセットの場所とサイズを確認します。 - 入力を特定します。 データまたはユーザーに確認して、形式、識別子、パラメーターを確定します。結果に影響する値は推測せず、質問してください。
- まず小規模に実行します。 スモークテストを行います。小さなモデルまたはサブセットを使い、少ないステップ数で実行して、損失が減少しチェックポイントが保存されることを確認します。
- 上記の手順と参考資料を使って、タスク全体を実行します。
- 結果を検証します。 保留データで指標を追跡し、ベースラインと比較して、シード、設定、ハードウェアを記録します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未確定の事項を明記します。
| 発生した場合 | 対応 |
|---|---|
| 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 圧縮向けのアクティベーション対応重み量子化です。
コメント
Markdown 対応