科学と神々株式会社アドベントカレンダー 2025
LLM量子化 Day 13: AWQ - アクティベーションを見る量子化
GPU推論の世界へ
ここまでGGUF形式について学んできました。GGUFはCPU推論に最適化された形式で、ローカルPCでLLMを動かす際の最良の選択肢です。
しかし、大規模なサービスを運営する場合や、より高速な応答が必要な場合は、GPU推論が必要になります。今日から3日間、GPU推論向けの量子化形式について学びましょう。
AWQとは何か
AWQ(Activation-aware Weight Quantization)は、2023年にMITの研究者によって提案された量子化手法です。名前の通り、「アクティベーション(活性化)を意識した重みの量子化」を行います。
核心的なアイデア
従来の量子化は、すべての重みを同じように扱います。しかしAWQは、「どの重みが重要か」をアクティベーションの分布から判断します。
従来の量子化:
すべての重みを均等に4ビットに量子化
→ 重要な重みも、そうでない重みも同じ精度
AWQの量子化:
アクティベーションを分析 → 重要な重みを特定 → 重要な重みを保護
→ 重要度に応じた量子化で品質を維持
なぜアクティベーションを見るのか
重みの重要度を判断するとき、「重みの値が大きい」だけでは不十分です。大きな重みでも、実際の推論であまり使われないなら、精度を落としても影響は小さいでしょう。
逆に、小さな重みでも、頻繁に大きなアクティベーションと掛け合わされるなら、その重みは非常に重要です。
具体例で考える
重みA: 値 0.5、平均アクティベーション 0.01
→ 出力への寄与: 0.5 × 0.01 = 0.005
重みB: 値 0.1、平均アクティベーション 2.0
→ 出力への寄与: 0.1 × 2.0 = 0.2
重みAは値が大きいですが、実際の影響は重みBの40分の1です。AWQは、重みBのような「実際に重要な重み」を優先的に保護します。
AWQの仕組み:スケーリングによる保護
AWQは、重要な重みを「スケーリング」という手法で保護します。
スケーリングのイメージ
量子化は「値を丸める」処理です。例えば、小数を整数に丸めるとき:
0.4 → 0
0.6 → 1
この丸め誤差は、元の値が小さいほど相対的に大きくなります。
AWQは、重要な重みをあらかじめ大きくスケール(拡大)してから量子化します:
元の値: 0.4
スケール: 10倍
量子化前: 4.0
量子化後: 4
逆スケール: 0.4
誤差がゼロに!
推論時には逆スケールを適用するため、結果は正しく計算されます。
AWQの利点
1. 高い推論品質
同じ4ビットでも、AWQは他の手法より高い品質を維持します:
| 手法 | Perplexity増加 | 品質維持率 |
|---|---|---|
| 単純4ビット | +8〜12% | 88〜92% |
| GPTQ 4ビット | +3〜5% | 95〜97% |
| AWQ 4ビット | +1〜3% | 97〜99% |
2. vLLMとの相性
AWQはvLLM(高速なLLM推論エンジン)に最適化されています。vLLMはAWQ形式を直接読み込み、効率的なGPUカーネルで推論を実行します。
from vllm import LLM
# AWQモデルを読み込む
llm = LLM(
model="./my-model-AWQ-4bit",
quantization="awq",
)
# 高スループット推論
outputs = llm.generate(prompts, sampling_params)
3. メモリ効率
7Bモデルの場合:
- FP16: 約14GB VRAM
- AWQ 4ビット: 約4GB VRAM
残りのVRAMをKVキャッシュに使えるため、より長いコンテキストや、より多くの同時リクエストを処理できます。
AWQの欠点
1. GPU専用
AWQはGPU推論を前提とした形式です。CPU推論には適しません。ローカルPCで試したいなら、GGUFを選びましょう。
2. キャリブレーションが必要
AWQは、アクティベーションの分布を分析するために「キャリブレーションデータ」が必要です。これは追加の計算時間を要します。
3. 4ビット固定
現在のAWQ実装は4ビット量子化のみをサポートしています。8ビットや2ビットが必要な場合は、GPTQを検討してください。
キャリブレーションデータの選び方
AWQの品質は、キャリブレーションデータに大きく依存します。
理想的なキャリブレーションデータ
- ターゲットタスクに近いデータ: コーディング支援に使うなら、コードを含むデータ
- 十分な多様性: 様々なトピックとスタイルを含む
- 適切な量: 通常256〜512サンプルで十分
デフォルトデータの限界
llm-quantizeはデフォルトのキャリブレーションデータを提供しますが、これは汎用的なテキストです。特定のタスクで最高品質を求めるなら、自前のデータを用意することをお勧めします。
# カスタムキャリブレーションデータを使用
llm-quantize quantize model awq -q 4bit \
--calibration-data ./my_data.json \
--calibration-samples 512
GGUFとAWQの使い分け
| 条件 | 推奨形式 |
|---|---|
| ローカルPC、CPU推論 | GGUF |
| ローカルPC、GPU推論 | GGUF(CUDA対応)またはAWQ |
| サーバー、高スループット | AWQ |
| vLLMを使用 | AWQ |
| llama.cppを使用 | GGUF |
| 様々なビット幅が必要 | GPTQ |
Tips: AWQ量子化のコツ
1. 十分なキャリブレーションサンプルを使う
256サンプルがデフォルトですが、品質を求めるなら512に増やすことを検討してください。
2. グループサイズを調整する
デフォルトの128は多くの場合に適切ですが、品質重視なら64、速度重視なら256を試してください。
3. 変換後は必ず検証する
# 簡単な推論テスト
vllm serve ./my-model-AWQ-4bit --port 8000
curl localhost:8000/v1/completions -d '{"prompt": "Hello", "max_tokens": 10}'
次回予告
Day 14では「AWQQuantizerの内部」として、llm-quantizeがAWQ量子化をどのように実装しているか、llm-awqライブラリとの連携について解説します。
AWQは「すべての重みを平等に扱わない」という発想の転換から生まれました。機械学習の世界では、このような「人間の直感に反するアイデア」がブレークスルーを生むことがよくあります。