TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

NVIDIA Dynamo: プリフィルドecodeの分離と、KVが存在する場所へのルーティング

ステータス: ドラフト (2026-10-13)、一部実測値あり。 論文、公式ドキュメント、NVIDIAブログは2026-10-13に直接アクセスして確認しました。ドキュメントはDynamo v1.5.1(2026-10-07)を基準としています。NVIDIAが発表したパフォーマンス数値は「メーカー発表値」として記載しています。実測値は同サイトの「トス ML/AI Infra 準備」の第14편(8GBクラスGPU、vLLM)および第24편(Dynamo 1.6.0開発ビルド、8GBクラス・24GBクラスGPU、0.6Bモデル)から再引用しました。NVLinkやRDMAで接続された環境における分散サービングのメリットは未実測です。 作成ルール: 実測データを基本とし、測定できなかったものは「未実測」、確認できなかったものは「未確認」と表示します。

NVIDIA Dynamo: プリフィルドecodeの分離

目次

1. プリフィルとデコードは同じGPU上で互いに干渉し合う

긴 프롬프트가 끼어들 때 디코드에 생기는 일 요청 A 가 15ms 마다 토큰을 내는 중, 긴 프롬프트 B 가 들어온다 (가) 한 GPU 에서 함께 GPU B 프리필 A 의 다음 토큰이 227ms 늦다(실측) (나) 프리필·디코드 분리 디코드 GPU B 의 토큰 → 프리필 GPU B 프리필 KV 전송 0ms 200ms 400ms 600ms · 분리하면 A 의 토큰 간격은 고르게 유지된다. · 대신 B 의 첫 토큰에 KV 를 옮기는 시간이 더해진다. 전송 시간 = 토큰당 KV × 입력 토큰 ÷ 링크 속도 227ms: 8GB급 GPU·vLLM 기본 청크 2,048 실측. 전송 길이는 설명용.
図: 長いプロンプトがデコードに割り込む様子と、分離した場合の様子

第1回で説明したように、プリフィルは計算に、デコードはメモリ帯域幅に制約されます。両者が1つのGPUを共有すると問題が発生します。連続バッチング(Continuous Batching)は新しいリクエストのプリフィルをデコードのステップの間に挿入しますが、プリフィルの長いステップは時間がかかり、その間バッチ内の他のリクエストは次のトークンを受け取れなくなります。

我々の実測値。 8GBクラスのGPUにおいてvLLMのデフォルト設定(1ステップあたりの入力上限2,048トークン)でデコード中のリクエストの傍らに3,500トークンの入力を割り込ませたところ、その区間における最大トークン間隔は227msでした(3回測定して227ms・226ms・226ms)。通常時の間隔は約15msです。第2回のチャンクプリフィル(Chunked Prefill)によってこの値を69msまで短縮できましたが、その代償として長い入力の最初のトークンがわずかに遅れました。 チャンクは干渉を分割するだけで、完全に解消することはできません。

分散サービングを初めて体系的に扱った2つの論文は、この問題を次のように指摘しています。

2. 分散サービング: 分離とKVの移行

アプローチはシンプルです。 プリフィル専用GPUとデコード専用GPUを個別に用意します。 プリフィルGPUがプロンプトのKVを生成したら、そのKVをデコードGPUに送信し、デコードGPUは受け取ったKVの続きからトークンを生成します。

DistServeの測定結果。 A100 80GB(ノード内NVLink、ノード間25Gbps)、OPT-13B・66B・175Bを使用し、レイテンシー目標を90%以上満たす最大リクエストレート(Goodput)を測定しました。

ワークロード モデル vLLM比較の処理能力(リクエストレート) vLLM比較のレイテンシー目標
チャットボット(ShareGPT) OPT-13B・66B・175B 2.0〜4.6倍 1.8〜3.2倍 厳格
コード補完(HumanEval) OPT-66B 5.7倍 1.4倍 厳格
要約(LongBench) OPT-66B 4.3倍 12.6倍 厳格

他のベースライン(DeepSpeed-MII)と比較した場合は最大7.4倍であり、アブストラクトの「リクエストレート最大7.4倍またはレイテンシー目標12.6倍厳格」という記述はこれら2つの表を合わせた値です。同期的検証の例も直感的です。13BモデルをA100 1枚に配置した場合は約1.6リクエスト/秒でしたが、プリフィルのみの場合は5.6、デコードのみの場合は10リクエスト/秒を記録し、プリフィル2枚+デコード1枚に分割した場合はGPUあたり3.3リクエスト/秒となり2.1倍に向上しました。

