GPTQ(量子化アルゴリズム)(ジーピーティーキュー)
学習済みLLMを2/3/4ビットに圧縮するポストトレーニング量子化手法。レイヤーごとにヘッシアン近似で誤差最小化し、GPU VRAMを1/4〜1/8に削減する。
GPTQ(量子化アルゴリズム)とは
GPTQ(Generative Pre-trained Transformer Quantization)は2022年にElias Frankle・Mark Kurtz・Dan Alistarh らが発表したポストトレーニング量子化(PTQ)手法。学習済みLLMの重みをINT4(4ビット)やINT2/INT3に圧縮しながら、レイヤーごとにヘッシアン行列を近似して量子化誤差を最小化する。GPU VRAMを16bit比で最大1/4に削減しつつ、perplexity劣化を1%未満に抑えられることが特徴。
技術詳細
基本アプローチ
GPTQはOBSQ(Optimal Brain Surgeon Quantization)をTransformerのLayerに効率化した手法:
- 各Transformerレイヤーの重み行列を左→右の順に列単位で量子化
- 量子化後の誤差をヘッシアン逆行列で残りの重みに分散して補正
- Cholesky分解でヘッシアン逆行列を安定的に計算
- キャリブレーション用のランダムサンプル(128〜512テキスト)のみで完結
量子化ビット数と精度トレードオフ
| ビット数 | VRAM削減 | perplexity増加 | 用途 |
|---|---|---|---|
| INT8 | 1/2 | ~0% | 高精度重視 |
| INT4 | 1/4 | ~0.5-1% | バランス型(主流) |
| INT3 | 1/5 | ~2-5% | 極端なVRAM制限 |
| INT2 | 1/8 | ~10%+ | 実験的 |
INT4(4ビット)がVRAM削減と精度のバランスで最も実用的。
AutoGPTQ による実装
# AutoGPTQ で Llama 3 8B を INT4 量子化
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
from transformers import AutoTokenizer
model_name = "meta-llama/Meta-Llama-3-8B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
quantize_config = BaseQuantizeConfig(
bits=4,
group_size=128,
desc_act=True,
)
model = AutoGPTQForCausalLM.from_pretrained(
model_name,
quantize_config=quantize_config
)
examples = tokenizer(
["以下の文章を要約してください。" * 64],
return_tensors="pt"
)
model.quantize(examples)
model.save_quantized("./llama3-8b-gptq-int4")
VRAM 要件比較
| モデル | FP16 | INT8 | INT4 (GPTQ) |
|---|---|---|---|
| Llama 3 8B | 16GB | 8GB | 4.5GB |
| Llama 3 70B | 140GB | 70GB | 37GB |
| Mixtral 8x7B | 93GB | 47GB | 26GB |
| Qwen2.5 72B | 144GB | 72GB | 39GB |
RTX 4090(24GB)でLlama 3 70B INT4が動作可能になる。
GPTQ 亜種・改良手法
| 手法 | 特徴 | 備考 |
|---|---|---|
| GPTQ | 最も普及。安定した INT4 | 基準 |
| EXL2 (ExLlamaV2) | 混合ビット幅・GPU最適化カーネル | 速度向上 |
| Marlin | GPTQ INT4×FP16 GEMM カーネル | 推論速度2倍向上 |
| AQLM | 積量子化 | 2bit 精度向上 |
| QuIP# | Hadamard 回転で INT2 高精度化 | 超低bit向き |
よくある質問(FAQ)
Q1: AWQ と GPTQ はどちらが良い? A: 精度面では同程度だが、AWQ は GPTQ より量子化速度が速く実装がシンプル。GPTQ は desc_act=True で精度をわずかに上げられる。ExLlamaV2 エンジン使用なら GPTQ が高速。vLLM との相性は AWQ の方が良い場合が多い。
Q2: キャリブレーションデータは何を使うべき? A: 推論タスクに近いテキストを128〜512サンプル使うのが推奨。WikiText-2 や C4 の一部が一般的。タスク特化の場合はそのドメインのテキストでキャリブレーションすると精度が上がる。
Q3: CPU でも GPTQ は使える? A: GPTQ は GPU カーネル(CUDA)前提の最適化が多く、CPU での推論速度は GGUF/llama.cpp に大幅に劣る。CPUメイン環境では GGUF 形式を選ぶべき。