Hotdry.
ai-systems

NVIDIA Dynamo KV 感知请求路由的动态调度机制

解析 Dynamo 调度器如何通过 Radix Tree 全局注册表与 KvIndexer 实现 KV cache 感知的请求路由,带来 3 倍 TTFT 提升。

在大规模语言模型推理服务中,传统的负载均衡策略往往将每个请求视为独立的计算单元,忽视了一个关键事实:Transformer 模型的 KV cache 具有显著的重用价值。当多个用户请求共享相同的对话前缀或系统提示词时,如果能够将后续请求路由到已经持有相关 KV cache 的工作节点,就能够跳过重复的前缀计算,直接进入解码阶段。然而,传统的轮询或基于连接数的负载均衡器无法感知这种跨请求的状态关联,导致大量计算资源浪费在重复的预填充计算上。NVIDIA Dynamo 的 KV 感知路由正是为解决这一痛点而设计,它通过维护全局的 KV cache 注册表,将请求导向 cache 命中率最高的工作节点,同时兼顾负载均衡,最终在真实生产工作负载下实现了 3 倍的首令牌时间(TTFT)改善。

Dynamo 路由器的核心架构围绕一个全局的 Radix Tree 注册表展开,这个树形数据结构以 token 序列为键,追踪所有工作节点上 KV block 的分布位置。每当后端引擎(如 vLLM、SGLang 或 TensorRT-LLM)创建或释放 KV block 时,会通过 NATS 消息队列向路由器发送事件通知,路由器据此更新本地的 Radix Tree 索引。这种事件驱动的设计确保了路由决策基于最新的 cache 状态,而非过时的快照。在 NVIDIA 的内部测试中,使用 10 万条真实 R1 用户查询进行评估,采用 Dynamo KV 感知路由相比随机路由,平均请求延迟降低了 50%,TTFT 缩短至原来的三分之一。该收益在流量高峰期尤为明显,因为此时 cache 复用的价值被放大。

路由算法的具体实现采用了开销模型与 softmax 采样的组合策略。对于每个到达的请求,路由器首先计算将其路由到各个候选工作节点的理论开销,这个开销由两部分构成:一是该节点上已有 KV block 的重叠分数,即请求前缀与节点 cache 的匹配程度;二是该节点的当前负载指标。重叠分数通过 Radix Tree 的前缀匹配计算得出,权重由参数 --kv-overlap-score-weight 控制,取值范围为 0 到 1,默认值 1 表示完全信任 cache 重叠信息,设为 0 则退化为纯负载均衡模式。最终开销经过 softmax 变换后转化为选择概率,参数 --router-temperature 控制概率分布的平滑程度:设为 0 时总是选择开销最低的节点,增大温度值则引入更多随机性,有助于避免热点节点过载。路由器还支持在多个实例之间通过 NATS 同步本地路由决策和活跃序列预测,使用 --router-replica-sync 参数启用这一功能后,可以提升跨路由器副本的路由一致性,但需要注意这并不等同于同步 Radix Tree 本身的状态,后者仍通过 JetStream 事件独立维护。

生产环境部署需要关注若干工程细节。首先,KV cache 事件的精确追踪依赖于 NATS JetStream 的可用性,如果后端引擎不支持 KV 事件发布,或者对事件准确性不确定,可以添加 --no-kv-events 参数切换到 ApproxKvIndexer 模式,该模式基于 120 秒固定时间窗口估算 cache 命中率,虽然精度有所下降,但能够脱离 NATS 依赖独立运行。其次,路由器状态持久化通过 NATS 对象存储实现快照机制,默认情况下重启后会从快照恢复并从断点继续消费事件,这一行为由 --router-reset-states 参数控制,该参数会清空事件流和对象存储并从零开始,适合首次部署或需要干净状态的场景。快照触发阈值由 --router-snapshot-threshold 参数设定,当未确认消息数超过该阈值时执行快照并清理已确认消息,这一机制需要在状态丢失风险与快照开销之间取得平衡,NVIDIA 建议在生产环境中根据事件吞吐量调整该阈值。

总结来说,Dynamo 的 KV 感知路由通过 Radix Tree 全局注册表、NATS 事件驱动同步以及可配置的开销模型,实现了对分布式推理场景下 KV cache 状态的精准感知与利用。相比于传统的无状态负载均衡,该机制在保持路由一致性与负载均衡的同时,显著提升了首令牌响应速度与整体吞吐量。生产部署时应根据基础设施条件选择精确或近似的索引模式,并通过合理的快照与同步参数配置确保路由状态在异常恢复时的可靠性。

参考资料

查看归档