Disaggregation

把 LLM 推理的 prefill(prompt 全部一次性算 KV)与 decode(一次一个 token)拆到不同的 GPU/节点上,让两类工作各自在适合的硬件配置上跑。代价:每个请求要在两组 GPU 之间传 KV-Cache,所以高效的 P2P 通信(RDMA)是 enabler。

核心思想

LLM 推理两个阶段计算特性截然不同:

阶段计算特性硬件偏好
Prefillcompute-bound(一次算完整个 prompt 的 K/V/O,并行度高)高算力 GPU、大 SM 数
Decodememory-bound(每步算一个 token,HBM 带宽是瓶颈)高 HBM 带宽、小 batch 灵活调度

如果在同一组 GPU 上 collocate 两个阶段(vanilla 实现),各自的硬件需求互相妥协:

  • Prefill 占用大 batch 时,decode 长尾被拖慢
  • Decode 阶段算力闲置,HBM 带宽吃满

Disaggregation

  • Prefill cluster:高算力 GPU,主要跑 prefill;算完把 KV cache 推给 decoder
  • Decode cluster:高带宽 GPU,主要跑 decode;接收 KV 后开始 token-by-token 生成
  • Global scheduler:决定每个请求走哪个 prefill / decode 节点对

为什么这样做

观察:prefill 和 decode 的 compute/memory ratio 差 1-2 个数量级。强行 collocate 等于让 GPU 同时背两套互相冲突的负载。Disaggregation 让两类工作各自在最优 batch / hardware 配置上跑,整体 SLO 和 throughput 都改善。

代价:每个请求多了一次跨节点的 KV 传输(潜在大几 GB),需要高带宽 RDMA。但 KV transfer 与 prefill 后续 layer 计算可以 overlap。

实现要点

  • KV transfer 时机:layer-by-layer(prefiller 算完每层就推一层)vs 全部 prefill 完再一次推
  • 路由策略:根据 input length 把请求分到 prefiller、根据 KV cache 利用率分到 decoder
  • 错误处理:prefiller / decoder 失联时的 cancellation 与 KV reuse 安全(pplx-garden 用 heartbeat + per-request cancellation token)
  • 网络层RDMA one-sided WRITE + 异步 completion(TransferEngine-MLSys26 提供跨厂商 RDMA 抽象)
  • Sharding 不一致:prefiller 与 decoder 的 KV cache sharding 可能不同(GQA / MLA),需要 page-wise offset/stride

相关概念

提出 / 关键论文

  • Splitwise (ISCA 2024, Patel et al.) — 早期 disaggregation 提案,phase splitting
  • DistServe (Zhong et al. 2024) — goodput-oriented disaggregation
  • Mooncake (FAST 2025, Qin et al.) — KVCache-centric architecture,更激进的 KV 优先

引用本概念的论文

  • TransferEngine (pplx-garden) — production-deployed disaggregated KV transfer over EFA & ConnectX
  • DeepSeek-V4 — 异构 KV cache 结构 + on-disk storage 为 shared-prefix 复用设计,是 disaggregation 场景的上层支持
  • Libra — 评估假设 prefill-decode 已分离,专注 prefill 阶段 MoE LB
  • FluxMoE — 明确针对 disaggregated serving 的 decode 阶段(memory-bound)做优化,用 expert paging 把 MoE 专家腾出来留给 KV cache
  • Mooncake(待生成 paper wiki 页)
  • Splitwise / DistServe(待生成)

已知局限 / 开放问题

  • KV transfer 在长 context 场景下仍是带宽 bound(单序列就可能 > 10 GB)
  • Decoder 端的 prefix sharing 与 disaggregation 的语义有冲突(cross-instance prefix cache 难做)
  • 异构 GPU(H100 prefiller + A100 decoder)的精度对齐和 sharding 难