mcpField
A
awq-quantization

awq-quantization

github.com/kalarislabs開発9657 回インストール3 日前に更新
リポジトリ

awq-quantization について

AWQは、推論向けのモデルメモリ削減を目指す開発者向けのLLM 4-bit量子化スキルです。活性化パターンに基づいて重要な重みを保護し、複数のカーネルバックエンドとTransformers、vLLMとの連携に対応します。AutoAWQは非推奨です。

主な機能

  1. 01活性化パターンに基づく重要重みの保護
  2. 024-bitモデルの量子化と読み込み
  3. 03GEMM、GEMV、Marlinバックエンド
  4. 04TransformersとvLLMとの連携
  5. 05カスタム校正データとマルチGPU対応

活用シーン

  1. 01推論メモリを抑えるモデル量子化
  2. 02vLLMによるAWQモデルのデプロイ
  3. 03特定分野モデル向け校正データの設定
  4. 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 の比較

特徴AWQGPTQbitsandbytes
高速化(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)

パフォーマンスベンチマーク

メモリ削減
モデルFP16AWQ 4-bit削減率
Mistral 7B14 GB5.5 GB2.5倍
Llama 2-13B26 GB10 GB2.6倍
Llama 2-70B140 GB35 GB4倍
推論速度(RTX 4090)
モデルプリフィル(tok/s)デコード(tok/s)メモリ
Mistral 7B GEMM3,8971145.55 GB
TinyLlama 1B GEMV5,1794312.10 GB
Llama 2-13B GEMM2,2797410.28 GB
精度(パープレキシティ)
モデルFP16AWQ 4-bit低下率
Llama 3 8B8.208.48+3.4%
Mistral 7B5.255.42+3.2%
Qwen2 72B4.854.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 は正式に非推奨となりました。新しいプロジェクトでは、以下を検討してください。

既存の量子化済みモデルは引き続き使用できます。

参考資料

エージェントの作業手順

  1. 環境を確認します。 GPU の種類、メモリ、ドライバー/CUDA のバージョン(nvidia-smi)、フレームワークのバージョン、データセットの保存場所とサイズを確認します。
  2. 入力を明確にします。 データまたはユーザーから、形式、識別子、パラメーターを確認します。結果を左右する値は推測せず、質問してください。
  3. まず小規模に実行します。 スモークテストとして、小さなモデルまたはサブセットを使い、少ないステップ数で実行し、損失が減少することとチェックポイントが保存されることを確認します。
  4. 上記の手順と参考情報を使って、タスク全体を実行します。
  5. 結果を検証します。 保留データでメトリクスを追跡し、ベースラインと比較して、シード、設定、ハードウェアを記録します。
  6. 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、未確定の点を明記します。
このような場合対応
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 をサービングします。

コメント