Skip to content
Published on

LLM量子化 完全比較 — GPTQ vs AWQ vs GGUF

Authors
  • Name
    Twitter
LLM Quantization

1. 量子化(Quantization)とは?

量子化とは、モデルの重みを低精度で表現することでメモリ使用量と推論速度を改善する技術です。FP16(16bit)の重みをINT4(4bit)に削減すると、メモリが約4倍節約されます。

量子化の種類

  • PTQ(Post-Training Quantization): 学習後の量子化。GPTQ、AWQ、GGUFはすべてPTQ
  • QAT(Quantization-Aware Training): 学習中に量子化をシミュレーション

ビット幅によるメモリ

精度7Bモデルメモリ70Bモデルメモリ
FP3228 GB280 GB
FP1614 GB140 GB
INT87 GB70 GB
INT43.5 GB35 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の主な違い

項目GPTQAWQ
アプローチレイヤーごとの誤差最小化活性化ベースのチャネル保護
キャリブレーション128以上のサンプルが必要少ないサンプルで可能
量子化速度遅い(数時間)速い(数十分)
推論速度ExLlamaカーネルで高速GEMMカーネルで高速
精度高い同等かやや優れる

4. GGUF(llama.cppフォーマット)

GGUFはllama.cppで使用される量子化フォーマットで、CPU + GPUハイブリッド推論をサポートします。

GGUF量子化方式の種類

方式ビット説明
Q2_K2.5極限圧縮、品質低下が大きい
Q4_K_M4.8最も人気のあるバランスポイント
Q5_K_M5.5高品質を維持
Q6_K6.6FP16に近い品質
Q8_08.0ほぼ無損失
IQ4_XS4.3importance 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):

方式VRAMtok/s(生成)Perplexity量子化時間
FP1614 GB955.12-
GPTQ-4bit4.2 GB1455.282〜4時間
AWQ-4bit4.0 GB1505.2530分
GGUF Q4_K_M4.5 GB1305.305分
GGUF Q5_K_M5.3 GB1205.185分

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変換の実行