五十四:DistServe-PD分离¶
来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484703&idx=1&sn=dc84948e343b4934a4640b36fea8e187&chksm=f01eb666c7693f70ffc4f636ffbae799fb4d9080935f1967b96a3311782c333e87568341279d#rd
1. 学习范围¶
本日主题是 DistServe,重点是 Prefill-Decode Disaggregation,也就是把 Prefill 和 Decode 阶段拆到不同资源池中执行。
本日覆盖: - Prefill 与 Decode 的系统差异。
-
为什么二者混跑会互相干扰。
-
PD disaggregation 的基本架构。
-
DistServe 的 goodput 优化目标。
-
KV cache 迁移。
-
资源配比、调度和 admission control。
-
与 vLLM/Sarathi 的关系。
-
常见面试问题和生产化注意事项。
2. DistServe 的定位¶
DistServe 是面向 LLM serving 的系统设计,核心思想是将 Prefill 和 Decode 两个阶段解耦,分别用不同的 GPU worker 或资源池承载。 它关注的问题不是单次推理能不能跑通,而是在在线服务中: - 如何满足 TTFT 和 TPOT/ITL SLO。
-
如何减少 Prefill 对 Decode 的干扰。
-
如何提高符合 SLO 的有效吞吐。
-
如何为 Prefill 和 Decode 分别配置资源。
DistServe 的关键表达是:高 throughput 不等于高 goodput。
3. Prefill 与 Decode 的差异¶
Prefill 处理完整 prompt,一次性计算 prompt tokens 的隐藏状态和 KV cache。它通常具有较大的矩阵乘法,算力利用率高,更偏 compute-bound。 Decode 每轮只为每个活跃请求生成一个 token,需要反复读取历史 KV cache。它的 batch 形态小而频繁,常受显存带宽、KV 读取和调度开销影响,更偏 memory-bound 和 latency-sensitive。 二者的差异包括: - token 数量形态不同。
-
计算密度不同。
-
对延迟的敏感点不同。
-
KV cache 生命周期不同。
-
最优 batch size 和资源配置不同。
4. 混跑的干扰问题¶
在同一批 GPU 上混合 Prefill 和 Decode 时,大 prompt 的 Prefill 可能长时间占用 GPU,使 Decode step 等待。 典型表现: - TTFT 因排队和大 Prefill 上升。
-
TPOT/ITL 出现抖动。
-
流式输出卡顿。
-
GPU 利用率看起来高,但用户体验差。
-
平均 tokens/s 高,但 P99 latency 不达标。
这种问题本质上是两个阶段的 workload profile 不一致。
5. PD Disaggregation 的核心思想¶
PD disaggregation 将 Prefill 和 Decode 拆成两个服务阶段:
Prefill worker 负责处理 prompt,生成 KV cache 和首 token 所需状态。Decode worker 接收 KV cache 后负责后续自回归生成。 通过拆分资源池,系统可以: - 为 Prefill 配置更适合大 batch 的资源。-
为 Decode 保留稳定的逐 token 服务能力。
-
避免大 Prefill 阻塞 Decode。
-
分别控制 TTFT 和 TPOT。
6. Goodput¶
Goodput 指满足 SLO 的有效吞吐,而不是所有完成请求的总吞吐。 可以粗略理解为:
为什么重要: - tokens/s 高可能来自牺牲长尾延迟。-
P99 不达标的请求对在线业务价值很低。
-
用户更关心首 token 和流式稳定性。
-
服务容量规划必须绑定 SLO。
DistServe 强调以 goodput 为优化目标,而不是单纯最大化 GPU tokens/s。
7. DistServe 架构¶
典型 DistServe 架构包含: - Frontend:接收请求、维护连接和流式响应。
-
Router:决定请求进入哪个 Prefill worker。
-
Prefill worker:执行 prompt Prefill。
-
KV transfer:把 KV cache 从 Prefill 侧传到 Decode 侧。
-
Decode worker:执行自回归 Decode。
-
Scheduler:控制资源、队列、迁移和 admission。
-
Monitor:观测 TTFT、TPOT、GPU、KV 和网络。
核心设计点是 Prefill 和 Decode 的资源独立伸缩。
8. KV Cache 迁移¶
PD 分离后,Prefill 阶段产生的 KV cache 必须被 Decode 阶段使用,因此需要 KV cache 迁移。 迁移需要关注: - KV 数据量与 prompt 长度、层数、hidden size、head 数相关。
-
网络或互联带宽可能成为瓶颈。
-
KV 迁移时间会进入 TTFT 或端到端延迟。
-
迁移目标必须与 Decode worker 的 KV layout 兼容。
-
迁移失败需要重试或回退。
KV transfer 是 PD disaggregation 的核心代价。
9. 为什么不能只拆服务进程¶
Prefill/Decode 分离不是简单把代码拆成两个进程。真正困难的是资源、状态和调度。 关键问题: - KV cache 是跨阶段状态。
-
请求需要在两个资源池之间排队。
-
两个阶段的负载必须平衡。
-
网络传输可能抵消拆分收益。
-
Decode 侧必须避免因 Prefill 侧过快而堆积。
因此 DistServe 是系统级调度方案,而不是接口拆分。
10. 资源配比¶
PD 分离后,需要决定多少 GPU 给 Prefill,多少 GPU 给 Decode。 影响因素包括: - prompt 平均长度。
-
输出平均长度。
-
输入输出长度分布。
-
TTFT SLO。
-
TPOT/ITL SLO。
-
模型大小。
-
KV transfer 带宽。
-
并发和到达率。
长 prompt、多短输出的业务更偏 Prefill 压力;短 prompt、长输出的聊天业务更偏 Decode 压力。
11. Prefill 侧调度¶
Prefill 侧主要任务是尽快处理新请求的 prompt,同时不能制造过量 KV 迁移和 Decode 排队。 调度考虑: - queue time。
-
prompt length。
-
batching/token budget。
-
优先级。
-
prefix cache 命中。
-
Decode 侧可用容量。
-
TTFT SLO 剩余时间。
Prefill 侧过度追求大 batch,可能提升吞吐但损害 TTFT。
12. Decode 侧调度¶
Decode 侧主要目标是稳定生成 token,控制 TPOT/ITL 和长尾延迟。 调度考虑: - active sequences 数量。
-
每个序列上下文长度。
-
KV cache 使用量。
-
streaming SLO。
-
max_new_tokens。
-
请求取消和结束。
-
fairness。
Decode 侧资源不足时,即使 Prefill 很快,用户仍会看到输出慢或排队。
13. Admission Control¶
Admission control 用来决定新请求是否立即进入系统、排队、降级或拒绝。 它需要同时看: - Prefill 队列。
-
Decode 队列。
-
KV cache 容量。
-
网络传输容量。
-
当前 P95/P99 延迟。
-
请求长度上限。
没有 admission control,高并发时系统可能接受过多请求,导致所有请求一起变慢,goodput 下降。
14. TTFT 与 TPOT 的分离优化¶
PD 分离的一个重要收益是可以分别优化 TTFT 和 TPOT。 TTFT 主要受: - 前端排队。
-
Prefill queue。
-
Prefill 计算。
-
KV transfer。
-
Decode 接入等待。
TPOT/ITL 主要受: - Decode batch。
-
KV cache 读取。
-
active sequence 数。
-
上下文长度。
-
调度策略。
把两个阶段拆开后,指标归因更清楚。
15. 网络和互联带宽¶
PD 分离引入了 KV cache 跨 worker 传输。对于大模型和长 prompt,KV 数据量很大。 需要关注: - 单请求 KV 大小。
-
迁移并发。
-
PCIe/NVLink/InfiniBand/RDMA 带宽。
-
传输是否与计算重叠。
-
拓扑感知调度。
-
跨节点传输的长尾。
如果互联较弱,PD 分离可能不划算。
16. 与 Continuous Batching 的关系¶
Continuous batching 主要解决 Decode 阶段动态请求集合的问题。DistServe 则从集群架构上分离 Prefill 和 Decode。 二者可以结合: - Prefill 侧做 prompt batching。
-
Decode 侧做 continuous batching。
-
Decode worker 保持稳定活跃序列。
-
Prefill worker 不直接打断 Decode。
因此 DistServe 与 vLLM 的机制不是互斥关系。
17. 与 PagedAttention 的关系¶
PagedAttention 管理 KV cache,降低碎片和提高显存利用率。DistServe 需要把 Prefill 产生的 KV 交给 Decode 使用。 结合时要考虑: - KV block layout。
-
block table 是否迁移或重建。
-
physical block 分配。
-
prefix sharing。
-
Decode 侧的 KV 容量。
PD 分离让 KV 管理从单机问题变成跨 worker 状态管理问题。
18. 什么时候适合 DistServe¶
DistServe 更适合: - 在线高并发 serving。
-
TTFT 和 TPOT 都有明确 SLO。
-
prompt/output 长度差异大。
-
Prefill 和 Decode 干扰明显。
-
多 GPU 或多节点资源池。
-
需要按业务负载独立扩缩容。
它不一定适合低并发、单机实验或网络互联很弱的环境。
19. 常见收益¶
DistServe 可能带来的收益: - 提高 SLO 约束下的 goodput。
-
降低 Decode 抖动。
-
改善 P99 TPOT/ITL。
-
让 Prefill 和 Decode 各自使用更合适的 batch。
-
提高资源规划可解释性。
-
支持独立扩缩容。
这些收益必须通过压测验证,不能只靠架构判断。
20. 常见代价¶
代价包括: - KV transfer 开销。
-
系统复杂度上升。
-
跨阶段调度更难。
-
故障恢复更复杂。
-
监控维度更多。
-
资源配比错误会造成一侧空闲、一侧拥塞。
PD 分离不是免费优化,适合在干扰成本大于迁移成本时使用。
21. 压测方法¶
评估 DistServe 时应使用贴近业务的负载: - prompt/output 长度分布。
-
到达率。
-
流式和非流式比例。
-
多租户优先级。
-
长 prompt 占比。
-
长输出占比。
指标应包括: - goodput。
-
TTFT P50/P95/P99。
-
TPOT/ITL P50/P95/P99。
-
decode queue time。
-
KV transfer time。
-
GPU utilization。
-
network utilization。
-
OOM 和拒绝率。
22. 常见失败模式¶
常见失败包括: - Prefill 资源过少,TTFT 差。
-
Decode 资源过少,流式输出慢。
-
KV transfer 成为瓶颈。
-
admission control 不足导致队列爆炸。
-
prompt/output 分布变化后资源配比失效。
-
平均吞吐变高但 goodput 下降。
-
跨节点传输导致 P99 抖动。
排查时要把时间拆成队列、计算、传输和生成几个部分。
23. 面试表达要点¶
面试中回答 DistServe,应先讲清楚动机: - Prefill 和 Decode 的计算特征不同。
-
混跑会造成干扰。
-
在线服务看 SLO 和 goodput,而不是只看 throughput。
然后讲方案: - 拆分 Prefill worker 和 Decode worker。
-
Prefill 生成 KV cache。
-
通过 KV transfer 交给 Decode。
-
两侧独立调度和扩缩容。
最后讲权衡: - 好处是减少干扰、提升 goodput。
-
代价是 KV 迁移和系统复杂度。
-
是否划算取决于负载和互联。
24. 核心总结¶
DistServe 的核心是 Prefill-Decode Disaggregation。它把 compute-bound 的 Prefill 和 latency-sensitive、memory-bound 的 Decode 拆开,用独立资源池和调度策略来优化 TTFT、TPOT 和 goodput。 它的关键不是简单拆进程,而是围绕 KV cache 迁移、资源配比、admission control 和 SLO 进行系统设计。面试中要强调:DistServe 解决的是在线推理阶段间干扰和 SLO goodput 问题。
25. 参考资料¶
-
DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving: https://arxiv.org/abs/2401.09670
-
DistServe paper page: https://hao-ai-lab.github.io/blogs/distserve/
-
vLLM PagedAttention documentation: https://docs.vllm.ai/en/stable/design/paged_attention.html
-
vLLM documentation: https://docs.vllm.ai/
预览时标签不可点<div class="