跳到主要内容

NVIDIA Dynamo

编排层如何通过 Smart KV Router 与多级 KVBM 加速数据中心级 LLM 推理

核心要点

  • 定位:编排层 (orchestration),不替代推理引擎;站在 TRT-LLM / vLLM / SGLang 之上
  • 核心组件:Frontend + Smart Router (Radix Tree + 负载) + Planner + Worker + KVBM (4 级) + NIXL (传输)
  • Smart Router:事件驱动 Radix Tree, score = a · overlap_blocks - b · prefill_load
  • KVBM 四级:HBM (ns) / DRAM (μs) / NVMe (10-100 μs) / 远程对象存储 (ms)
  • NIXL:异步非阻塞 P2P, UCX / GDR / GDS / S3 over RDMA / Azure Blob 多 backend
  • 官方加速:DeepSeek-R1 671B + GB200 NVL72 up to 30× tokens/GPU; Llama 70B + Hopper 2×+

NVIDIA Dynamo 是 NVIDIA 于 2025 年 3 月 18 日 GTC 主题演讲上发布的开源分布式推理服务框架,定位为"AI factory 的操作系统"。它不是一个新的推理引擎,而是站在 TensorRT-LLM / vLLM / SGLang 之上的编排层,把多机多卡的推理引擎实例组织成一个协调的 PD 分离集群,并提供 KV cache 感知的智能路由、多级 KV 缓存卸载、SLA 驱动的弹性扩缩容。本文聚焦 Dynamo 特有内容;PD 分离的通用原理见 9.2 Prefill/Decode 分离原理, KV 传输物理瓶颈见 9.7 KV cache 跨节点传输瓶颈

为什么从 Triton 演化到 Dynamo

核心问题:Reasoning 时代 Triton 在哪几个维度撞墙?Dynamo 怎么回应?

Triton Inference Server (2018 年开源) 是 NVIDIA 多年来的通用推理服务器,覆盖 TensorRT / PyTorch / ONNX / OpenVINO / RAPIDS FIL 等多种 backend,但其设计假设是"模型 = 一个进程内的前向函数" — 一次推理请求由一个 worker 独立完成。这套假设在 reasoning model 时代撞墙:

  • 请求生命周期不再是毫秒级:reasoning model (o1 / DeepSeek-R1 / Claude 3.7) 的 CoT 可生成上千个 token,单请求秒级到分钟级
  • prefill / decode 资源画像截然不同:prefill compute-bound、decode memory-bound,硬塞同一 GPU 浪费一半
  • KV cache 已是部署成本主体:长上下文场景 KV 远大于权重,但 Triton 无 KV cache 概念
  • 请求间存在大量 prefix 重叠:system prompt、多轮对话天然重复,但 Triton 不感知

Dynamo 的回答:把推理 serving 重新定义为分布式系统问题 — [1] 把 prefill / decode 拆到不同 worker pool; [2] 在 worker 之上引入 KV cache 感知的全局调度;[3] 把 KV cache 从 GPU HBM 解耦到多级存储;[4] 用专门的传输库 (NIXL) 把这一切的跨节点搬运做到 RDMA 级延迟。Triton 没有消失 — 改名 Dynamo-Triton,继续做通用模型 serving; Dynamo 则是 LLM-specific 的新框架,与 Dynamo-Triton 互补而不重叠。

架构组件怎么分工

核心问题:数据面 + 控制面 + 入口 + 传输层各自的角色?事件流怎么走?

Dynamo 的组件按数据面与控制面两层划分:

组件角色
入口FrontendOpenAI-compatible REST API,接受 /v1/completions 等请求,做 tokenize 与协议转换
控制面Smart RouterKV-aware 路由决策,维护 Radix Tree 索引 worker KV 状态
控制面PlannerSLA 驱动的扩缩容控制器,监控队列长度与延迟
数据面Worker (Prefill)跑推理引擎做 prefill,输出 KV cache,发布 KV 块 stored 事件
数据面Worker (Decode)拉取 prefill 产出的 KV,做自回归 decode
数据面KV Block Manager (KVBM)跨 worker 的多级 KV 存储抽象,整合 LMCache、Vast、WEKA 等存储插件
传输层NIXL零拷贝 RDMA / GDS / S3 over RDMA 等异构传输,被所有 worker 调用

@tbl-dynamo-components Dynamo 架构组件

事件流:Worker 通过 ZMQ pub-sub 把 KV 块的 Stored / Removed 事件广播给 Smart Router, Router 据此实时更新 Radix Tree。请求到达时,Router 计算请求 prefix 与各 worker 已缓存块的 overlap,结合 worker 当前 prefill 队列负载选 (prefill_worker, decode_worker) 对。Prefill 完成后通过 NIXL 把 KV 块直接 push 到 decode worker 的 GPU 内存,无需经过 Frontend 转发。

实现语言:核心 Rust (~54%) 跑性能敏感的 router / worker 控制逻辑,Python (~30%) 做接口与扩展,Go (~13%) 做基础设施工具。Rust 内核的目的是消除 Python GIL 在高并发路由场景下的延迟尾部。

