科学と神々株式会社アドベントカレンダー 2025
LLM量子化 Day 14: AWQQuantizerの内部
実装の全体像
llm-quantizeのAWQ量子化は、MIT HAN Labのllm-awqライブラリを優先的に活用しています。llm-awqはAWQ論文の著者によって開発された公式実装であり、最も信頼性の高い参照実装です。
ライブラリの選択
llm-awq (推奨)
├── MIT HAN Labの公式実装
├── https://github.com/mit-han-lab/llm-awq
└── 最新のアルゴリズム改善を反映
AutoAWQ (レガシー・フォールバック)
├── 2025年5月にアーカイブ
├── https://github.com/casper-hansen/AutoAWQ
└── 既存環境との互換性のため対応
Day 11でllama.cppとの連携について学んだように、複雑なアルゴリズムの実装は専門家に任せるのが賢明です。AWQのスケーリング計算は数学的に複雑であり、llm-awqはこれを最適化された形で提供しています。
量子化フローの詳細
AWQ量子化は以下のステップで進みます:
1. 準備フェーズ
入力の検証
├── モデルパスが有効か
├── 量子化レベルが4bitか(AWQは4bit固定)
└── 出力ディレクトリが書き込み可能か
2. キャリブレーションデータの準備
キャリブレーションデータ
├── ユーザー指定のファイルがあれば読み込む
│ └── JSON形式: ["text1", "text2", ...] または {"text": [...]}
│
└── なければデフォルトを使用
└── 汎用的な英語テキスト
デフォルトのキャリブレーションデータは、様々なドメイン(技術文書、一般文章、コードなど)をカバーするよう設計されています。
3. モデル読み込み
モデルはllm-awq(またはAutoAWQ)を通じて読み込まれます。この時点で、モデルの構造が分析され、どの層を量子化するかが決定されます。
4. キャリブレーション実行
ここがAWQの核心です:
- キャリブレーションデータをモデルに通す
- 各層のアクティベーションを記録
- アクティベーションの分布から重みの重要度を計算
- 重要な重みを保護するスケールを決定
5. 量子化
スケールが決定したら、実際の量子化を行います:
- 重みにスケールを適用
- 4ビット整数に量子化
- メタデータ(スケール値など)を保存
6. 保存
量子化されたモデルはディレクトリとして保存されます:
model-AWQ-4bit/
├── config.json # モデル設定
├── generation_config.json # 生成設定
├── tokenizer.json # トークナイザー
├── tokenizer_config.json
├── special_tokens_map.json
└── model.safetensors # 量子化された重み
出力サイズの推定
AWQの出力サイズは、以下の式で推定できます:
推定サイズ = 元サイズ × (4/16) × 1.2
- 元サイズ: パラメータ数 × 2バイト(FP16)
- 4/16: 16ビットから4ビットへの圧縮
- 1.2: メタデータのオーバーヘッド(約20%)
7Bモデルの場合:
元サイズ: 7B × 2 = 14GB
量子化後: 14GB × 0.25 = 3.5GB
オーバーヘッド込み: 3.5GB × 1.2 = 4.2GB
llm-awqとの連携
ライブラリの検出
まず、llm-awqがインストールされているかを確認します。見つからない場合はAutoAWQ(レガシー)にフォールバックします:
def _has_llm_awq(self) -> bool:
try:
from awq.quantize.quantizer import real_quantize_model_weight
return True
except ImportError:
return False
量子化設定
llm-awqには多くの設定オプションがあります:
| パラメータ | 説明 | デフォルト |
|---|---|---|
| zero_point | ゼロポイント量子化を使用 | True |
| q_group_size | グループサイズ | 128 |
| w_bit | 量子化ビット数 | 4 |
llm-quantizeではこれらの設定を合理的なデフォルトで提供しつつ、上級ユーザー向けにカスタマイズも可能にしています。
フォールバック機構
llm-quantizeは3段階のフォールバック機構を持っています:
1. llm-awq (推奨)
│
└── 失敗時 → 2. AutoAWQ (レガシー)
│
└── 失敗時 → 3. 基本構造のみ作成
基本構造のみのフォールバックでは:
- 基本的なディレクトリ構造を作成: 正しい形式のconfig.jsonなど
- 警告をログ出力: 「llm-awqをインストールすると、より高品質な量子化が可能です」
- プレースホルダーファイルを作成: 構造は正しいが、実際の量子化は行われない
このフォールバックは主にテストやデモンストレーション用です。本番環境では必ずllm-awqをインストールしてください。
キャリブレーションデータの形式
llm-quantizeは2つのJSON形式をサポートしています:
形式1: シンプルなリスト
[
"The quick brown fox jumps over the lazy dog.",
"Machine learning models require significant computational resources.",
"Natural language processing has made remarkable progress."
]
形式2: オブジェクト形式
{
"text": [
"The quick brown fox jumps over the lazy dog.",
"Machine learning models require significant computational resources."
]
}
どちらでも動作しますが、形式2はメタデータを追加できるため、より拡張性があります。
チェックポイント機能
AWQ量子化も、GGUFと同様にチェックポイント機能をサポートしています。これにより、長時間の処理が中断されても、途中から再開できます。
# 中断された場合、同じコマンドを再実行
llm-quantize quantize model awq -q 4bit
# 出力: "Resuming from checkpoint: 15 layers completed"
Tips: AWQ量子化を成功させるコツ
1. llm-awqをインストールする
# 推奨: llm-awq(公式実装)
pip install llm-awq
# または AutoAWQ(レガシー、アーカイブ済み)
pip install autoawq
GPUが必要です。CUDAが正しくセットアップされていることを確認してください。
2. 十分なVRAMを確保する
7Bモデルの量子化には、約16GB以上のVRAMが必要です。VRAMが足りない場合は、より小さいモデルから始めてください。
3. キャリブレーションデータを選ぶ
用途に合ったキャリブレーションデータを用意しましょう:
- コーディング: GitHubからのコードスニペット
- 日本語対応: 日本語テキストを含むデータ
- 対話: 対話形式のデータ
4. 変換後のテスト
量子化後は、必ず実際のタスクでテストしてください:
from vllm import LLM, SamplingParams
llm = LLM(model="./model-AWQ-4bit", quantization="awq")
params = SamplingParams(max_tokens=100)
outputs = llm.generate(["Write a function to calculate fibonacci:"], params)
print(outputs[0].outputs[0].text)
次回予告
Day 15では「GPTQ形式の概要」として、もう一つのGPU向け量子化形式について解説します。GPTQはAWQとは異なるアプローチで高品質な量子化を実現しています。
実装の複雑さを隠蔽することは、良いソフトウェア設計の特徴です。llm-quantizeを使うユーザーは、llm-awqの詳細を知らなくても、高品質なAWQ量子化を行えます。しかし、内部を理解していると、トラブルシューティングやカスタマイズがより容易になります。