P/D 分离
预填充和解码是两种负载,为什么塞在一组卡上?分开部署,各自最优。
为什么分开
Chunked Prefill 在时间维调和了 prefill 与 decode,但物理上仍共享资源,配比被焊死。两者的画像截然不同:
| 维度 | Prefill | Decode |
|---|---|---|
| 负载类型 | 计算受限 | 带宽受限 |
| 并行策略偏好 | 大 TP(吃算力,通信可摊薄) | 小 TP 或 EP(通信敏感) |
| KV Cache | 一次性写满 | 持续增长读取 |
| 扩展维度 | 加卡线性降 TTFT | 加卡线性提吞吐 |
Splitwise 与 DistServe 独立证明了同一件事:分开后,各自用最优配置,双 SLO(TTFT/TPOT)同时达成,goodput 提升可达 2 倍以上,且故障域隔离(decode 不被 prefill 的长尾拖死)。
架构与 KV 传输
分离引入新组件:KV 传输层。prefill 完成的 KV 要搬到 decode 实例:
flowchart LR
U["用户请求"] --> P["Prefill 池<br/>(大 TP、算力优先)"]
P -- "KV 传输<br/>(RDMA/IB/NVLink)" --> D["Decode 池<br/>(小 TP、带宽优先)"]
D -- "流式输出" --> U
C["KV Cache 池<br/>(前缀缓存共享)"] -.复用.-> P
C -.复用.-> D传输代价(集合通信篇模型):
配比与调度
- 静态配比:按流量画像定 P:D 卡数比(RAG 重 prefill → P 多;长输出 → D 多);
- 动态调度(DistServe 的 goodput 目标):按实时 TTFT/TPOT 违约率调整两池规模与请求路由;
- 与前缀缓存合体:Mooncake 把 KV 集中池化(CPU 内存池 + RDMA),prefill 池按"缓存命中优先"调度,命中率直接省算力——P/D 分离 + KV 池化 + 前缀缓存是现代 serving 三件套。
深入推导:goodput 目标函数与分离的收益边界
goodput(DistServe 定义):同时满足 TTFT/TPOT SLO 的有效吞吐
两个约束在不同池内分别可解,不再互为约束——这就是分离带来的可行域扩大。
收益边界。分离不是免费的:KV 传输时间
配比推导。设到达率
(据 Zhong et al. 2024、Patel et al. 2024、Qin et al. 2024。)
思考题
- 为什么 prefill 池偏好大 TP 而 decode 池偏好小 TP/EP?
- 32K 长上下文、跨机分离(IB 50 GB/s):KV 传输要多久?这决定了什么?
- P/D 分离、chunked prefill、前缀缓存三个优化能叠加吗?各自解决什么?
参考答案
- prefill 是计算受限:大 TP 摊薄权重读取、拉满算力利用率,通信虽重但单次 prefill 计算量大可掩盖;decode 是带宽受限、通信敏感(张量并行篇:decode 的通信/计算比恶劣),小 TP 减少每 token 通信频次。
- 7B/GQA:
,IB 传输约 86 ms——是 TTFT 的显著增量;这决定"分离优先域内、跨机必须算清传输账",以及长上下文更倾向 KV 池化 + 本地 decode。 - 可叠加且互补:chunked prefill 管时间维(同卡调度)、P/D 管空间维(分池部署)、前缀缓存管重复计算(命中省 prefill)。生产三件套(Mooncake 架构)同时启用,缓存池还是 P/D 之间 KV 的中转站。
小结
- P/D 分离让两种负载各自最优配比与调度,双 SLO 同时达成,goodput 2 倍以上。
- KV 传输是新增的一等约束,决定了分离优先在超节点内、跨机需高带宽或池化。
- 与前缀缓存、KV 池化天然组合,构成现代 serving 的三件套。
- 配比由流量画像显式推导,不是玄学。
参考资料
- Zhong et al., DistServe(OSDI 2024,arXiv 2401.09670)
- Patel et al., Splitwise(ISCA 2024,arXiv 2311.18677)
- Qin et al., Mooncake(FAST 2025,arXiv 2407.00079)
- Hu et al., Distributed Inference and Fine-tuning of LLMs Over a Fast Network(arXiv 2406.16245)