awq-quantization について
AWQは、推論向けのモデルメモリ削減を目指す開発者向けのLLM 4-bit量子化スキルです。活性化パターンに基づいて重要な重みを保護し、複数のカーネルバックエンドとTransformers、vLLMとの連携に対応します。AutoAWQは非推奨です。
主な機能
- 01活性化パターンに基づく重要重みの保護
- 024-bitモデルの量子化と読み込み
- 03GEMM、GEMV、Marlinバックエンド
- 04TransformersとvLLMとの連携
- 05カスタム校正データとマルチGPU対応
活用シーン
- 01推論メモリを抑えるモデル量子化
- 02vLLMによるAWQモデルのデプロイ
- 03特定分野モデル向け校正データの設定
- 04複数GPUでの大規模量子化モデル読み込み
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill awq-quantizationインストール後、Claude Code で/awq-quantizationを入力して読み込まれたか確認します。
同梱ファイルreferences/advanced-usage.mdreferences/troubleshooting.md
詳細
AWQ(Activation-aware Weight Quantization)
アクティベーションパターンに基づいて重要な重みを保持する4ビット量子化です。精度の損失を最小限に抑えながら、3倍の高速化を実現します。
AWQ を使用する場面
次の場合は AWQ を使用してください。
- 精度の損失を5%未満に抑えた4ビット量子化が必要な場合
- 命令チューニング済みモデルやチャットモデルをデプロイする場合(AWQ のほうが汎用性に優れています)
- FP16 と比べて約2.5~3倍の推論高速化を求める場合
- 本番環境でのサービングに vLLM を使用する場合
- Marlin カーネルに対応した Ampere 以降の GPU(A100、H100、RTX 40xx)がある場合
次の場合は GPTQ を使用してください。
- エコシステムとの最大限の互換性が必要な場合(GPTQ に対応するツールのほうが多くあります)
- 特に ExLlamaV2 バックエンドを使用する場合
- Marlin に対応していない古い GPU を使用している場合
次の場合は bitsandbytes を使用してください。
- キャリブレーションのオーバーヘッドをゼロにしたい場合(オンザフライで量子化)
- QLoRA を使ってファインチューニングする場合
- よりシンプルな統合を優先する場合
クイックスタート
インストール
# Default (Triton kernels)
pip install autoawq
# With optimized CUDA kernels + Flash Attention
pip install autoawq[kernels]
# Intel CPU/XPU optimization
pip install autoawq[cpu]
要件:Python 3.8 以降、CUDA 11.8 以降、Compute Capability 7.5 以上
量子化済みモデルの読み込み
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_name = "TheBloke/Mistral-7B-Instruct-v0.2-AWQ"
model = AutoAWQForCausalLM.from_quantized(
model_name,
fuse_layers=True # Enable fused attention for speed
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# Generate
inputs = tokenizer("Explain quantum computing", return_tensors="pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens=200)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
独自モデルの量子化
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = "mistralai/Mistral-7B-Instruct-v0.2"
# Load model and tokenizer
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
# Quantization config
quant_config = {
"zero_point": True, # Use zero-point quantization
"q_group_size": 128, # Group size (128 recommended)
"w_bit": 4, # 4-bit weights
"version": "GEMM" # GEMM for batch, GEMV for single-token
}
# Quantize (uses pileval dataset by default)
model.quantize(tokenizer, quant_config=quant_config)
# Save
model.save_quantized("mistral-7b-awq")
tokenizer.save_pretrained("mistral-7b-awq")
所要時間:7B モデルで約10~15分、70B モデルで約1時間です。
AWQ、GPTQ、bitsandbytes の比較
| 特徴 | AWQ | GPTQ | bitsandbytes |
|---|---|---|---|
| 高速化(4ビット) | 約2.5~3倍 | 約2倍 | 約1.5倍 |
| 精度の損失 | 5%未満 | 約5~10% | 約5~15% |
| キャリブレーション | 最小限(128~1Kトークン) | より大規模 | なし |
| 過学習のリスク | 低い | 高め | 該当なし |
| 最適な用途 | 本番環境での推論 | GPU 推論 | 簡単な統合 |
| vLLM のサポート | ネイティブ | 対応 | 限定的 |
重要なポイント:AWQ は、すべての重みが同じ重要度ではないと想定します。アクティベーションパターンから特定された重要な重みの約1%を保護することで、混合精度によるオーバーヘッドなしに量子化誤差を低減します。
カーネルバックエンド
GEMM(デフォルト、バッチ推論)
quant_config = {
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
"version": "GEMM" # Best for batch sizes > 1
}
GEMV(単一トークンの生成)
quant_config = {
"version": "GEMV" # 20% faster for batch_size=1
}
制限事項:バッチサイズ1のみ対応しており、大きなコンテキストには適していません。
Marlin(Ampere 以降の GPU)
from transformers import AwqConfig, AutoModelForCausalLM
config = AwqConfig(
bits=4,
version="marlin" # 2x faster on A100/H100
)
model = AutoModelForCausalLM.from_pretrained(
"TheBloke/Mistral-7B-AWQ",
quantization_config=config
)
要件:Compute Capability 8.0 以上(A100、H100、RTX 40xx)
ExLlamaV2(AMD に対応)
config = AwqConfig(
bits=4,
version="exllama" # Faster prefill, AMD GPU support
)
HuggingFace Transformers との統合
直接読み込み
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"TheBloke/zephyr-7B-alpha-AWQ",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("TheBloke/zephyr-7B-alpha-AWQ")
融合モジュール(推奨)
from transformers import AwqConfig, AutoModelForCausalLM
config = AwqConfig(
bits=4,
fuse_max_seq_len=512, # Max sequence length for fusing
do_fuse=True # Enable fused attention/MLP
)
model = AutoModelForCausalLM.from_pretrained(
"TheBloke/Mistral-7B-OpenOrca-AWQ",
quantization_config=config
)
注記:融合モジュールは FlashAttention2 と組み合わせて使用できません。
vLLM との統合
from vllm import LLM, SamplingParams
# vLLM auto-detects AWQ models
llm = LLM(
model="TheBloke/Llama-2-7B-AWQ",
quantization="awq",
dtype="half"
)
sampling = SamplingParams(temperature=0.7, max_tokens=200)
outputs = llm.generate(["Explain AI"], sampling)
パフォーマンスベンチマーク
メモリ削減
| モデル | FP16 | AWQ 4-bit | 削減率 |
|---|---|---|---|
| Mistral 7B | 14 GB | 5.5 GB | 2.5倍 |
| Llama 2-13B | 26 GB | 10 GB | 2.6倍 |
| Llama 2-70B | 140 GB | 35 GB | 4倍 |
推論速度(RTX 4090)
| モデル | プリフィル(tok/s) | デコード(tok/s) | メモリ |
|---|---|---|---|
| Mistral 7B GEMM | 3,897 | 114 | 5.55 GB |
| TinyLlama 1B GEMV | 5,179 | 431 | 2.10 GB |
| Llama 2-13B GEMM | 2,279 | 74 | 10.28 GB |
精度(パープレキシティ)
| モデル | FP16 | AWQ 4-bit | 低下率 |
|---|---|---|---|
| Llama 3 8B | 8.20 | 8.48 | +3.4% |
| Mistral 7B | 5.25 | 5.42 | +3.2% |
| Qwen2 72B | 4.85 | 4.95 | +2.1% |
カスタムキャリブレーションデータ
# Use custom dataset for domain-specific models
model.quantize(
tokenizer,
quant_config=quant_config,
calib_data="wikitext", # Or custom list of strings
max_calib_samples=256, # More samples = better accuracy
max_calib_seq_len=512 # Sequence length
)
# Or provide your own samples
calib_samples = [
"Your domain-specific text here...",
"More examples from your use case...",
]
model.quantize(tokenizer, quant_config=quant_config, calib_data=calib_samples)
マルチ GPU デプロイ
model = AutoAWQForCausalLM.from_quantized(
"TheBloke/Llama-2-70B-AWQ",
device_map="auto", # Auto-split across GPUs
max_memory={0: "40GB", 1: "40GB"}
)
対応モデル
35以上のアーキテクチャに対応しています。
- Llama ファミリー:Llama 2/3、Code Llama、Mistral、Mixtral
- Qwen:Qwen、Qwen2、Qwen2.5-VL
- その他:Falcon、MPT、Phi、Yi、DeepSeek、Gemma
- マルチモーダル:LLaVA、LLaVA-Next、Qwen2-VL
よくある問題
量子化中に CUDA OOM が発生する場合:
# Reduce batch size
model.quantize(tokenizer, quant_config=quant_config, max_calib_samples=64)
推論が遅い場合:
# Enable fused layers
model = AutoAWQForCausalLM.from_quantized(model_name, fuse_layers=True)
AMD GPU のサポート:
# Use ExLlama backend
config = AwqConfig(bits=4, version="exllama")
非推奨化のお知らせ
AutoAWQ は正式に非推奨となりました。新しいプロジェクトでは、以下を検討してください。
- vLLM llm-compressor:https://github.com/vllm-project/llm-compressor
- MLX-LM:Apple Silicon 搭載 Mac デバイス向け
既存の量子化済みモデルは引き続き使用できます。
参考資料
- 論文:AWQ: Activation-aware Weight Quantization(arXiv:2306.00978)- MLSys 2024 最優秀論文
- GitHub:https://github.com/casper-hansen/AutoAWQ
- MIT Han Lab:https://github.com/mit-han-lab/llm-awq
- モデル:https://huggingface.co/models?library=awq
エージェントの作業手順
- 環境を確認します。 GPU の種類、メモリ、ドライバー/CUDA のバージョン(
nvidia-smi)、フレームワークのバージョン、データセットの保存場所とサイズを確認します。 - 入力を明確にします。 データまたはユーザーから、形式、識別子、パラメーターを確認します。結果を左右する値は推測せず、質問してください。
- まず小規模に実行します。 スモークテストとして、小さなモデルまたはサブセットを使い、少ないステップ数で実行し、損失が減少することとチェックポイントが保存されることを確認します。
- 上記の手順と参考情報を使って、タスク全体を実行します。
- 結果を検証します。 保留データでメトリクスを追跡し、ベースラインと比較して、シード、設定、ハードウェアを記録します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未確定の点を明記します。
| このような場合 | 対応 |
|---|---|
| CUDA のメモリ不足が発生する | バッチサイズを小さくする、勾配累積/チェックポイントまたは混合精度を有効にする、あるいはモデルをシャーディングします。 |
| 損失が NaN になる、または発散する | 学習率を下げ、データに無効な値がないか確認し、勾配クリッピングを有効にします。 |
| インストール済みバージョンに、手順で指定された関数、フラグ、エンドポイントがない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認して適宜対応し、ユーザーに伝えます。API を捏造してはいけません。 |
| 必須の入力、識別子、またはパラメーターが曖昧 | ユーザーに質問するか、実行前に仮定を明示します。 |
誠実性に関するルール
- 結果、パラメーター、識別子、引用、統計を捏造してはいけません。実行または検証できないことがあれば、明確に伝えます。
- ログがない限り、トレーニング結果を主張してはいけません。大規模なジョブを開始する前に、計算コストを見積もります。
- ここに記載されているバージョン固有の詳細は古くなっている可能性があるため、インストール済みバージョンの公式ドキュメントで確認します。
- 費用が発生する、共有 GPU またはクラウドのクォータを消費する、個人データまたは患者データに触れる、あるいは取り消せない操作を行う前に、許可を求めます。
関連するスキル
quantizing-models-bitsandbytes:精度の低下を最小限に抑えつつ、LLM を 8 ビットまたは 4 ビットに量子化して、メモリ使用量を 50~75%削減します。gptq:AutoGPTQ と transformers を使い、グループ単位の量子化(デフォルトのグループサイズは 128)を用いて、LLM を GPTQ で 4 ビット(3 ビットにも)に量子化します。serving-llms-vllm:vLLM の PagedAttention と連続バッチ処理を用いて、高スループットで LLM をサービングします。