3行でいうと
- vLLMは、Prometheus形式の指標を
/metricsで出します。見る場所は大きく3つです。待ち行列(実行中と待ちの数)、KVキャッシュの使用率、応答時間(最初の1トークンまで、トークンの間隔、全体)です。 - KVキャッシュの空きがなくなると、vLLMは実行中の依頼をいったん戻して、あとで計算し直します(プリエンプション)。公式の対処は、メモリの割合を上げる、同時に扱う量を下げる、GPUを増やす、の3方向です。
- 公式の文書には、名前の不一致や、廃止された指標、一覧の本体が読めない節もあります。ダッシュボードを作る前に、自分のバージョンの
/metricsの出力を直接見て確かめるのが安全です。
この記事は、実際に使って確かめた記録ではありません。この記事は公式の文書を読んでまとめたもので、実際に使って確かめた記録ではありません。数字と設定の既定値は2026年10月16日に確認しました。変わることがあります。
先に結論
- 運用で最初に見るのは、
vllm:num_requests_waiting(待っている依頼の数)、vllm:kv_cache_usage_perc(KVキャッシュの使用率)、vllm:time_to_first_token_seconds(最初の1トークンまでの時間)の3つです。公式の設計文書が「見るべき指標」として分類している中から、まず余裕と遅延を見る、というのが僕らの読み方です。 - 「遅い」の原因は、公式の時間の定義に沿って切り分けられます。待ち行列で待った時間、最初の計算(プリフィル)の時間、続きを作る時間(デコード)です。それぞれに別の指標があります。
- メモリ不足の対処は、設定の名前が公式に並んでいます。ただし、どの設定が効くかは、モデルとGPUと依頼の長さで変わります。公式は数値の目安をほとんど書いていないので、自分の負荷で比べる必要があります。
前提:何を運用するのか
vLLMは、モデルを読み込んで、複数の依頼をまとめて処理し、返事を作るサーバーのソフトウェアです。OpenAIのAPIと同じ形で呼べるサーバーを持ちます。しくみの中心にあるKVキャッシュ(会話の途中までの計算結果をGPUのメモリに置いておく場所)の工夫は、別の記事で扱っています。
運用側から見ると、vLLMは「GPUのメモリに、モデルの重みとKVキャッシュを置き、依頼を少しずつ束ねて回す」装置です。メモリの空きと、束ねる量が、速さと止まりにくさを決めます。
指標の出し方
公式の「Production Metrics」の文書によると、OpenAI互換のサーバーの/metricsにアクセスすると、Prometheus(指標を集める定番のしくみ)が読める形式で指標が出ます。例はvllm serve unsloth/Llama-3.2-1B-Instructで起動して、curl http://0.0.0.0:8000/metricsで見る、というものです。
指標には、model_nameのラベルがつきます。文書は、Prometheusサーバーの設定やスクレイプの手順までは書いていません。
見るべき指標の地図
公式の設計文書(Metrics)は、指標を型(ゲージ、カウンター、ヒストグラム)つきで挙げ、見るべき指標の分類も載せています。それを元に、僕らが表にまとめました。
| 見たいこと | 指標(公式の名前) | 型 |
|---|---|---|
| 待ち行列 | vllm:num_requests_running、vllm:num_requests_waiting(後者は、設計文書の「_waitingもある」という書き方から組み立てた名前) |
ゲージ |
| KVキャッシュの余裕 | vllm:kv_cache_usage_perc(使用中のブロックの割合、0〜1) |
ゲージ |
| 最初の1トークンまで | vllm:time_to_first_token_seconds |
ヒストグラム |
| トークンの間隔 | vllm:inter_token_latency_seconds、vllm:request_time_per_output_token_seconds |
ヒストグラム |
| 全体の時間 | vllm:e2e_request_latency_seconds |
ヒストグラム |
| 時間の内訳 | vllm:request_queue_time_seconds、vllm:request_prefill_time_seconds、vllm:request_decode_time_seconds |
ヒストグラム |
| 処理量 | vllm:prompt_tokens_total、vllm:generation_tokens_total、vllm:request_success_total |
カウンター |
| 依頼の形 | vllm:request_prompt_tokens、vllm:request_generation_tokens |
ヒストグラム |
| キャッシュの効き | vllm:prefix_cache_hits、vllm:prefix_cache_queries |
カウンター |
プレフィックスキャッシュ(同じ前置きの計算結果を使い回す仕組み)の効き具合は、2つのカウンターの比で出す、と文書にあります。文書の例の式は、rate(vllm:prefix_cache_hits[5m]) / rate(vllm:prefix_cache_queries[5m])の形です(ただし、文書の例は実在しない仮の名前で書かれていて、上の式は実在の名前に直した僕らの書き換えです。動作確認はしていません)。
時間の測り方の定義
数字を比べるときに、定義の違いで混乱しやすい点が、設計文書に書かれています。
- TTFT(最初の1トークンまでの時間)は、フロントエンドが依頼を受けて、トークン化を始めた時点から測ります。入力の処理の時間も入ります。
- TPOT(1トークンあたりの出力時間)は、(全体の時間 − TTFT)÷(出力トークン数 − 1)です。出力が1トークン以下の依頼では0として記録されます。
- ITL(トークン間の間隔)は、ストリームで出力が届くたびに1つ記録されます。
- 性能試験の道具
vllm bench serveは、1トークン以下の依頼をTPOTの統計から外しますが、Prometheusのヒストグラムは外しません。2つの数字は食い違うことがある、と書かれています。
エンジンの中では、依頼に対してQUEUED(待ち行列に入った)、SCHEDULED(初めて実行に回った)、PREEMPTED(待ちに戻された)、NEW_TOKENS(出力ができた)の時刻が記録され、待ち、プリフィル、デコードの時間が計算されます。プリフィルの途中で戻されると(文書は「そのような事象が起こりうるなら」と前置きしています)TTFTが延び、デコードの途中で戻されるとトークンの間隔が延びる、と書かれています。
負荷とメモリ:困ったときに触る設定
KVキャッシュが足りなくなると何が起きるか
公式の「Optimization and Tuning」の文書によると、KVキャッシュの空きがなくなると、vLLMは、ほかの依頼のために一部の依頼を中断(プリエンプト)して、空きができてから計算し直します。ログには、「Sequence group 0 is preempted by PreemptionMode.RECOMPUTE mode…」という趣旨の警告が出ます。V1の既定は、メモリを退避する方式(SWAP)ではなく、再計算(RECOMPUTE)です。
文書が挙げる対処は次の4つです。
gpu_memory_utilizationを上げる(KVキャッシュに使えるメモリが増える)。max_num_seqsまたはmax_num_batched_tokensを下げる(同時に扱う量が減る)。tensor_parallel_sizeを上げる(モデルをGPUで分ける。同期のぶんの負担が増えうる)。pipeline_parallel_sizeを上げる(遅延が増えうる)。
発生回数は、Prometheusの指標か、disable_log_stats=Falseにして累積のプリエンプションの回数をログに出す、と書かれています。ただし、僕らが読んだ指標の表には、プリエンプションの回数そのものの指標名は見つかりませんでした。Production Metricsの文書の、ヒストグラムの区切りを変える設定の表には vllm:request_num_preemptions という名前が出ていますが、何を数える指標かの説明は読めていません。
見立てです。vllm:kv_cache_usage_percが1に近いまま、vllm:num_requests_waitingが増え続けているなら、メモリが詰まっている可能性があります。そこにプリエンプションの警告が重なれば、上の4つを検討する根拠になります。この組み合わせの読み方は公式の記述ではなく、僕らの推測です。
束ねる量とTTFT・ITLのトレードオフ
チャンク化プリフィル(長い入力を分けて計算する仕組み)は、V1では可能な場合に既定で有効です。デコード待ちの依頼を先にまとめ、残ったmax_num_batched_tokensの枠でプリフィルを進め、入らない分は自動で分割されます。文書によると、この値は次のように効きます。
- 小さい値(例:2048)は、トークンの間隔(ITL)がよくなります。
- 大きい値は、最初の1トークンまで(TTFT)がよくなります。
- 8192を超える値は、処理量のために勧められています。とくに大きなGPU上の小さなモデルです。
つまり、チャットのように「流れる速さ」を重視するか、バッチ処理のように「処理量」を重視するかで、同じ設定の最適値が違います。
メモリを節約する手段
「Conserving Memory」の文書は、メモリを節約する手段を並べています。モデルを複数のGPUに分ける(tensor_parallel_size)、量子化したモデルを使う、max_model_len(文脈の長さ)とmax_num_seqs(同時の数)を下げる、などです。CUDAグラフ(GPUの処理を記録して再利用する高速化)は既定で使われ、追加のGPUメモリを使います。enforce_eager=Trueで無効にできます。
公式の既定値と、運用時の環境変数
既定値(2026年10月16日に読んだ時点。mainブランチの文書とソースの記載)
| 項目 | 既定値や内容 | 出どころ |
|---|---|---|
gpu_memory_utilization |
0.92。1つのvLLMインスタンスごとの上限で、同じGPUの他のインスタンスの分は制限しない | CacheConfigのソース |
block_size |
指定なしで16 | 同上 |
enable_prefix_caching |
有効(True) | 同上 |
| チャンク化プリフィル | V1では可能なら有効 | Optimization and Tuning |
| プリエンプションの方式 | 再計算(RECOMPUTE) | 同上 |
| 最適化レベル | -O2 |
同上 |
mm_processor_cache_gb |
4 GiB | 同上、Conserving Memory |
| 統計の要約ログ | 5秒ごとにINFOで出力 | Metrics(設計文書) |
要約ログには、実行中と待ちの数、GPUキャッシュの使用率、毎秒のトークン数、プレフィックスキャッシュのヒット率が出ます。
トラブル対応の環境変数(Troubleshootingより)
VLLM_LOGGING_LEVEL=DEBUG:詳しいログ。VLLM_LOG_STATS_INTERVAL=1.:待ち行列とキャッシュの統計を、より短い間隔で出す。VLLM_TRACE_FUNCTION=1:トークン生成が100倍以上遅くなるので、必要なときだけ。CUDA_LAUNCH_BLOCKING=1、NCCL_DEBUG=TRACEも挙げられています(用途の説明は、この記事では確認できていません)。
文書は、デバッグが終わったら外すことを注意しています。--load-format dummyで重みの読み込みを飛ばして、切り分けに使える、と書かれています。
KVキャッシュの寿命の指標
--kv-cache-metrics-sample(設計文書の名前。使い方の文書は--kv-cache-metricsと書いていて、文書の間で揺れています。自分のバージョンのヘルプで確かめます)を付けると、KVのブロックの寿命(vllm:kv_block_lifetime_seconds)、最後に触れてから追い出されるまで(vllm:kv_block_idle_before_evict_seconds)、再利用の間隔(vllm:kv_block_reuse_gap_seconds)が取れます。
運用で引っかかりやすい点
公式の文書そのものに書かれている注意です。
- 名前の不一致。 Grafanaのダッシュボードのパネルは、
_totalのない名前(vllm:prompt_tokensなど)を参照している箇所がある、と設計文書にあります。文書は両者を突き合わせていません。ダッシュボードを使うときは、自分のサーバーの出力と見比べます。 - 廃止された指標。 旧来のスワップ方式の指標(
vllm:num_requests_swapped、vllm:cpu_cache_usage_perc)はV1に関係がなく、--swap-spaceのフラグも削除されています。vllm:avg_prompt_throughput_toks_per_sは、廃止のあとで削除された、と書かれています。 - 廃止の手順。 非推奨にした指標は、次のバージョンで隠れ、その次で削除されます。隠れた指標は
--show-hidden-metrics-for-version=X.Yで再び出せます。バージョンを上げるたびに、ダッシュボードの指標名を確かめる必要があります。 - プロセスの指標。
--api-server-countが1より大きいと、Python標準のprocess_*、python_*の指標は出ません。 - 一部の指標は追加の設定が要る。 詳しい時間(
vllm:model_forward_time_millisecondsなど)はOpenTelemetryの追跡(--collect-detailed-traces)が要り、MFU(計算資源の使用率)の指標は--enable-mfu-metricsが要ります。
見立て:最初に作る画面
ここからは僕らの見立てです。公式が勧める手順ではありません。
- 最初は、待ち(
num_requests_waiting)、KVキャッシュの使用率、TTFTとITLの上位(たとえば95パーセンタイル)、処理量の4つだけを1画面に並べます。指標は多いので、全部は見ません。 - 設定を変えるときは、1回に1つだけ変え、変更の前後で同じ負荷をかけて比べます。
max_num_batched_tokensのようにTTFTとITLが逆に動く設定は、とくにそうです。 - アラートは、使用率の高さ単独ではなく、「待ちが増え続けている」ことと組み合わせます。使用率が高いこと自体は、メモリを使い切るvLLMの通常の姿だと思います。
気をつけること
- この記事は、実際に使って確かめた記録ではありません。内容は公式の文書の記載です。URLと
curlの例は文書にあるもので、PromQLの式は僕らの書き換えで、動作確認はしていません。 - vLLMの公式サイト(docs.vllm.ai)は、取得の仕組みでは本文が取れず、目次だけが返りました。そこで、公式リポジトリ(GitHub)のmainブランチにある文書とソースを読みました。安定版(リリース済みのバージョン)と記述や既定値が違う可能性があります。自分のバージョンの文書を確認してください。
- 取得の仕組みはページを要約して返すため、細部が落ちている可能性があります。
- 「Production Metrics」の文書の指標一覧の本体(General Metricsの節)は、別ファイルの差し込みで、読めませんでした。このため、一覧は設計文書の表に基づきます。名前や型が、実際の出力と違う場合があります。
- プリエンプションの回数を示す指標の説明(名前らしきものは文書の表にありますが、意味は読めていません)、
/healthなどの稼働確認の方法、Prometheusとダッシュボードの設定手順は、読んだ範囲では確認できていません。書かれていない、とは断定できません。 gpu_memory_utilizationの既定値0.92は、mainブランチのソースの記載です。ほかのバージョンでは違うかもしれません。- 「見立て」の部分は、僕らの整理です。公式が推奨する手順そのものではありません。
出典
- Metrics(vLLM設計文書、vLLMプロジェクト、10月16日確認)
- Production Metrics(vLLM docs、vLLMプロジェクト、10月16日確認)
- Optimization and Tuning(vLLM docs、vLLMプロジェクト、10月16日確認)
- Conserving Memory(vLLM docs、vLLMプロジェクト、10月16日確認)
- Troubleshooting(vLLM docs、vLLMプロジェクト、10月16日確認)
- CacheConfig(vLLMのソースコード、vLLMプロジェクト、10月16日確認)
更新履歴
- 2026年10月25日 書き方を直しました。
- 前:運営者が使っていないと読める書き方 → いま:「この記事は、実際に使って確かめた記録ではありません」。公式の資料を読んでまとめた記事で、使い心地は書いていない、という意味に直した
