← 全部 AgentX 优化

AgentX 行业影响 · 推理引擎

AMD ATOM

AMD 的 ATOM 引擎当初是为单轮负载设计的,而不是面向真实世界的多轮智能体生产流量,因此支持长上下文多轮负载需要对核心引擎及其内核做大量改动。相比 vLLM 与 SGLang,ATOM 在智能体负载上仍有很长的路要走,而 AgentX 正是其重构的真实北极星目标。

并发 48 下的 prefix 命中率
5.6% → 96.45%
sliding-window 关卡处的丢弃率
91.35% → 0.16%
采用分块 PP prefill 后的 TTFT 中位数
28.6 s → 8.7 s

稀疏 checkpoint 保留

ATOM 为 DeepSeek-V4 的分页 sliding-window attention 实现了稀疏 checkpoint 保留,这说明该问题属于负载本身的性质,而不是某个代码库特有的。已合入的实现会保住选定的 window 尾部,使分支与回放请求能够在有意义的边界处恢复。

它的测量把两种效应清楚地区分开:在同一条 AgentX trace、并发 48 的条件下,实际 prefix 命中率从 5.6% 升到 96.45%,sliding-window 关卡处的丢弃率从 91.35% 降到 0.16%。后一个数字正是前一个数字背后的机制——十次 prefix 匹配里有九次被找到后又因缺少 window 尾部而被丢弃,也就是说 cache 并不是没命中,而是命中后被否决了。

必须先落地的 cache 管理器修复

在上述效果能够被测量之前,还有两个更早的 cache 管理器修复必须先合入;它们都是"cache 自报健康却什么也没做"的典型例子。其一,避免 free pool 命中破坏共享的 cache 条目;其二是一处 deferred-output 修复,它在默认调度模式下恢复了 prefix hash,使重复的长 prompt 从零缓存 token 变为可复用每一个完整的 prefix block。

另有一个改动让命中 prefix 的 prefill 继续走优化过的 sink attention 内核,而不是回退到通用路径,使得一次 cache 命中不会悄悄抵消掉它节省的一部分开销。

Recurrent 状态 checkpoint

Hybrid 模型还携带 recurrent 或 compressor 状态,它与普通 KV 有一个决定性差异:无法由周围的 token 重建。window 尾部可以由相邻上下文重算,但 recurrent 状态是此前全部内容累积的结果,一旦丢弃,唯一的办法就是重放整个序列。

ATOM 为这份每请求状态引入了内容寻址的 checkpoint 生命周期,让已生成的轮次留下可复用的恢复点,而无需为它们单独预留一块受保护的 cache。在一次测试中,某个请求复用了 512 个已生成 token,只需计算两个 token 的后缀。

调优细节与特性本身同样重要。无条件发布 checkpoint 会在零命中流量上损失 17.5% 吞吐量——这是所有不会再回来的会话为那些会回来的会话付出的代价。按 token 间隔发布 checkpoint 避免了这项惩罚,且固定 1k/1k 的吞吐量变化仍在测量噪声范围内;这正是关键的安全性质:一个面向智能体复用的特性,不应向永远用不到它的负载收税。

CPU offload 路径:归属与索引位置

ATOM 与 AgentX 相关的 CPU 路径,首先要看 offload 本身是否划算。独立运行的 LMCache offload 从 CPU 重新载入 32,000 token 的 prefix 约需 0.32 秒,而重算约需 2.5 秒,相差八倍。这说明在这种上下文长度下跨总线搬运是值得的,而在短 prompt 上并不成立。

路径的其余部分关乎归属与索引位置,而不是带宽。ATOM 移植了 vLLM 的多 connector 设计,使 prefill worker 可以同时把 KV 发给远端 decode worker 并把同一 prefix 保存到 CPU,且在两个消费方都完成之前不释放这些 block。同一批 block 有两个独立读者,这是单轮流量永远不会出现的情形。

把恢复回来的 block 重新提升进 GPU prefix 索引,修复的是一种更隐蔽的浪费:如果不这样做,从 CPU 载入的 prefix 用过之后并不会被登记为常驻,于是下一轮又要跨总线取一次同样的热点 prefix,为一份其实已在 HBM 中的 cache 反复付出传输代价。后续工作一并修复了异步保存顺序、packed KV 几何布局、非对齐交接以及远端请求记账,在两轮共 2,638 个请求的验证中消除了重载损坏。这个缺陷只有在同一批 block 被反复保存、淘汰、恢复许多次时才会显现。

流程示意图:从 CPU DRAM 恢复到 GPU block 的 prefix,要么被移出 GPU prefix 索引(导致下一轮再次取回),要么被提升进索引(下一轮直接在 HBM 命中)。
重新载入 32,000 token 的 prefix 约需 0.32 秒,而重算约需 2.5 秒。把恢复回来的 block 提升进 GPU prefix 索引,才能让下一轮不必再付一次传输开销。查看原始分辨率图片

ATOM Mesh 中的 cache 感知路由

分布式路径在另一个代码库里重演了 SGLang 与 Dynamo 已经展示过的规律:路由必须知道状态在哪里。ATOM 的 router ATOM Mesh 是 SGLang router 的一个精简 fork,砍掉了大部分特性——其中就包括后来发现必不可少的 cache 感知路由。

ATOM 因此补上了面向 cache 感知 router 的 KV 生命周期事件(router 首先要能知道状态在哪)、多节点的 prefill 与 decode 路由,以及会话粘性的数据并行路由。这套粘性策略是一个值得明说的双向折中:会话会回到持有其状态且健康的 worker,但空闲的绑定关系会过期,从而避免为早已离开的会话长期牺牲集群均衡。

Disaggregation 必须搬运模型真正保留的东西

Disaggregation 必须搬运模型真正保留的状态,而它并不总是一份统一的 cache。DeepSeek-V4 会传输其 FP8 与 BF16 混合布局的两个 buffer;EAGLE disaggregation 则在目标 cache 之外一并搬运 draft 模型独立的 KV cache——这正是 TensorRT-LLM 与 SGLang 各自也必须解决的"第二份 cache"问题。

远端 KV 的准入与背压机制补上了最后一环:阻止 decode 侧接受超出其安全恢复能力的挂起传输,这相当于 disaggregated 形态下的"接下自己完不成的活"。

面向长 prefill 的并行

长 prefill 会用到固定 8k prompt 难以充分锻炼的并行能力,因为 8k 本身可切分的余地有限,TTFT 也已经很短。Prefill context parallelism(PCP)把 DeepSeek-V4 的 query token 切分到多张 GPU 上,报告平均首 token 时间降低 35% 到 43%,在 64,000 token 输入下总吞吐量提升最高约 49%——这种收益随输入长度增长,而不是随 batch size 增长。

要在实践中可用,它还必须与会话依赖的其他机制共存,因此 decode context parallelism 被改造为兼容 prefix caching、chunked prefill 与 FP8 KV,随后又扩展到 MTP。无法与 prefix cache 共存的并行策略,只会用一种长上下文收益换掉另一种。

分块流水线并行 prefill 从内存一侧解决同一问题,用流式的层级交接取代反复的张量并行集合通信。它在高负载下的 GLM-5.2 结果是本节中最完整的一组:输出吞吐量翻倍,首 token 时间中位数从 28.6 秒降到 8.7 秒,每张 prefill GPU 可容纳的 KV block 数量提升到 3.68 倍。最后这个数字应当最先看,因为每张 prefill GPU 的容量决定了在部署撞上 HBM 悬崖之前,可以同时承载多少个长会话。

其他项目