Smart KV Router 是什么

核心问题:Radix Tree 索引怎么工作?路由 score 公式 + 三种路由模式?

Smart Router 是 Dynamo 区别于"普通 PD 调度器"的核心组件,做两件事:KV cache 命中最大化 + worker 负载均衡

Radix Tree KV 索引:Router 把每个 worker 上已存在的 KV 块按 token hash 链组织成 Radix Tree。新请求到达时,对 prompt 做相同 hash,沿 tree 走最长公共前缀,得出每个 worker 的 effective_overlap_blocks (该 worker 命中的前缀块数)。Tree 的更新源是 worker 通过 ZMQ 发出的 Stored / Removed 事件,因此索引是 eventually-consistent 而非强一致。

路由打分:默认实现 DefaultWorkerSelector 把命中数与负载折成 logit:

score(w) = a * effective_overlap_blocks(w) - b * prefill_load_scale(w)

其中 prefill_load_scale 反映 worker 当前 prefill 队列深度。Router 选 score 最大的 worker 做 prefill。

三种路由模式

模式用法
KV-aware (默认)用 Radix Tree + load score 选 prefill worker
Direct外部 orchestrator 已指定 worker, Router 直通
Aggregated fallback没有 prefill pool 时退化为聚合 serving,直接选 decode worker

@tbl-dynamo-router-modes Smart Router 的三种路由模式

与 Mooncake Conductor 的差别:Mooncake 的 Conductor 是单逻辑实例 (高可用副本),全局调度;Dynamo Smart Router 是分布式 Rust 服务,事件驱动更新,没有单点。两者都做 cache-aware 调度,但 Dynamo 的 Radix Tree 是 worker-side 事件触发的反推索引,Mooncake 的 prefix cache table 是 Conductor 维护的中心化结构。

KVBM 多级 KV cache 是什么

核心问题:四级存储介质 / 三层抽象 / 实测吞吐?

KV cache 随上下文长度线性增长,128K context 的 KV 体量可超过 GPU HBM; reasoning model 多轮对话场景累积更夸张。Dynamo 的 KV Block Manager (KVBM) 把 KV cache 视作分层存储对象:

介质典型延迟用途
L1GPU HBMns当前活跃请求的 KV
L2Host DRAMus短期空闲对话、prefix 共享池
L3本地 NVMe SSD10-100 us中期会话状态
L4远程对象存储 (Vast / WEKA / S3)ms长尾用户的会话、跨集群共享

@tbl-dynamo-kv-tiers KVBM 的四级 KV cache 层级

KVBM 三层抽象

  1. Model Integration 层:对接 TensorRT-LLM / vLLM (SGLang 在路上),把引擎的 KV 块语义抽象为统一接口
  2. Memory Management 层:追踪每个块的位置、热度,执行 offload / prefetch 策略
  3. Storage & Transfer 层:经 NIXL 完成跨机搬运,插件化对接 LMCache、Vast、WEKA 等存储

事件式 vs 拉取式:KV 块的搬运不是 batch 同步、而是事件触发的异步流水线 — prefill worker 算完一个块立即通过 NIXL push 到 decode worker (类似 Mooncake 的 layer-wise prefill),与下一个块的计算 overlap。

实测吞吐数据 (NVIDIA 公开博客):

场景吞吐
Vast Data + GPU Direct Storage 到单 H10035 GB/s
WEKA 经 RDMA zero-copy 到 8 GPU270 GB/s

@tbl-dynamo-kv-bench KVBM 公开实测吞吐

这些数字是 KV 卸载链路 (远端存储 → GPU) 的纯传输带宽,单 H100 的 35 GB/s 接近 PCIe Gen5 x16 的上限 64 GB/s 的一半,说明 GDS 链路本身已逼近主机端硬件极限。

NIXL 传输底座是什么

核心问题:NIXL 的核心抽象 / 5 种 backend / 部署约束?

NIXL (NVIDIA Inference Xfer Library) 是 Dynamo 抽离出来的独立开源库,专门解决 inference 场景的 P2P 数据搬运。

核心抽象:用户用 descriptor 描述源/目的内存的位置 (host DRAM / GPU HBM / NVMe / object store),调用 read / write 非阻塞接口,NIXL 根据 descriptor 自动选最优 backend:

Backend适用路径
UCX (默认)通用 RDMA (InfiniBand / RoCE) 与 TCP fallback
GPU-initiated networkingGDR-Copy, GPU 直接发起的 RDMA
GPU Direct Storage (GDS)NVMe ⇄ GPU HBM 绕过 CPU
S3 over RDMA兼容 S3 协议的对象存储经 RDMA 加速
Azure Blob公有云对象存储

@tbl-dynamo-nixl-backends NIXL 支持的传输后端

关键设计点

  • 非阻塞 post + 状态轮询:所有传输异步发起,调用方独立查询完成,便于与 compute overlap
  • 动态元数据交换:worker 弹性加入/退出无需预设拓扑,适合长跑 serving 集群
  • memory section + metadata handler:本地内存注册与远端代理元数据分离,支持热重连

