コンテンツにスキップ

量子化が vLLM の推論性能に与える影響

量子化は、重みとアクティベーションを、通常の 32-bit 浮動小数点(float32)ではなく 8-bit 整数(int8)などの低精度データ型で表現することで、推論の計算コストとメモリ使用量を削減する手法です。

本書では、vLLM で一般的な量子化手法と、それらが推論性能、特に高並列度でのスループットに与える影響を評価します。

結論

  1. 重みとアクティベーションの量子化(FP8 など)は、品質低下を抑えつつ大幅な性能改善が得られるため、多くのシナリオで推奨します。静的量子化は動的量子化より高いスループットが得られますが、精度はキャリブレーションデータに依存します:

    • 動的 FP8: +14.8% TPS, -14.1% TTFT, -21.8% TPOT
    • 静的 FP8: +26.7% TPS, -20.4% TTFT, -32.4% TPOT
  2. 多くの量子化手法は、VRAM に制約がある場合にスループットを大きく改善します。実験では最大 +46% の改善が見られました。

  3. 重みのみの量子化は、VRAM に余裕がある場合、逆量子化のオーバーヘッドにより TPS、TTFT、TPOT の性能を低下させます。

  4. 重みのみを量子化する手法の中では、AWQ と GPTQ が最も高い推論性能を示します。bitsandbytes と GGUF は性能が低いか互換性に問題があるため、推奨しません。

  5. 実験では、AWQ と GPTQ のデフォルト vLLM カーネルがカスタムカーネルより高い性能を示しました。

  6. KV キャッシュの量子化によるスループット改善は、他の最適化手法と比べて比較的小さいものです。

技術的な背景

量子化の種類

量子化の種類 説明
重みのみ 学習後に重みだけを量子化し、アクティベーションは完全精度のまま保持
動的 重みを事前に量子化し、アクティベーションは推論時に動的に量子化
静的 代表的なデータセットによるキャリブレーション後、重みとアクティベーションを事前に量子化
量子化を考慮した学習 学習中に量子化をシミュレーションし、モデルを低精度に適応させる

キャリブレーション

キャリブレーションは、量子化時に float32 の値域を求める処理です。重みの実際の値域は量子化時に分かっているため、計算は比較的容易です。一方、アクティベーションの値域は明確ではなく、複数の手法が使われます:

  1. 学習後の動的量子化:実行時に各アクティベーションの値域をその場で計算します。少ない作業で良い結果が得られますが、毎回値域を計算するオーバーヘッドがあるため、静的量子化より遅くなることがあります。また、一部のハードウェアでは利用できません。

  2. 学習後の静的量子化:量子化時に各アクティベーションの値域を事前計算します。通常は代表的なデータをモデルに入力し、アクティベーションの値を記録します。実際の手順は次のとおりです: - アクティベーションにオブザーバーを配置し、値を記録します - キャリブレーション用データセットで一定回数の順伝播を実行します(約 200 件で十分です) - キャリブレーション手法に従い、各演算の値域を計算します

  3. 量子化を考慮した学習:学習後の静的量子化と同じ考え方で、学習時に各アクティベーションの値域を計算します。ただし、オブザーバーの代わりに「疑似量子化」演算子を使用します。値の記録に加えて量子化誤差もシミュレーションし、モデルが誤差に適応できるようにします。

KV キャッシュの量子化

KV キャッシュの量子化は、キーと値のキャッシュを低精度で保存して推論時のメモリ使用量を減らし、より多くのトークンをキャッシュできるようにしてスループットを改善します。vLLM は FP8(E4M3 と E5M2)に対応しますが、INT8 の KV キャッシュには対応していません。4-bit や 2-bit の KV キャッシュ量子化も研究されていますが、一般に MMLU スコアの低下など、明確な精度低下が生じます。

量子化カーネル

vLLM では、AWQ や GPTQ などの量子化方式向けに複数のカーネル実装を提供しています。AWQ は公式 AWQ カーネル、GPTQ モデルは ExLlamaV2 カーネルをデフォルトで使用します。Marlin や Machete などの最適化カーネルもあり、特に大きなバッチサイズで性能を高められます。

推論品質の低下

量子化は推論品質を低下させる場合があります。本書は主に性能指標を扱いますが、品質への影響を評価するための参考情報も示します:

各量子化手法による Qwen3-8B モデルのベンチマーク:

量子化 CEVAL MMLU GSM8K HUMANEVAL
BF16 79.27 74.78 87.79 63.41
FP8-Static 78.23 74.79 86.96 62.20
FP8-Dynamic 78.45 74.75 87.64 62.80
INT8-Dynamic 78.01 74.84 86.96 67.07
INT4-GPTQ 77.19 73.26 86.43 62.20
INT4-AWQ 76.15 73.59 86.96 63.41

詳細は AngelSlim のベンチマークを参照してください。

実験環境

  • モデル: Qwen3-8B
  • ハードウェア: NVIDIA RTX 4090 24GB / A100 80GB / H100 80GB
  • vLLM バージョン: v0.9.2
  • データセット: ShareGPT
  • ベンチマークスクリプト:
    1
    2
    3
    4
    5
    # Prepare the ShareGPT dataset
    wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
    
    # Benchmark on ShareGPT dataset
    vllm bench serve --model Qwen/Qwen3-8B --endpoint-type openai-chat --endpoint /v1/chat/completions --dataset-name sharegpt --dataset-path ShareGPT_V3_unfiltered_cleaned_split.json --num-prompts 1000
    

実験結果

RTX 4090

量子化手法 スループット (tok/s) 平均 TTFT (ms) 平均 TPOT (ms)
BF16 3869.3 15385.7 63.45
AWQ 5653.4 (+46.1%) 7913.4 87.7
AWQ Marlin 5536.7 (+43.1%) 8133.8 90.42
GPTQ (Int8) 4918.98 (+27.1%) 8415.70 96.07
GPTQ Marlin 5025.82 (+29.9%) 8143.93 93.05

A100 80GB

量子化手法 スループット (tok/s) 平均 TTFT (ms) 平均 TPOT (ms)
BF16 10338.25 3412.85 200.02
GPTQ-Marlin (Int4) 8146.73 10336.24 261.81
GPTQ (Int4) 8129.27 10414.74 261.64
AWQ 9611.61 3950.64 249.06
AWQ Marlin 8066.03 10506.70 264.33
GPTQ Marlin (Int8) 7119.60 12359.22 309.37
GPTQ (Int8) 7100.46 12380.82 309.34
bitsandbytes 5916.34 9115.43 252.91
GGUF (Q4_K_M) N/A N/A N/A

注記

qwen3 アーキテクチャの GGUF モデルはサポートされていません。

H100 80GB

量子化手法 スループット (tok/s) 平均 TTFT (ms) 平均 TPOT (ms)
FP8 静的 16452.52 (+26.7%) 4116.87 (-20.4%) 85.57 (-32.4%)
FP8 動的 15275.64 (+14.8%) 4445.10 (-14.1%) 98.94 (-21.8%)
Int4-W4A16 13605.46 5302.14 130.54
BF16 13305.38 5172.78 126.55
AWQ 9756.06 8794.29 209.13
GPTQ N/A N/A N/A

注記

GPTQ の実装に不具合があります。vLLM の issueを参照してください。

KV キャッシュの量子化

構成 スループット (tok/s) 平均 TTFT (ms) 平均 TPOT (ms)
BF16 (基準設定) 13305.38 5172.78 126.55
BF16 + KV キャッシュ FP8 (E4M3) 13513.19 (+1.6%) 5688.39 103.21