KV転送はどうだったでしょうか。論文では、OPT-66Bの512トークンのリクエスト1つあたりのKVは約1.13GBであり、秒間10リクエストであれば11.3GB/sが必要であると計算しています。そのため、プリフィルとデコードを 同一ノード内(NVLink) に配置するように設計されており、その結果OPT-175Bにおいて転送が全体レイテンシーに占める割合は0.1%未満でした。

Splitwiseの測定結果。 KVを レイヤーごとに非同期で 送信し、次のレイヤーの計算とオーバーラップさせました(InfiniBand)。オーバーラップさせられなかった転送は、A100で約8ms、H100で約5msであり、プロンプト計算時間の7%未満にとどまり、全体のレイテンシーには0.8%を加算するにとどまりました。消費電力が同一の条件下において、A100のみで分割した構成は基準(A100単体)の2.15倍のスループットを記録しました(本文図18a)。アブストラクトの代表的な数値(「コスト20%削減しつつ1.4倍」、「同一コスト・電力で2.35倍」)は本文の実験と完全に対応するペアが見つからなかったため、ここでは本文の数値のみを記載します。

3. NVIDIA Dynamoの構成

Dynamo: 분리 서빙과 KV 인지 라우팅 프런트엔드 OpenAI 호환 API · 토큰화 KV 인지 라우터 워커마다 비용 = 새로 계산할 프리필 블록 (이미 가진 블록은 뺌) + 디코드 부하 → 가장 싼 곳 블록 색인 워커 1: ■■■□ 워커 2: ■□□□ 프리필 워커 계산 위주 · 큰 텐서 병렬 등 워커 1 워커 2 디코드 워커 메모리 위주 · 큰 배치 워커 3 워커 4 NIXL 로 KV 전송 NVLink · RDMA(UCX) · TCP · 저장소(GDS 등) ↑ 워커가 블록 저장·삭제 이벤트를 라우터에 알림 플래너 대기열·KV 사용률·지연 목표를 보고 프리필·디코드 워커 수를 늘리고 줄인다 KV 오프로딩 GPU → CPU → 디스크 → 객체 KVBM(1.5 에서 폐지 예고) 또는 LMCache 등 엔진 연결
図: Dynamoの構成: フロントエンド、KVアウェア・ルーター、プリフィル・デコードワーカー、NIXL、プランナー

DynamoはvLLM・SGLang・TensorRT-LLMといったエンジン の上で 複数のGPUや複数のノードを統合するサービングフレームワークです。エンジンそのものを置き換えるのではなく、複数のエンジンをどのように分割し、どこへルーティングすべきかを担当します。ドキュメント(v1.5.1)で確認した構成は以下の通りです。

4. なぜスループットが向上するのか

要因 何が変化するか 根拠
干渉の排除 デコードGPUに長いプリフィルが割り込まないため、トークン間隔の目標値を守りながらデコードバッチを拡大できる 実測値(干渉227ms)、DistServe・Splitwise
フェーズごとの最適化 プリフィルとデコードに異なる並列化手法・GPU数・ハードウェアを割り当てる。プランナーが比率を負荷に合わせる DistServe(2.1倍の例)、Splitwise
キャッシュヒット 同一のプレフィックスを持つワーカーに送信することで、プリフィル自体をバイパスする 実測値(第5節)、メーカー発表値
ワーキングセットの分割 プレフィックスがワーカーごとに分散され、各ワーカーのGPUキャッシュに自身の担当分が完全に収まる 実測値(第5節)

NVIDIAの発表数値は以下の通りです。すべて メーカー発表値であり、直接再現したものではありません。

5. 実際に測定してみた Dynamo

別のシリーズにて、Dynamo(1.6.0 開発ビルド、vLLM 0.30.0、NIXL 1.3.2)を Qwen3-0.6B(トークンあたりの KV 114,688 バイト)で再測定しました。

KV 認識ルーティング。 ワーカーを 2 つ起動し、約 1,500 単語のプレフィックス 12 種を 6 回ずつ混ぜて送信しました(再リクエスト 60 回)。再リクエストが同じプレフィックスの KV を持つワーカーに向かった場合、初トークンは約 15ms、そうでない場合は約 80ms でした。

ルーティング 60 回中のヒット(3回) 初トークン平均
ラウンドロビン 35, 40, 43 34〜42ms
ランダム 44, 31, 45 32〜46ms
KV 認識、近似モード 60, 53, 60 15〜26ms
KV 認識、イベントモードだがイベントなし 39, 44, 41 32〜38ms
KV 認識、イベントモード 60, 60, 60 15ms

分散サービング。 結果は逆でした。すべて単独サービングより遅くなりました。

