ステータス:ドラフト(2026-10-05、バナーは2026-10-07に更新)。 本文は公式ドキュメントで確認した記述であり、この記事の数値も依然としてドキュメントに基づいています。 Dynamoを1枚のGPU環境に直接インストールして実測したコスト(フロントエンドのコスト、KV認識ルーティング、1枚のGPU上でのprefill/decode分離)は 第24回に個別に記載しています。異なるGPUの2つのサーバー間(1GbE級ネットワーク)での分離サービングについても第24回4.5節で測定しており、NVLinkとRDMA環境は依然として 未実測 です。 記事の終わりの「確認したバージョンと日付」および「確認できなかったこと」を先にお読みください。 作成ルール:実測データを基本とし、測定できなかったものは「未実測」と表記します。
目次
- 概要
- 1. モデルを分割する4つの方法
- 2. prefill/decode分離:なぜ行い、何を支払うのか
- 3. KVキャッシュはどのような経路で移動するか
- 4. Dynamo v1.5.0の構造
- 5. llm-d、vLLM、SGLangとの位置づけの違い
- 6. 分離が利益になる場所と損になる場所
- 7. 実際に試してみる
- 外部の根拠:論文と公式資料で確認したこと
- 8. 面接で出そうな質問
- 9. よくある誤解
- 参考文献(実際に参照したもの)
- 確認したバージョンと日付、確認できなかったこと
概要
大きなモデルは1枚のGPUに収まらないため、重みを複数のGPUに分散させる必要があります。分割方式(テンソル・パイプライン・専門家・データ並列)ごとに通信量とレイテンシが大きく異なるため、ノード内では帯域幅の広い方式を、ノード間では通信の少ない方式を採用する傾向があります。また、prefill(プロンプト処理)とdecode(トークン生成)はリソースの特性が異なるため、プールを分けることで互いに干渉しなくなりますが、その代わりKVキャッシュを移動させる必要があります。NVIDIA Dynamoは、この分離、KV認識ルーティング、自動スケーリングをエンジン上で調整するレイヤーです。
この記事を読むことで面接で説明できるようになること
- テンソル・パイプライン・専門家・データ並列がそれぞれ何を分割し、どのような通信を引き起こすのか、およびノード内とノード間で選択が分かれる理由。
- prefill/decode分離の動機と代償をKVキャッシュサイズの計算を用いて説明し、利益となるワークロードと損となるワークロードを分ける基準。
- Dynamo v1.5.0のコンポーネントが1件のリクエストをどのように処理するか、llm-d、vLLM、SGLangとの違い。
執筆者の立場。 私は一般のイーサネット(1〜2.5GbE級)環境で実験を行っており、RDMA、InfiniBand、NVLinkの経験はありません。この記事は公式ドキュメントと論文を読んでまとめたものであり、直接測定した値はLMCacheの実験が1つあるのみです。
1. モデルを分割する4つの方法
| 並列化 | 何を分割するか | 通信パターン | 特性 |
|---|---|---|---|
| テンソル(TP) | 1層の行列積を複数のGPUに分割 | 層ごとにall-reduce | 頻繁であり、レイテンシに敏感 |
| パイプライン(PP) | 層を前後の区間に分割 | 区間の境界でポイントツーポイント転送 | 少なく、鈍感。その代わりbubble(アイドル時間)が発生 |
| 専門家(EP、MoE) | 専門家の重みをGPUに分散 | 層ごとにall-to-all(dispatch、combine) | 帯域幅とレイテンシの両方に負荷がかかる |
| データ(DP) | モデルの複製を複数配置 | 推論においては複製間の通信がほとんどない | MoEではattentionのみをDPとする構成が一般的 |
通信量はNarayanan他(2021)の論文の式で見積もります。PPは隣接する区間間でマイクロバッチあたり b·s·h 個の要素(バッチ、シーケンス長、隠れ次元の積)を送信します。TPは学習基準で層ごとにデバイスあたり 8·b·s·h·(t−1)/t を送受信しますが、これは順伝播と逆伝播でall-reduceが2回ずつ行われるためです。推論には逆伝播がないため、順伝播分のみを残すと 4·b·s·h·(t−1)/t になります(筆者の導出)。
説明用の例(実測値ではありません)。 Qwen3-32B(隠れ次元5120、64層)に対して8,000トークンのプロンプト1つをTP=8でprefillし、bf16で計算する場合、層ごとにデバイスあたり約287MB、64層全体で約18GBがall-reduceとしてやり取りされます。同じリクエストでPPの境界を1つ越えるデータは約82MBです。
そのため、論文ではTPをサーバー内のGPU数まで使い、それを超える分はPPに増やすべきだとまとめられています(Takeaway #1、学習の文脈)。vLLMのドキュメントでも、TPをノードあたりのGPU数に、PPをノード数に設定するよう指示されており、NVLinkのないGPU(L40Sなど)ではPPの方が優れていると記載されています。帯域幅の違いは仕様からもわかります。NVIDIAはNVLink第4世代をGPUあたり900GB/s、第5世代を1,800GB/s(双方向の合計)と表記しており、ConnectX-7の1枚あたりの帯域幅は400Gb/s(方向あたり約50GB/s)です。DeepSeek-V3のレポートにおけるH800クラスターは、NVLink 160GB/s対InfiniBand 50GB/sでした。
EPはトークンを専門家が存在するGPUに送信し、結果を返送するため、層ごとにall-to-allが発生します。DeepSeek-V3はトークンが最大4つのノードにしか到達しないようにルーティングを制限してInfiniBandのトラフィックを削減し、デプロイ単位をprefill 32 GPU(EP32)、decode 320 GPU(EP320)に設定しました。vLLMでは --enable-expert-parallel を有効にするとEPサイズが TP × DP になり、通信バックエンドとしてprefillに deepep_high_throughputを、decodeに deepep_low_latency を使用するよう案内されます。
[노드 A: TP=4] [노드 B: TP=4]
GPU0 GPU1 GPU2 GPU3 -- PP 경계 --> GPU4 GPU5 GPU6 GPU7
└ NVLink all-reduce ┘ (활성화 텐서, └ NVLink all-reduce ┘
층마다, 지연 민감 점대점, RDMA) 층마다, 지연 민감
2. prefill/decode分離:なぜ行い、何を支払うのか
動機。 Dynamoのドキュメントでは、prefillを演算中心、decodeをメモリ中心と説明しており、そのためdecodeにより大きなTPを、prefillにより小さなTPを割り当てることができるとしています。SGLangのドキュメントでは、1つのエンジン内で混在させると、新しいprefillが実行中のdecodeを中断し、トークン生成が遅延すると説明しています。vLLMのドキュメントは、TTFT(最初のトークンまでの時間)とITL(トークン間の遅延)を個別に調整でき、テールITLを制御できることを理由として挙げつつ、分離によってスループットが向上するわけではないと明確に記しています。論文側では、DistServeがチャットボットにおいてvLLMと比較してリクエストレート2.0〜4.6倍(DeepSpeed-MIIと比較して1.6〜7.4倍)、要約においてSLOを最大12.6倍厳格に満たすと報告しており(異なるアプリケーションと比較対象の最大値であるため、1つの構成で同時に得られた値ではありません)、Splitwiseは既存のクラスターと比較してスループット1.4倍、コスト20%削減、または同等の電力で2.35倍を主張しています(クラスター規模の利得は実測ではなくシミュレータの結果です)。どちらも70Bから175B級のモデルと高速な接続(NVLink内の配置、InfiniBand 200/400Gbps)という論文の条件の下で得られた値です。本文の数値は、以下の「外部の根拠」で直接確認しました。
代償:KVキャッシュを移動させなければなりません。 トークンあたりのKVサイズは 2(K와 V) × 층 수 × KV 헤드 수 × 헤드 차원 × 바이트 수 です。Qwen3-32Bの config.json(64層、KVヘッド8、ヘッド次元128、bf16)で計算すると、トークンあたり256KiB、8,000トークンであれば約2.1GBになります。
| 転送経路 | 理論上の線速度 | 2.1GBの転送時間(説明用の計算、オーバーヘッドを無視) |
|---|---|---|
| 1GbE | 0.125GB/s | 約16.8秒 |
| 2.5GbE | 約0.31GB/s | 約6.7秒 |
| 100GbE | 12.5GB/s | 約0.17秒 |
| 400Gb/s(NIC 1枚) | 50GB/s | 約0.042秒 |
筆者の実測。 Qwen2.5-1.5Bを8GB級のノートPC用GPU上でvLLM + LMCacheを用いて動かした実験です。ドキュメントあたり4,864トークン(0.13GB)のKVをCPUメモリからGPUにロードするのに約8〜9ms、同じ5,000トークンを新しく計算するのに約560msかかりました。このモデルのトークンあたりKVは28KiBであるため、4,864トークンが0.13GiBとなり、ログの0.1299と一致します。ただし、これは同一ノード内のCPUからGPUへの移動であり、ネットワーク転送ではありません。また、同時実行数1、モデル1.5B、合成ドキュメント、単一の測定値です。読み取れる結論は「移動させる方が再計算する方よりもコストが低い場合がある」という方向性までであり、ネットワーク区間で成立するためには上記のように帯域幅がサポートしている必要があります。
Dynamoのドキュメントセットには、TCPでKVを移動させるとTTFTが約98秒、RDMAであれば200〜500msになると記載されています。2つの数値の性質は異なります。98さんはLlama-3.1-8B、入力8,000トークン、AWS p5.48xlargeにおいて、 EFA PodのNIXLがUCXの低速パスに暗黙的にフォールバックした際 に測定された値であり(ドキュメントでは解決策としてNIXLバックエンドにLIBFABRICを指定するよう案内されています)、200〜500msはドキュメントが「仕様に基づく期待値」として記載している値です。同じ条件のEFAで実際に測定されたKV転送の追加分は37msでした。したがって、「TCPは98秒、RDMAは0.5秒」を一般的な比較として捉えてはなりません(以下の「外部の根拠」を参照)。
3. KVキャッシュはどのような経路で移動するか
転送ライブラリはNIXL(NVIDIA Inference Xfer Library)です。メモリの種類(HBM、DRAM、ファイル、オブジェクトストレージ)を抽象化し、プラグインによってバックエンドを選択します。ドキュメントで挙げられているバックエンドはUCXとGPUDirect Storageであり、DynamoのドキュメントにはUCXまたはlibfabricを経由すると記載されており、SGLangはMooncakeとNIXLをサポートしています。ノード内ではCUDA IPCによるNVLinkを、ノード間ではRDMAを使用します。
方向は「decodeがprefillから引っ張る(pull)」形式です。llm-dのドキュメントはそのように記述しており、vLLMのNixlConnectorはprefill側のKVブロックをデフォルトで30秒のリース(lease)で保持します。運用にあたって知っておくべき点が4つあります。第一に、 NCCL_IB_HCA のようなNCCL変数はNixlConnectorには適用されず、 UCX_TLS, UCX_NET_DEVICES を使用する必要がある点です。第二に、Dynamoのドキュメントによると、同一ノード内の異なるポッド間でもNVLinkがブロックされ、NIC経由で転送する必要がある点です。第三に、Kubernetesにおける /dev/shm のデフォルト値(64MB)はNIXLの初期化には不十分であるため、 sharedMemory を16Giに引き上げるよう案内されている点です。第四に、vLLMのドキュメントは kv_role="kv_both" を非推奨(廃止予定)に指定している点です。 kv_producer/kv_consumer の使用が推奨されますが、Dynamo 1.5.0のドキュメントの例はまだ kv_both を使用しています。
4. Dynamo v1.5.0の構造
Dynamoはエンジンを置き換えるのではなく、vLLM、SGLang、TensorRT-LLM上で複数のノードを調整します。ランタイムはRust、拡張はPythonです。
flowchart LR
C[클라이언트] -->|HTTP 8000| F[Frontend<br/>토큰화·검증]
F --> R[Router / PrefillRouter]
R -->|1 prefill 요청| P[Prefill Worker]
P -->|2 disaggregated_params| R
R -->|3 decode 요청+메타데이터| D[Decode Worker]
P -.->|4 KV 전송 NIXL| D
D -->|5 토큰 스트림| F
PL[Planner] -.->|복제본 수 조정| P
PL -.-> D
DS[(Discovery: K8s 또는 etcd)] -.-> F
- Frontend: OpenAI互換のHTTPサーバー(ポート8000)であり、チャットテンプレートの適用、トークン化、検証、デトークン化を担当します。
- Router: プレフィックスがすでにキャッシュされているワーカーと現在の負荷を合わせて確認し、最もコストの低いワーカーを選択します。コストは
prefill_load_scale × max(0, 활성 prefill 블록 + 신규 프롬프트 블록 − 겹침 크레딧) + 잠재 decode 블록 + 활성 요청 비용です。ワーカーがKV生成・削除イベントを発行してインデックスを更新し、イベントを受信できない場合は--no-router-kv-eventsとして予測モードを使用します。ドキュメントではこれを「バッチ決定」と呼び、キャッシュが温かいワーカーでも負荷が高い場合は敗北します。 - Worker: エンジンプロセスです。分離デプロイでは
--disaggregation-mode prefill|decodeによって役割を分割します。 - Planner: TTFT、ITL SLAを目標としてレプリカ数を調整します。目標は
throughput(デフォルト)、latency,load,slaであり、スループットベース(デフォルト180秒周期)と負荷ベース(デフォルト5秒周期)を組み合わせて使用できます。スケールダウン時に進行中のリクエストを待たずにワーカーを終了するため、min_endpointの下限を設定することが推奨されます。 - 通信プレーン: ディスカバリー(Kubernetesは
DynamoWorkerMetadataとEndpointSlice、ベアメタルはetcd)、リクエスト(TCPデフォルト、NATS選択)、イベント(ZMQデフォルト、NATS選択)。 - 変更または廃止された事項: KV Block Manager(KVBM)はv1.5.0で廃止予定であり、v1.6.0での削除が目標です(エンジンのKVオフロードへの移行が推奨されます)。AIConfiguratorはAISimulateに改名され、Go Endpoint PickerはRust版に置き換えられました。
Kubernetes。 Dynamo OperatorがCRDを調整します。核心は DynamoGraphDeployment(DGD、フロントエンドとワーカーで構成される推論グラフのセット)であり、 DynamoComponentDeployment, DynamoGraphDeploymentRequest(DGDR、モデル・ハードウェア・SLAを記述するとプロファイルしてDGDを生成)、 DynamoGraphDeploymentScalingAdapter(HPA/KEDA連携)、 DynamoModel がさらにあります。v1.5.0で nvidia.com/v1beta1 が保存バージョンとなり、 spec.components のリストに type: frontend|worker|prefill|decode を使用します。複数のノードにわたるワーカーはGrove(デフォルト)またはLeaderWorkerSetがないと、Operatorがエラーを返します。以下はドキュメントの例(Qwen3-32B)を簡略化したものであり、実際に適用してみたものではありません。
apiVersion: nvidia.com/v1beta1
kind: DynamoGraphDeployment
spec:
components:
- {name: Frontend, type: frontend}
- name: VllmPrefillWorker
type: prefill
sharedMemorySize: 16Gi
# args: --model Qwen/Qwen3-32B --disaggregation-mode prefill
# --kv-transfer-config '{"kv_connector":"NixlConnector",...}'
- name: VllmDecodeWorker
type: decode # args 는 같고 --disaggregation-mode decode
5. llm-d、vLLM、SGLangとの位置づけの違い
| 項目 | Dynamo | llm-d | vLLM単体 | SGLang単体 |
|---|---|---|---|---|
| 性格 | エンジン上の調整レイヤー | Kubernetes中心のスタック、CNCF sandbox | エンジンの実験的機能 | エンジン内蔵PD分離 |
| リクエストのエントリ | 独自のFrontendまたはGateway APIのEPP | Gateway API Inference Extension規格プロキシとEPP | 自作のプロキシ(ドキュメントではtoyの例) | SGLang Model Gateway(旧Router) |
| KV転送 | NIXL(UCXなど) | NIXL、RDMA推奨、TCP代替可能 | NixlConnector、Mooncake、LMCacheなど | Mooncake、NIXL |
| 自動スケーリング | Planner(SLAベース) | SLO認識オートスケーリングの紹介 | 読んだドキュメントでは確認できず | 読んだドキュメントでは確認できず |
これら3つのプロジェクトは排他的ではありません。Dynamo 1.5.0のリリースノートにllm-dバッチゲートウェイの例があり、どちらもvLLM・SGLangをモデルサーバーとして使用します。どちらがより高速かは確認できていません。llm-dの「最大70%のスループット」(B200、AWS)とDynamoの「TTFT 2倍」(Baseten)は、条件が異なるだけでなく 測定対象が異なります。 70%はprefill/decode分離のスループット(GPT-OSS、入力と出力1,024トークン)、2倍は分離ではなくKV認識ルーティングのTTFT(Qwen3-Coder 480B、入力約5万トークン、ランダムルーティング比較)であるため、両者を並べて優劣を読み取ることはできません。
6. 分離が利益をもたらすケースと損失をもたらすケース
Dynamoのドキュメントを基準とすると、 利益となるのは、長いプロンプトによりprefillのコストが高い場合、高い同時実行性によりdecodeがボトルネックとなっている場合、2つのプールを個別に拡張したい場合、2つの段階で異なる並列化が必要な大規模モデルの場合です。llm-dは、入力対出力が10:1の長いコンテキストを推奨事例として挙げています。 損失となるのは、小規模モデル、短いプロンプト、低い同時実行性、高速なKV転送ネットワークがない場合であり、統合(aggregated)デプロイの方がシンプルであり、通常はより高速です。ドキュメントでは、decode KVの容量がボトルネックであるときにprefillレプリカを増やすと、全体的な容量が低下する可能性があることも警告しています。
Dynamoの対応策は 条件付き分離(conditional disaggregation、実験的) です。ルーターがdecodeワーカーのKVの重複を除いた残りの有効入力長がデフォルトで2048トークン未満であり、元の長さに対する割合が0.7未満である場合、prefillワーカーを経由せずにdecodeワーカーがprefillまで処理します。マルチターン対話のようにプレフィックスの再利用が多いケースをターゲットにしており、vLLMの双方向KV転送(prefillがdecodeの持つ以前のターンのKVを取得する)も同じ問題意識に基づいています。
7. 実際に試してみる
RDMAとマルチGPUノードがない場合、分離サービングを再現することはできませんが、可能な範囲は以下の通りです。
- KVサイズの計算(環境変更なし)。 モデル
config.jsonにおいてトークンあたりのKVを計算します。python3 -c "import json,sys;c=json.load(open(sys.argv[1]));h=c.get('head_dim',c['hidden_size']//c['num_attention_heads']);print(2*c['num_hidden_layers']*c['num_key_value_heads']*h*2,'bytes/token(2바이트 가정)')" config.json - KVのロードコストの測定。 2節の実験のように一時的なPodからvLLMとLMCacheを実行し、CPUメモリからKVをロードする時間と新しく計算する時間を比較します。終了したらPodを削除します。ノードメモリを他のワークロードと共有している場合は、制限を増やす前に空き容量を確認する必要があります。
- TCPでNIXLを動かしてみる(未検証)。 GPUが1枚ずつの2台のサーバーでprefill/decodeインスタンスを起動し、
UCX_TLSをTCP系に制限してTTFTが上記の表の1GbEの行のように増加するかを確認する実験です。この記事の執筆時点では実行しておらず、動作も保証できません。GPUが他のワークロードによって占有されている可能性があるため、実行前の確認が必要です。外部の測定によると、100Gb/sのTCPでもGPU間の転送は実装に応じて0.55GB/s(UCX)から約4.8GB/s(UCCL)まで分かれるため、1GbEの行の理論上の線速度は実際にはさらに遅い可能性があります(以下の「外部の根拠」を参照)。(2026-10-07追加:異なるGPUを持つ2台のサーバー間で、第24部4.5節で直接測定しました。UCXのデフォルト設定(TCP)で1,500単語入力の初トークンが1.7秒、3,000単語は3.4〜3.5秒となり、単独サービング(44〜172ms)の20倍以上に増加しました。1つのGPU内でUCX_TLSをTCP系に制限したバリエーションは、デフォルト設定と同じ速度でした。) - ノード間のTCPスループットの直接測定値(計算に必要な最小限の実測値)。 異なる3ペアのノード(Podネットワーク、
iperf310秒)において、単一ストリームで894〜902Mbit/s、4ストリームで901〜912Mbit/sと、いずれも1GbE級(約112MB/s)でした。このネットワークでトークンあたり114,688バイトである1.7Bモデルの8,000トークンのKV(約917MB)を転送すると約8秒かかり、同じ入力を8GB級のGPUが再計算するのにかかる時間は約1秒(第21部)です。つまり、 小規模モデルと1GbEでは分離サービングが損失となる(転送が再計算の8倍遅い)という第6節の記述が計算によって確認されます。2つのインスタンスを直接接続したエンドツーエンドのTTFTは、第24部4.5節で測定しました。0.6Bモデル(トークンあたりのKVが114,688バイトで同じ)の3,000単語のリクエストは、転送あたり351.75MBを104MB/sで3.4秒かけて転送し、初トークンは3.4〜3.5秒となり計算結果と一致しました(単独時は83〜172ms)。
外部の根拠:論文や公式資料で確認された内容
分離サービングはデータセンター級の設備なしには再現できないため、この記事の数値的な主張はすべて一次資料に当たり、条件とともに確認しました。外部の数値は当方の環境(小規模モデル、GPU 1枚、1GbE)と条件が異なるため、直接比較は行わず方向性の判断のみに使用しました。
| テーマ | 資料と確認した箇所 | 確認した内容と条件 | この記事との関係 |
|---|---|---|---|
| 98秒 vs 200〜500ms | Dynamo v1.4.2 ドキュメント「Disaggregated Inference Communication Guide」(Performance Expectations、Break-Even Analysis)、v1.5.0 rdma-setup/efa-on-aws |
98秒は Llama-3.1-8B、入力8,000トークン、AWS p5.48xlargeのTCP代替経路での測定値。200〜500msはInfiniBandの仕様に基づく期待値(測定ではない)。同一条件でのEFA実測KV転送追加分は+37ms(約9.6GB/s)。同ドキュメントでは、98秒はUCXが遅い経路にフォールバックした誤設定の事例であると説明されている。 | 限定的に支持。 方向性(TCPがはるかに遅い)は合致しているが、一般的なTCPの値ではない。本記事の記述を修正。 |
| DistServe | Zhongら、OSDI 2024、arXiv 2401.09670、セクション1・2・6.1〜6.4・7 | A100-80GB 32枚、ノード内NVLinkおよびノード間25Gbps。チャットボットのvLLMと比較してリクエストレートが2.0〜4.6倍(DeepSpeed-MIIと比較して1.6〜7.4倍)、要約SLOが12.6倍厳格。KV転送はOPT-175Bにおいて全体遅延の0.1%未満(ノード内配置で解決)。セクション7では、GPUが1枚または数枚程度の環境では効果を出しにくいと記載されている。 | 支持。 ただし、いずれもOPT-13B〜175B級の大規模モデルの条件である。 |
| Splitwise | Patelら、ISCA 2024、arXiv 2311.18677、概要・セクションIV-C・VI | 実際のハードウェアはDGX-A100・H100が各2台(InfiniBand 200・400Gbps)、 クラスターの利益はシミュレーション。同一電力でスループット2.15倍、同一コストで1.4倍(電力25%増)、レイヤー別転送の見かけ上の転送時間はprefill計算の7%未満。10分の1の帯域幅については推測のみでテストされていない。 | 支持。 「コスト20%削減で1.4倍」は異なる構成の値であり、同時に得られたものではない。 |
| Mooncake | Qinら、USENIX FAST 2025(arXiv 2407.00079)、セクション5.2・5.4 | A800ノード(RDMA 800Gbps級)、ダミーのLLaMA3-70B。有効リクエスト容量が+59%から+498%になるが、利益にはKVキャッシュプールとキャッシュ認識スケジューラーが混ざっており、分離単体の効果ではない。入力が短いツール・エージェントワークロードでは+42%、公開データセットでは+20〜40%。帯域幅が100Gbps未満の場合はTTFTが急増するため、最低100Gbpsが推奨される。 | 限定的に支持。 利益が長文、大規模モデル、高速なRDMAに依存するという第6節の記述を裏付け |
| 利益が消える条件 | DynamoコミュニケーションガイドのBreak-Even表(Llama-3.1-8B、p5.48xlarge、同時実行数10)。Mitra他(NVIDIA)、「Beyond the Buzz」、arXiv 2506.05508。Wang他、TaiChi、arXiv 2508.01989 | 入力1,000トークンでスループット利益約0%、2,000トークン +3%、4,000トークン +14%、8,000トークン +22%。利益はprefillが重いトラフィックと大規模モデル(10B超)で最も大きく、小規模モデルや生成が重いトラフィックでは制限的。統合はTTFTが厳しいとき、分離はTPOTが厳しいときに有利 | 支持。 第6節の「損失」条件と一致。同時実行数に応じた曲線を示す公開計測は見つからず |
| llm-d 70%、Dynamo 2倍 | AWS MLブログ(2026-03-16)、Basetenブログ(2025-10-16) | 70%:分離、1秒あたりのトークン、GPT-OSS、B200のEFA、入力・出力1,024トークン、基準デプロイのレプリカ数が不明確。2倍:KV認識ルーティングによるTTFT 50%削減(ランダムルーティングと比較)、Qwen3-Coder 480B、入力約5万トークン | 支持(比較不可)。 測定対象が異なり、優劣を読み取ることができない |
| TCPによるKV転送 | llm-dブログ「Networking for Distributed Inference in llm-d」(2026-06-23)、Mooncake第5.4節、vLLM NixlConnectorドキュメント | 100Gb/s TCPにおけるGPU間転送は実装ごとにUCX 0.55GB/s、UCCL約4.8GB/s(RoCEとInfiniBandは線速度の97〜99%)。Mooncake転送エンジンはTCPより2.4倍および4.6倍高速。1〜2.5GbE級の測定は見つからず | 限定的に支持。 「必要」ではなく「推奨」、TCPは実装に大きく依存。1GbEは我々が直接測定(第7節4番) |
| マルチノード通信コスト | DeepSeek-V3技術報告書(arXiv 2412.19437)第3.2・3.4節、Singhania他(arXiv 2511.09557) | トークンを最大4つのノードに制限、decode EP320、NVLink 160GB/s対IB 50GB/s。ノード間TPの強い拡張性が悪く、decodeが重いバッチではPPもTPに劣る事例 | 支持。 第1節のノード内TP、ノード間通信が少ない方式の記述は傾向として正しいが断定はしない |
ベンダー(NVIDIA、AWS、Baseten、llm-d)の数値は条件が本文に記載されているもののみ転載しました。2つのllm-d README項目の元のブログとMegatron-LMの通信量公式を開けなかったため、数値を記載していません。
8. 面接で出そうな質問
- 70BモデルをGPU 8枚構成のノード2台にデプロイする場合、並列化をどのように設定しますか? ノード内にはNVLinkがあるためTP=8、ノード間は通信が少ないPP=2に設定します。ただしPPにはバブルが発生するため、モデルが1つのノードに収まるのであればノードごとにTPレプリカを置き、DPでスケールアウトする方が望ましいと付け加えます。
- prefill/decode分離はなぜ行い、いつ行わないのですか? 演算中心とメモリ中心というリソース特性の違いや、互いの干渉を解消してTTFT、ITLを個別に制御することが動機です。KV転送とGPU分割が代償となるため、短いプロンプト、低い同時実行数、低速なネットワークでは統合の方が優れています。
- 8KトークンのプロンプトのKVを100GbEで送信すると、どれくらい時間がかかりますか? トークンあたりのKV(Qwen3-32Bは256KiB)により約2.1GBであり、線速度12.5GB/sであれば理論上0.17秒です。実際にはさらに時間がかかるため、TTFTの目標と比較してRDMAが必要かどうかを判断すると回答します。
- KV認識ルーティングの利点とリスクは何ですか? プレフィックスを持つワーカーに送信することでprefill計算をスキップしTTFTが短縮されますが、キャッシュを持つワーカーに集中するとホットスポットになります。Dynamoはキャッシュクレジットとアクティブ負荷を1つのコスト関数に入れ、効果は
random|round-robinとkvを同じ負荷で比較して確認するよう案内しています。 - PlannerはHPAと何が異なりますか? CPUやリクエスト数ではなく、TTFT、ITL SLAやprefill/decode別のシグナル(キューの深さ、KV使用率)を使用し、トラフィックを予測します。スケールダウン時に処理中のリクエストが失敗する可能性があるため、最小レプリカ数の下限を設定します。
9. よくある誤解
- 「分離すれば常に高速になる。」 vLLMのドキュメントではスループットは向上しないと記載されています。目的は遅延の分離とテールレイテンシの制御です。
- 「KV転送にもNCCL_IB_HCAが適用される。」 NixlConnectorはUCXを使用するため、
UCX_NET_DEVICESを設定します。 - 「KVBMがDynamoの核心である。」 v1.5.0で非推奨予定です。READMEの機能表には残っているため、リリースノートを基準に確認してください。
- 「TPを増やすほど高速になる。」 層ごとにall-reduceが発生するため、ノードをまたぐと通信がボトルネックになります。Dynamoも新しいエンジンではなく、エンジンの上のオーケストレーション層です。
参考文献(実際に参照したもの)
- Dynamo v1.5.0リリースノート: https://github.com/ai-dynamo/dynamo/releases/tag/v1.5.0
- DynamoリポジトリREADMEとドキュメント(release/1.5.0
docs/fern/pages:アーキテクチャ、分散サービング、KV認識ルーティング、ルーターの概念、条件付き分離、プランナー、Kubernetes分散サービング・DGD・RDMA・インストール、APIリファレンス、用語集):https://github.com/ai-dynamo/dynamo 、https://docs.nvidia.com/dynamo/ - NIXL: https://github.com/ai-dynamo/nixl
- vLLM: https://docs.vllm.ai/en/latest/features/disagg_prefill/ 、https://docs.vllm.ai/en/latest/features/nixl_connector_usage/ 、https://docs.vllm.ai/en/latest/serving/parallelism_scaling/ 、https://docs.vllm.ai/en/latest/serving/expert_parallel_deployment/
- SGLang: https://docs.sglang.ai/advanced_features/pd_disaggregation.html
- llm-d: https://github.com/llm-d/llm-d 、https://llm-d.ai/docs/architecture 、https://llm-d.ai/docs/well-lit-paths/foundations/pd-disaggregation
- 論文: https://arxiv.org/abs/2104.04473 、https://arxiv.org/abs/2412.19437 、https://arxiv.org/abs/2401.09670 、https://arxiv.org/abs/2311.18677
- NVLink仕様: https://www.nvidia.com/en-us/data-center/nvlink/ 、Qwen3-32B config: https://huggingface.co/Qwen/Qwen3-32B/raw/main/config.json
確認したバージョンと日付、確認できなかった事項
確認日は2026-10-05です。GitHubリリースAPIによりDynamo v1.5.0(2026-09-21、バンドルエンジンSGLang v0.5.18、TensorRT-LLM v1.3.0rc25、vLLM v0.28.0)、NIXL v1.5.0(2026-09-30)、llm-d v0.10.0(2026-09-29)、vLLM最新v0.30.0、SGLang最新v0.5.21を確認し、ドキュメントサイトの latest もv1.5.0です。
確認できなかった事項:(1)Dynamoドキュメントの一部がまだv1alpha1と kv_both の例を使用している理由。(2)llm-d・Dynamo・SGLang間の性能優劣(測定対象が異なるため比較自体が困難です)。(3)第7節3番の実験(2台のサーバーでTCPによりNIXLを実行してTTFTを検証するテスト)は2026-10-07に第24編第4.5節で実行しました(1GbE級リンクのみ、RDMAではありません)。(4)2つのllm-d README項目の元のブログの一部とMegatron-LM論文の通信量公式を開けなかったため記載していません。98秒および200〜500msの条件(確認済み)、DistServe・Splitwiseの本文数値(確認済み)は「外部根拠」にあります。