- Authors
- Name
- 1. 量子化(Quantization)とは?
- 2. GPTQ(GPU最適化量子化)
- 3. AWQ(Activation-aware Weight Quantization)
- 4. GGUF(llama.cppフォーマット)
- 5. vLLMでの量子化モデルの使用
- 6. ベンチマーク比較
- 7. 実践的な選択ガイド
- 8. クイズ
- クイズ

1. 量子化(Quantization)とは?
量子化とは、モデルの重みを低精度で表現することでメモリ使用量と推論速度を改善する技術です。FP16(16bit)の重みをINT4(4bit)に削減すると、メモリが約4倍節約されます。
量子化の種類
- PTQ(Post-Training Quantization): 学習後の量子化。GPTQ、AWQ、GGUFはすべてPTQ
- QAT(Quantization-Aware Training): 学習中に量子化をシミュレーション
ビット幅によるメモリ
| 精度 | 7Bモデルメモリ | 70Bモデルメモリ |
|---|---|---|
| FP32 | 28 GB | 280 GB |
| FP16 | 14 GB | 140 GB |
| INT8 | 7 GB | 70 GB |
| INT4 | 3.5 GB | 35 GB |
2. GPTQ(GPU最適化量子化)
GPTQは**Optimal Brain Quantization(OBQ)**に基づき、レイヤーごとの量子化を実行します。キャリブレーションデータを使用して量子化誤差を最小化します。
GPTQ量子化の実行
from transformers import AutoModelForCausalLM, AutoTokenizer
from optimum.gptq import GPTQQuantizer
# モデルのロード
model_id = "meta-llama/Llama-3.1-8B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id, torch_dtype="auto", device_map="auto"
)
# キャリブレーションデータの準備
from datasets import load_dataset
dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split="train")
calibration_data = [tokenizer(text["text"]) for text in dataset.select(range(128))]
# GPTQ量子化
quantizer = GPTQQuantizer(
bits=4,
group_size=128,
desc_act=True, # activation orderで量子化
damp_percent=0.01,
dataset=calibration_data,
)
quantized_model = quantizer.quantize_model(model, tokenizer)
# 保存
quantized_model.save_pretrained("./llama-3.1-8b-gptq-4bit")
tokenizer.save_pretrained("./llama-3.1-8b-gptq-4bit")
GPTQの特徴
- GPU最適化カーネル(ExLlama、Marlin)
- キャリブレーションデータが必要(通常128〜256サンプル)
- group_sizeが小さいほど精度は高いが速度は低下
3. AWQ(Activation-aware Weight Quantization)
AWQは活性化分布を分析して重要な重みチャネルを保護する方式です。すべての重みを同一に量子化するのではなく、活性化の大きさが大きいチャネルの重みをスケーリングして精度を維持します。
AWQ量子化の実行
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_id = "meta-llama/Llama-3.1-8B-Instruct"
quant_path = "./llama-3.1-8b-awq-4bit"
# モデルのロード
model = AutoAWQForCausalLM.from_pretrained(model_id)
tokenizer = AutoTokenizer.from_pretrained(model_id)
# AWQ量子化設定
quant_config = {
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
"version": "GEMM" # GEMM or GEMV
}
# 量子化の実行
model.quantize(tokenizer, quant_config=quant_config)
# 保存
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
AWQ vs GPTQの主な違い
| 項目 | GPTQ | AWQ |
|---|---|---|
| アプローチ | レイヤーごとの誤差最小化 | 活性化ベースのチャネル保護 |
| キャリブレーション | 128以上のサンプルが必要 | 少ないサンプルで可能 |
| 量子化速度 | 遅い(数時間) | 速い(数十分) |
| 推論速度 | ExLlamaカーネルで高速 | GEMMカーネルで高速 |
| 精度 | 高い | 同等かやや優れる |
4. GGUF(llama.cppフォーマット)
GGUFはllama.cppで使用される量子化フォーマットで、CPU + GPUハイブリッド推論をサポートします。
GGUF量子化方式の種類
| 方式 | ビット | 説明 |
|---|---|---|
| Q2_K | 2.5 | 極限圧縮、品質低下が大きい |
| Q4_K_M | 4.8 | 最も人気のあるバランスポイント |
| Q5_K_M | 5.5 | 高品質を維持 |
| Q6_K | 6.6 | FP16に近い品質 |
| Q8_0 | 8.0 | ほぼ無損失 |
| IQ4_XS | 4.3 | importance matrixベース |
GGUF変換の実行
# llama.cppのビルド
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && make -j$(nproc)
# HuggingFaceモデルをGGUFに変換
python convert_hf_to_gguf.py \
../Llama-3.1-8B-Instruct \
--outfile llama-3.1-8b-f16.gguf \
--outtype f16
# 量子化の適用
./llama-quantize \
llama-3.1-8b-f16.gguf \
llama-3.1-8b-Q4_K_M.gguf \
Q4_K_M
# importance matrixでより正確な量子化(IQシリーズ)
./llama-imatrix \
-m llama-3.1-8b-f16.gguf \
-f calibration.txt \
-o imatrix.dat
./llama-quantize \
--imatrix imatrix.dat \
llama-3.1-8b-f16.gguf \
llama-3.1-8b-IQ4_XS.gguf \
IQ4_XS
5. vLLMでの量子化モデルの使用
# GPTQモデル
vllm serve ./llama-3.1-8b-gptq-4bit \
--quantization gptq \
--max-model-len 8192
# AWQモデル
vllm serve ./llama-3.1-8b-awq-4bit \
--quantization awq \
--max-model-len 8192
# GGUFモデル(vLLM 0.6以降)
vllm serve ./llama-3.1-8b-Q4_K_M.gguf \
--max-model-len 8192
llama.cppサーバー
./llama-server \
-m llama-3.1-8b-Q4_K_M.gguf \
--host 0.0.0.0 \
--port 8080 \
-ngl 99 \ # GPUレイヤー数
-c 8192 \ # コンテキスト長
--n-predict 2048
6. ベンチマーク比較
7Bモデル基準のベンチマーク(RTX 4090):
| 方式 | VRAM | tok/s(生成) | Perplexity | 量子化時間 |
|---|---|---|---|---|
| FP16 | 14 GB | 95 | 5.12 | - |
| GPTQ-4bit | 4.2 GB | 145 | 5.28 | 2〜4時間 |
| AWQ-4bit | 4.0 GB | 150 | 5.25 | 30分 |
| GGUF Q4_K_M | 4.5 GB | 130 | 5.30 | 5分 |
| GGUF Q5_K_M | 5.3 GB | 120 | 5.18 | 5分 |
7. 実践的な選択ガイド
GPU専用サービング(vLLM) → AWQ(高速な量子化 + 良好な性能)
GPU専用サービング(精度重視) → GPTQ(desc_act=True)
CPU + GPUハイブリッド → GGUF Q4_K_M
MacBook / CPU専用 → GGUF Q4_K_MまたはQ5_K_M
極限圧縮 → GGUF IQ4_XS(imatrix使用)
8. クイズ
Q1: AWQがGPTQより量子化速度が速い理由は?
GPTQはレイヤーごとにヘシアン逆行列を計算し、順次的に重みを量子化するため計算量が多くなります。AWQは活性化分布のみを分析して重要なチャネルを特定しスケーリングするため、複雑な最適化プロセスなしに高速に量子化できます。
Q2: GGUF Q4_K_MのKとMはそれぞれ何を意味しますか?
K: K-quant方式を意味します。レイヤーの重要度に応じて異なるビット幅を適用する混合量子化です。 M: Medium品質を意味します。S(Small)、M(Medium)、L(Large)のバリエーションがあり、Lに近いほどより多くのレイヤーに高いビットを割り当てます。
Q3: vLLMでGPTQとAWQのどちらを選ぶべきですか?
ほとんどの場合、AWQを推奨します:
量子化速度がはるかに速い(30分 vs 数時間) 推論性能が同等かやや優れている Perplexityの差はほとんどない
ただし、最高精度が必要な場合はGPTQ(desc_act=True)がわずかに有利な場合があります。
クイズ
Q1: 「LLM量子化 完全比較 — GPTQ vs AWQ vs GGUF」の主なトピックは何ですか?
量子化の原理からGPTQ、AWQ、GGUFの各方式の比較、vLLM/llama.cpp連携、実践ベンチマークまで、LLM
Quantizationを完全に整理します。
Q2: 量子化(Quantization)とは?とは何ですか?
量子化とは、モデルの重みを低精度で表現することでメモリ使用量と推論速度を改善する技術です。FP16(16bit)の重みをINT4(4bit)に削減すると、メモリが約4倍節約されます。
量子化の種類 PTQ(Post-Training Quantization): 学習後の量子化。GPTQ、AWQ、GGUFはすべてPTQ
QAT(Quantization-Aware Training): 学習中に量子化をシミュレーション ビット幅によるメモリ
Q3: GPTQ(GPU最適化量子化)はどのように実現できますか?
GPTQはOptimal Brain
Quantization(OBQ)に基づき、レイヤーごとの量子化を実行します。キャリブレーションデータを使用して量子化誤差を最小化します。
GPTQ量子化の実行 GPTQの特徴 GPU最適化カーネル(ExLlama、Marlin)
キャリブレーションデータが必要(通常128〜256サンプル)
group_sizeが小さいほど精度は高いが速度は低下
Q4: AWQ(Activation-aware Weight Quantization)の主な特徴は何ですか?
AWQは活性化分布を分析して重要な重みチャネルを保護する方式です。すべての重みを同一に量子化するのではなく、活性化の大きさが大きいチャネルの重みをスケーリングして精度を維持します。
AWQ量子化の実行 AWQ vs GPTQの主な違い
Q5: GGUF(llama.cppフォーマット)はどのように機能しますか?
GGUFはllama.cppで使用される量子化フォーマットで、CPU + GPUハイブリッド推論をサポートします。
GGUF量子化方式の種類 GGUF変換の実行