部署约束:Dynamo 文档明确指出 KV 跨节点传输必须用 RDMA (IB / RoCE / AWS EFA);纯 TCP fallback 下 TTFT 可能恶化 200-500 倍。NVLink 因为进程隔离原因不能桥接 pod。

Dynamo 跟既有推理栈是什么关系

核心问题:Triton / TRT-LLM / vLLM / SGLang 各自怎么定位?

组件与 Dynamo 关系
Dynamo-Triton (前 Triton)独立产品,仍服务通用模型 (ONNX / TensorRT / PyTorch / FIL)。Dynamo 文档定位 Dynamo 为 LLM-specific 补充:disagg serving + prefix caching + KV 多级缓存,Triton 不具备
TensorRT-LLM被 Dynamo 调用的推理引擎之一,full backend 支持,自身也支持 disagg serving, Dynamo 在其上加多机编排与 KV-aware 路由
vLLMDynamo 主流 backend 之一,KVBM 完整支持,二者深度集成
SGLangDynamo 主流 backend, full disagg + KV-aware routing 支持;KVBM 集成在 2026 Q2 路线图上
PyTorchDynamo 1.x 起作为 backend 支持,用于自定义模型

@tbl-dynamo-stack-relation Dynamo 与既有推理栈的关系

核心定位:Dynamo 是编排层 (orchestration)不替代任何推理引擎。一个典型部署是 "Dynamo Frontend + Smart Router + Planner + 多个 SGLang 或 TensorRT-LLM worker"。对比来看:

  • 单独跑 vLLM:单机 serving,自己做 PagedAttention 和 continuous batching,没有跨机 PD 分离
  • 单独跑 SGLang:内置 PD 分离 mini-LB (详见 9.5 SGLang PD),但调度策略相对静态、不做 KV 多级
  • 用 Dynamo 串起 SGLang:保留 SGLang 引擎,把 mini-LB 换成 Smart Router,把 KV 接入 KVBM 多级存储

性能数据和适用场景

核心问题:官方 benchmark 数字 + 哪些场景适合 / 不适合?

官方公开 benchmark

模型 / 硬件对比基线Dynamo 加速
DeepSeek-R1 671B / GB200 NVL72同硬件无 Dynamoup to 30× tokens/GPU
Llama 70B / Hopper (H100/H200)同硬件无 Dynamo2×+ performance
MoE 模型 (wide EP) / GB200 NVL72NVIDIA B200 系统up to 7× MoE 吞吐
Reasoning + GB200 NVL72 复合基线up to 15× compounding

@tbl-dynamo-bench-official Dynamo 官方公开 benchmark

注意事项

  • 这些数字是 NVIDIA 自家 benchmark,对比基线常是"同硬件不做 PD 分离 / 不开 KV-aware 路由",并非与其他开源 serving 框架 (Mooncake / SGLang) 横评
  • 30× / 15× 等 compounding 数字隐含的是 Dynamo 三大技术 (disagg + KV routing + KV offload) 同时启用
  • 单独某一项 (例如只开 KV-aware routing) 的增益没有公开拆解
  • 没有公开第三方 (MLPerf / 学术机构) 独立 benchmark; Mooncake FAST'25 论文的对比组里没有 Dynamo (Dynamo 发布晚 8 个月)

适用 / 不适用场景

适合

  • 长会话、多轮对话 → KV 卸载收益高
  • 高并发、大量空闲会话 → 把闲 KV 沉到 DRAM/SSD 是关键
  • 共享 system prompt 场景 → KV-aware routing 直接砍 prefill 重算
  • 内存/成本受限部署 → 多级 KV 让单 GPU 等效"看见"更多 KV
  • 主机带宽好的平台 (NVLink-C2C, e.g. GB200) → 卸载链路不堵

不适合:纯短请求 (chat-completion 1-2K input)、prefix 重叠极低 (例如 arXiv summarization),此时 KV-aware 路由命中率低、KV 卸载收益微弱,反而徒增 router 延迟。

Takeaway

知识点核心结论
定位编排层,不替代推理引擎,站在 TRT-LLM / vLLM / SGLang 之上
架构Frontend + Smart Router + Planner + Worker + KVBM + NIXL
Smart Router事件驱动 Radix Tree, score = a·overlap - b·prefill_load
vs Mooncake Conductor分布式 Rust 无单点 vs 单逻辑实例;事件驱动 vs 中心化 table
KVBM 四级HBM (ns) / DRAM (μs) / NVMe (10-100 μs) / 远程对象存储 (ms)
NIXL 5 backendUCX / GDR / GDS / S3 over RDMA / Azure Blob
部署约束跨 pod 必须 RDMA (IB/RoCE/EFA); TCP fallback 200-500× 恶化
官方加速R1 671B + GB200 30×; Llama 70B + Hopper 2×+;但无第三方横评

参考资料