vLLM における LMCache のプリフィル高速化の評価
LMCache は、LLM 推論向けの拡張可能な KV キャッシュ層であり、大規模デプロイにおける主要な課題への対応を目的としています。本書では、vLLM 推論に対する LMCache の性能上の効果、特にプリフィルの高速化とさまざまなワークロードへの影響を評価します。
結論
-
キャッシュヒット率が高い場合、LMCache はプリフィルを大幅に高速化します。実験では、長コンテキスト(20K トークン)の複数ターン対話で、入力 TPS が最大 +355.3% 改善し、TTFT が -58.8% 短縮しました。
-
性能上の利点はワークロードに大きく依存します: - 適したシナリオ:共通プレフィックスや繰り返しパターンを含む複数ターンの対話 - 適さないシナリオ:キャッシュを再利用できるパターンのないランダムな入力
-
チャンクサイズの最適化:テストした構成では、デフォルトのチャンクサイズ 256 が最も良い結果を示しました。
-
キャッシュミスはオーバーヘッドを生みます。キャッシュを再利用できない場合は -3% ~ -15% の性能低下が見られました。このため、LMCache はプレフィックスのパターンを予測できるワークロードに最も適しています。
技術的な背景
LMCache の概要
LMCache は、次の機能で vLLM の KV キャッシュを拡張します:
| 要素 | 説明 |
| CPU へのオフロード | GPU VRAM の制約を超えてキャッシュ容量を拡張 |
| チャンク単位の管理 | 設定可能なチャンクサイズでキャッシュを効率的に保存・取得 |
| 複数バックエンド | ローカルストレージ、Redis、Mooncake などのカスタムバックエンドに対応 |
| 分散 KV キャッシュ | 複数の vLLM インスタンス間でキャッシュを共有 |
主なユースケース
- プレフィックスキャッシュのヒット率が低い場合:GPU VRAM の制約やキャッシュ追い出しの問題を緩和します
- 分散キャッシュ共有:複数の vLLM インスタンス間でキャッシュを共有できます
- PD 分離:プリフィルとデコードを分離したデプロイ構成をサポートします
実験環境
- モデル: Qwen3-8B
- ハードウェア: NVIDIA RTX 4090 24GB
- vLLM バージョン: v0.10.1.1
- ベンチマーク手法: 複数ターン対話のベンチマーク
推論サービスのコマンド
| # Standard vLLM serving
vllm serve Qwen/Qwen3-8B
# LMCache-enabled serving
##### lmcache_config.yaml
chunk_size: 256
local_cpu: true
max_local_cpu_size: 50
#####
LMCACHE_CONFIG_FILE=/root/lmcache_config.yaml vllm serve /root/Qwen3-8B \
--kv-transfer-config '{"kv_connector":"LMCacheConnectorV1", "kv_role":"kv_both"}'
|
ベンチマークスクリプト
| # Multi-turn bench scripts
# Ref: https://github.com/vllm-project/vllm/tree/main/benchmarks/multi_turn
##### generate_multi_turn.json
{
"filetype": "generate_conversations",
"num_conversations": 24,
"text_files": ["pg1184.txt"],
"print_stats": false,
"prompt_input": {
"num_turns": {
"distribution": "uniform",
"min": 12,
"max": 18
},
"common_prefix_num_tokens": {
"distribution": "constant",
"value": 500
},
"prefix_num_tokens": {
"distribution": "lognormal",
"average": 4000,
"max": 20000
},
"num_tokens": {
"distribution": "uniform",
"min": 120,
"max": 160
}
},
"prompt_output": {
"num_tokens": {
"distribution": "uniform",
"min": 80,
"max": 120
}
}
}
#####
python benchmark_serving_multi_turn.py --model $MODEL_PATH --input-file generate_multi_turn.json --num-clients 10 --max-active-conversations 10
|
実験結果
| 構成 | 入力 TPS | 合計 TPS | 平均 TTFT (ms) | 平均 TPOT (ms) |
| LMCache なし | 5849 | 5957 | 4350.48 | 48.47 |
| LMCache あり | 9426 (+61.2%) | 9592 | 2646.09 (-39.2%) | 30.60 (-36.9%) |
| 構成 | 入力 TPS | 合計 TPS | 平均 TTFT (ms) | 平均 TPOT (ms) |
| LMCache なし | 4312.17 | 4335.71 | 5070.52 | 33.91 |
| LMCache あり | 7750.60 (+79.7%) | 7792.92 | 2091.00 (-58.8%) | 25.83 (-23.8%) |
| 構成 | 入力 TPS | 合計 TPS | 平均 TTFT (ms) |
| LMCache なし | 7443.2 | 7443.6 | 4658.66 |
| LMCache あり | 33887.9 (+355.3%) | 33889.8 | 980.87 |
チャンクサイズの調整
| チャンクサイズ | 入力 TPS | 性能改善率 | 平均 TTFT (ms) |
| 64 | 33820.3 | +354.4% | 985.28 |
| 256 | 33887.9 | +355.3% | 980.87 |
| 1024 | 31634.0 | +325.0% | 1055.69 |
キャッシュミスのシナリオ(ランダムデータセット)
ベンチマークスクリプト
| vllm bench serve --model Qwen/Qwen3-8B --endpoint-type openai-chat --endpoint /v1/chat/completions --dataset-name random --random-input-len 1024 --random-output-len 128 --num-prompts 100 --seed 40
|
| 指標 | LMCache なし | LMCache あり | 変化 |
| 出力 TPS | 579.86 | 561.44 | -3.2% |
| 合計 TPS | 5212.32 | 5046.72 | -3.2% |
| 平均 TTFT (ms) | 8886.36 | 9242.72 | +4.0% |
| 平均 TPOT (ms) | 42.08 | 43.47 | +3.3% |
| 指標 | LMCache なし | LMCache あり | 変化 |
| 出力 TPS | 77.87 | 66.77 | -14.3% |
| 合計 TPS | 5060.79 | 4338.96 | -14.3% |
| 平均 TTFT (ms) | 80610.70 | 92682.22 | +15.0% |
| 平均 TPOT (ms) | 43.33 | 42.27 | -2.4% |
| 指標 | LMCache なし | LMCache あり | 変化 |
| 出力 TPS | 22.97 | 21.77 | -5.2% |
| 合計 TPS | 3698.09 | 3504.41 | -5.2% |
| 平均 TTFT (ms) | 277456.13 | 292811.62 | +5.5% |
| 平均 TPOT (ms) | 31.68 | 32.80 | +3.5% |
すべての VRAM KV キャッシュがヒットするシナリオ
| 指標 | LMCache なし | LMCache あり | 変化 |
| 出力 TPS | 5954.33 | 5752.71 | -3.3% |
| 合計 TPS | 53589.01 | 51802.45 | -3.3% |
| 平均 TTFT (ms) | 3052.08 | 3247.10 | +6.4% |
| 平均 TPOT (ms) | 38.40 | 39.04 | +1.7% |
| 指標 | LMCache なし | LMCache あり | 変化 |
| 出力 TPS | 3676.71 | 3656.30 | -0.6% |
| 合計 TPS | 238986.41 | 237659.44 | -0.6% |
| 平均 TTFT (ms) | 5060.41 | 5326.37 | +5.3% |
| 平均 TPOT (ms) | 54.37 | 53.86 | -1.0% |
| 指標 | LMCache なし | LMCache あり | 変化 |
| 出力 TPS | 2213.12 | 1972.32 | -10.9% |
| 合計 TPS | 356312.70 | 317543.74 | -10.9% |
| 平均 TTFT (ms) | 9649.76 | 10109.51 | +4.8% |
| 平均 TPOT (ms) | 87.10 | 94.26 | +8.2% |
| バックエンド | キャッシュミス (s) | キャッシュヒット (s) | 高速化率 |
| lmcache_server | 0.739 | 0.324 | 2.28x |
| Redis | 0.746 | 0.388 | 1.92x |
| Mooncake (TCP) | 0.759 | 0.362 | 2.10x |