構成(同時実行 1) 1,500 単語 3,000 単語
8GB 級 GPU 単独 78ms 172ms
同一 GPU 1 枚をプリフィル・デコードプロセスに分割 406ms 812ms
異なる 2 つのサーバーに分割(1GbE 級リンク) 1,721〜1,752ms 3,407〜3,533ms

これは「分散サービングが遅い」のではなく、**「遅いリンクで分割すると遅い」**ということです。論文が NVLink や InfiniBand を前提としている理由がこの表にあります。

6. Dynamo と LMCache の関係

両者は競合関係ではなく、レイヤーが異なります。LMCache は 単一エンジンの側で KV を保存・ロードするキャッシュ層であり、Dynamo は 複数のエンジンを束ねて分割・送信するフレームワークです。ドキュメントで確認した統合ポイントは以下の通りです。

7. メリットがないケース

分散サービングの損益は、パート 3 と同様の形式の式で見積もることができます。 初トークンに追加される時間 ≈ トークンあたりの KV × 入力トークン ÷ リンクスループット(レイヤーごとの転送により、一部は計算と重複させて隠すことができます)。入力 4,096 トークンの KV を転送する時間を計算すると、次のようになります(転送時間のみ、計算を除く)。

リンク速度は、1GbE 級が当社の実測実効値で 104MB/s、100Gb/s が理論値で 12.5GB/s、NVLink 級が DistServe の論文に記載されている A100 間での 600GB/s です。

モデル KV サイズ 1GbE 級 100Gb/s NVLink 級
Qwen3-0.6B 470MB 4.5 秒 38ms 0.8ms
Llama 3.1 8B 537MB 5.2 秒 43ms 0.9ms
Llama 3.1 70B 1.34GB 12.9 秒 107ms 2.2ms

この値が削減できるもの(干渉により遅延していたデコード、過剰に確保されていた GPU)よりも大きい場合、損失となります。したがって、分散がメリットを持たない、または損失になるケースは以下の通りです。

Dynamo のドキュメントにも、普遍的な閾値はないと記載されています。モデル、GPU、入力長の分布によって境界が変化するため、初期バージョン(v0.1.0)では「プレフィックスヒットを差し引いたプリフィル長が閾値を超え、かつリモートプリフィールのキューが短い場合のみ」リモートプリフィルを使用しており、v1.5.1 ではルーターコストに応じて条件付きで分割する機能が実験的ステージとして導入されています。 分散させるかどうかは、自分のリンクにおける KV 転送のスループットを最初に測定し、その値を使って上記の式を計算した上で 決定するのが安全です。

KV 認識ルーティングは事情が異なります。KV を転送するのではなく リクエストを KV の側へ移動させるため 、リンクコストが発生しません。同じプレフィックスが再送されるような負荷であれば、比較的損失が発生しにくくなります。ただし、特定のワーカーに負荷が偏らないように負荷ウェイトを調整し、イベントが実際に届いていることを確認する必要があります。

8. シリーズのまとめ

回 何を削減するか いつ効果が大きいか いつ効果がないか
1. KV キャッシュ 過去のトークンの K・V の再計算 常に(出力が同じ場合) — 代わりにメモリを消費する
2. PagedAttention・連続バッチング・プレフィックスキャッシュ メモリの無駄遣い、空きスロット、同一プレフィックスの計算 同時リクエストが多い時、共通プロンプト ワーキングセットが GPU より大きい場合にキャッシュがクリアされる
3. LMCache GPU 外に配置した KV によるプリフィルの代替 長文脈、再利用が多い、高速なストレージパス 短い入力、低いヒット率、遅いリンク、小さな容量
4. Dynamo 干渉の排除、段階的なカスタマイズ、KV 側へのルーティング 高負荷、長いプロンプト、GPU 間の高速なリンク 遅いリンク、1 枚のカード、低負荷、小規模モデル

4 つの回を貫く質問は 1 つでした。 「この KV を再計算することと、どこかから持ってくることのどちらが安価か。」 答えは、モデルのトークンあたり KV サイズ、GPU の計算速度、KV が通過するパスの速度、そして同じプレフィックスがどれくらいの頻度で再送されるかによって決まります。これらはいずれも測定可能な値です。

T-i の一言。 サーブの練習をしている人とラリーの練習をしている人を同じテーブルに置くと、お互いにボールを待たなければならず、両者にとってマイナスになります。テーブルを分ければ改善されます。しかし、ボールカゴを隣の建物から運ばなければならないとしたらどうでしょうか?その場合は一緒にプレイした方がマシです。分割する前に、カゴがどれくらいの速さで届くのかをまず測定してみてください。

参考

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます