vLLM推論サーバのオートスケール、どの指標で判断すべき?

質問者: 小原 佳 ・ 2026-07-01

社内向けLLM APIをvLLM(Llama 3.1 8B、L4 GPU)でKubernetes上に構築し、HPAでオートスケールさせようとしています。当初はGPU使用率(DCGM FI DEV GPU UTIL)でスケールさせましたが、vLLMはアイドル時でもKVキャッシュ確保やCUDAグラフの影響で使用率が高く出るため、負荷がないのにスケールアウトし続ける問題にぶつかりました。 試したこと: vLLMのメトリクス vllm:num requests waiting をPrometheus Adapter経由でHPAのカスタムメトリクスに設定(スケールアウトの判断自体はまともになった) ただしPod起動からモデルロード完了まで約4分かかり、朝会後のスパイクに全く間に合わない モデルをhostPathの共有キャッシュに置いてロードを約90秒まで短縮(それでもスパイクには不十分) 制約: GPUノードは常時2台、ピーク時最大6台まで p95のTTFTを3秒以内に保ちたい 常時6台分を確保する予算はない queue depthベースのスケールに加えて、時間帯ベースの予測スケーリングやウォームプールを組み合わせるのが定石でしょうか。KEDAのcron scalerとの併用など、実例があれば知りたいです。

回答(あすか)

同じ構成を本番で運用しているので、実際にやったことをまとめます。 実装のポイント バッチサイズは 208 前後から始めて、レイテンシ要件に合わせて調整します。 落とし穴 infra sre でよくある誤解 : デフォルト設定のまま本番に出すこと。負荷特性が変わると挙動が一変します リトライは冪等性が担保されている操作にだけ入れる 監視は成功率だけでなく分布(p95/p99)を見る 根拠となる一次情報はこちら: https://example.com/reference/infra sre 25 。手元でも同じ結果を確認しました。 補足: 過去に同種の構成で 6 件の本番導入を経験しています。

回答(ヒロ)

この問題は3つの原因に分解できます。順に切り分けるのが早いです。 切り分け手順 1. まず現状のベースラインを計測する(p50/p95 を分けて見る) 2. ボトルネックを特定してから対策を選ぶ 3. 変更は1つずつ入れて差分を確認する 実装のポイント バッチサイズは 56 前後から始めて、レイテンシ要件に合わせて調整します。 検証環境: 手元の再現リポジトリで動作確認済みです。参考: https://example.com/docs/infra sre と https://example.com/blog/6

回答(招待テスト)

結論: キュー滞留( num requests waiting )を主指標に、KVキャッシュ使用率を上限ガードに GPU使用率での判断はご経験どおり不適切です。vLLMは連続バッチングのためアイドルでもCUDAグラフ/KVキャッシュ確保でDCGMのGPU UTILが高止まりします。実運用で機能する構成は次の2段です。 1. スケールアウト判断: vllm:num requests waiting 待ち行列の長さは「サービング能力の不足」を直接表します。HPAのカスタムメトリクスで平均値 5〜10 を閾値にします。 L4 + 8B ではモデルロードに1〜2分かかるため、scaleUp は速く・scaleDown は遅く(上記の非対称 behavior)が肝です。 2. 飽和ガード: vllm:gpu cache usage perc waiting が 0 でも KV キャッシュが 90% を超えるとプリエンプションで p95 が壊れます。この2つを OR 条件で併用します(HPA は複数 metrics のうち最大レプリカ数を採用する仕様)。 補足 リクエストレート(RPS)ベースは入出力トークン長の分散が大きい LLM では誤導になりがちなので使わない スパイクが激しいなら HPA でなく KEDA + Prometheus scaler で waiting と成功レートの複合条件も選択肢 検証手順: vllm bench serve で concurrency を 1→64 に漸増させ、waiting 閾値・キャッシュ90%到達時の p95 変化を確認してから閾値を確定 出典: vLLM 公式 Production Metrics ドキュメント( /metrics エンドポイントの定義)、Kubernetes HPA v2 behavior 仕様。上記 YAML は HPA v2(K8s 1.27+)で適用確認済みです。