SGLang 的 PD Disaggregation,可以先记成一句话:让 Prefill 和 Decode 分开占 GPU。
Prefill 处理完整输入,偏计算密集;Decode 反复读取 KV Cache,偏内存密集。SGLang 官方文档把两者拆成 prefill-only server 和 decode-only server,再用 Router 接起来。1
为什么要拆?长输入进入同一个调度池时,可能打断正在生成的 Decode batch;两阶段对 GPU 并行策略的偏好也不一样。DistServe 的实验把它概括为两个问题:prefill-decoding interference,以及资源与并行策略耦合。2
图 3 的队列名来自 SGLang 当前实现:Prefill 侧经过 Bootstrap、Waiting、Inflight,Decode 侧经过 Prealloc、Transfer、Waiting、Running。两侧真正要跨实例传的是 KV Cache,Router 负责配对和转发,最终合并结果后流式返回。3 4 5
最小部署有三个角色:
- Prefill:
--disaggregation-mode prefill - Decode:
--disaggregation-mode decode - Router:
--pd-disaggregation --prefill <PREFILL_URL> --decode <DECODE_URL>
官方文档中的默认 transfer backend 是 Mooncake,也支持 NIXL;bootstrap 端口默认值是
8998。具体模型路径、TP、GPU 数量和网络设备,仍要按你的机器补齐。6拆开以后,调优重点会转向 KV Cache 的传输。可以先记录
SGLANG_DISAGGREGATION_QUEUE_SIZE=4、SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUT=300 和 SGLANG_DISAGGREGATION_WAITING_TIMEOUT=300,再观察传输是否堆积。异构 TP 还要额外检查 staging buffer 的模型和 chunked-prefill 限制,MLA 模型不要直接照搬这条路径。1最后,PD 分离不是「开了就更快」。TaiChi 的结论是:TTFT 很紧、TPOT 较松时,合置可能更合适;TPOT 很紧、TTFT 较松时,分离更有优势。另一项研究也指出,低负载、缺少高速 KV 通道,或同时把两种 SLO 都压得很紧时,分离未必占优。7 8
实践顺序可以很朴素:先明确自己要压 TTFT 还是 TPOT,再测 P 到 D 的 KV 传输,最后决定 GPU 怎么分。不要先把 1P1D 当成答案。
继续查:
参考来源
- 1PD Disaggregation - SGLang Documentation
- 2DistServe: Disaggregating Prefill and Decoding for Goodput-optimized Large Language Model Serving
- 3sglang/srt/disaggregation/prefill.py
- 4sglang/srt/disaggregation/decode.py
- 5SGLang Model Gateway
- 6Server Arguments - SGLang Documentation
- 7Prefill-Decode Aggregation or Disaggregation? Unifying Both for Goodput-Optimized LLM Serving
- 8Revisiting Disaggregated Large Language Model Serving for Performance and Energy Implications




评论
登录后可发表评论。