跳转至

五十四: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 阶段拆到不同资源池中执行。

img

本日覆盖: - 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 拆成两个服务阶段:

request -> Prefill worker -> KV cache transfer -> Decode worker -> output tokens
Prefill worker 负责处理 prompt,生成 KV cache 和首 token 所需状态。Decode worker 接收 KV cache 后负责后续自回归生成。 通过拆分资源池,系统可以: - 为 Prefill 配置更适合大 batch 的资源。

  • 为 Decode 保留稳定的逐 token 服务能力。

  • 避免大 Prefill 阻塞 Decode。

  • 分别控制 TTFT 和 TPOT。

6. Goodput

Goodput 指满足 SLO 的有效吞吐,而不是所有完成请求的总吞吐。 可以粗略理解为:

goodput = 满足 TTFT/TPOT/端到端延迟约束的请求数 / 时间
为什么重要: - tokens/s 高可能来自牺牲长尾延迟。

  • P99 不达标的请求对在线业务价值很低。

  • 用户更关心首 token 和流式稳定性。

  • 服务容量规划必须绑定 SLO。

DistServe 强调以 goodput 为优化目标,而不是单纯最大化 GPU tokens/s。

7. DistServe 架构

img

典型 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="