SGLang Prefill-Decode 分离部署指南:把首字延迟压到 1 秒内,吞吐翻一倍

发布时间:2026/9/3 14:28:02
SGLang Prefill-Decode 分离部署指南:把首字延迟压到 1 秒内,吞吐翻一倍 SGLang Prefill-Decode 分离部署指南把首字延迟压到 1 秒内吞吐翻一倍【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang这篇指南带你用最小配置跑通 SGLang 的 PD DisaggregationPrefill-Decode 分离也常被归入流水线并行一类把推理的两个阶段拆到两组独立服务KV 缓存交给传输引擎走网络让高并发 LLM 推理服务的 LLM 推理优化落地。先看一组数据分离到底能换来什么以 DeepSeek-V3 类大模型在高并发负载下的对比为例下表为参考值具体数字取决于你的硬件、并行策略和负载画像指标统一引擎PD 分离变化平均首字延迟TTFT~2.8 s~0.9 s约 3.1× 改善吞吐req/s~12.6~29.1约 2.3×GPU 利用率~65%~89%24 pct可承载并发会话~48~128约 2.7×收益的来源并不神秘两个阶段各自独占资源后不再互相打断prefill 节点可以拉大 batch、decode 节点可以把显存留给 KV cache两边都朝着自己的最优形状去调。官方文档还提到一个细节——当 prefill 和 decode 使用不同 TP 大小时配合 GPU staging buffer 做整块 RDMA 传输高并发下比逐 token 切片传输有 2–5× 的吞吐差距仅限非 MLA 模型。矛盾在哪两个阶段为什么不能同框一次推理分两段气质完全不同Prefill预填充一次性算完整个输入序列计算密集、持续短像仓库里的叉车——动作次数少每次搬运的货很重Decode解码逐 token 往外吐受显存带宽约束、持续长像传送带——每步动作很轻但节拍一刻不能停。传统统一引擎让二者共用同一批 GPU 和同一个调度循环于是出现两类典型拖累Prefill 打断 Decode一个长 prompt 的 prefill batch 插进来时正在生成的请求全被挂起用户侧感受就是 token 之间的间隔突然拉长DP attention 失衡数据并行下一个 DP worker 在跑 prefill、另一个在跑 decode collective 通信被迫等慢的那侧decode 延迟整体抬高。两个节奏不同的负载挤在同一条流水线上谁也别想把参数调到最优。拆开它们PD 分离架构是怎么运作的SGLang 的做法是物理拆分 网络接力两组独立实例prefill 集群只做预填充decode 集群只维护生成会话各自按自身特点做调优batch 大小、显存占比、CUDA graph 配置都可以分开拧KV 缓存跨集群传输prefill 算完的 KV cache 通过传输引擎搬到 decode 侧。当前支持Mooncake生产向走 RDMA/NVLink和NIXLUCX 为默认后端也可切 LIBFABRIC 等插件两条引擎网关路由sglang_router以--pd-disaggregation模式启动负责把请求分派给 prefill/decode 实例支持cache_aware、power_of_two等路由策略并做健康检查与故障切换。请求路径是客户端 → 路由 → prefill 实例产出 KV → 传输引擎投递给目标 decode 实例 → decode 流式生成 → 路由合并元数据后回传客户端。路由的完整配置见 SGLang Model Gateway 文档。最快跑通 PD 分离单机的三步克隆仓库并安装git clone https://gitcode.com/GitHub_Trending/sg/sglang然后pip install -e .装一个传输引擎生产环境建议uv pip install mooncake-transfer-engine开发验证可以直接pip install nixl起三个进程两个推理服务一个 prefill、一个 decode加一个路由python -m sglang.launch_server --model-path model \ --disaggregation-mode prefill --port 30000 python -m sglang.launch_server --model-path model \ --disaggregation-mode decode --port 30001 --base-gpu-id 1 python -m sglang_router.launch_router --pd-disaggregation \ --prefill http://127.0.0.1:30000 --decode http://127.0.0.1:30001 --port 8000两个容易踩的启动参数参数说明--disaggregation-ib-deviceMooncake 走 RDMA 时必填支持共享设备列表mlx5_0,mlx5_1或按 GPU 的 JSON 映射--disaggregation-transfer-backend nixl指定使用 NIXL 引擎NIXL 侧后端可用SGLANG_DISAGGREGATION_NIXL_BACKEND切换多节点场景比如 DeepSeek 这种 2 节点 × 16 卡的规模就是把上表参数换成--dist-init-addr、--nnodes、--node-rank、--tp-size/--dp-size、--enable-dp-attention这类分布式配置decode 侧再补一个--max-running-requests控制并发上限完整命令见 多节点部署文档 与 PD Disaggregation 文档。拧开关真正决定快慢的几个参数传输链路的吞吐和稳定性主要被这几个环境变量控制均定义在python/sglang/srt/environ.py环境变量作用默认 / 建议SGLANG_DISAGGREGATION_THREAD_POOL_SIZE每个 TP rank 的 KV 传输工作线程数需 ≥ 队列数动态值int(0.75*CPU核数)//8夹在 [4, 12]SGLANG_DISAGGREGATION_QUEUE_SIZE并行传输队列数多个 decode 实例的请求分片共享带宽设为 1 则退化为 FCFS 逐条传4SGLANG_DISAGGREGATION_BOOTSTRAP_TIMEOUTprefill 侧等待目标 KV 索引的初始化超时秒300可放宽到 600代价是 decode 掉线后内存回收变慢SGLANG_DISAGGREGATION_WAITING_TIMEOUTdecode 侧等待 KV 到达的超时秒300可放宽到 600SGLANG_DISAGGREGATION_HEARTBEAT_INTERVAL/_MAX_FAILUREdecode 对 prefill 的健康检查间隔 / 连续失败几次判离线5.0/2NVLink 加速同机多卡A100/H100/H20 等或 NVL72 机型可以让 KV 传输走 NVLink 而不是 PCIe/RDMA# NVL72export SGLANG_MOONCAKE_CUSTOM_MEM_POOLNVLINK export MC_FORCE_MNNVLTrue export SGLANG_MOONCAKE_CUSTOM_MEM_POOLINTRA_NODE_NVLINK export MC_INTRANODE_NVLINKtrue注意辅助数据目前仍走 TCP这是当前的临时方案。异构 TP 的 staging bufferprefill 和 decode 的 TP 大小不一致时例如 prefill TP4、decode 用 DP attention 等效 TP1KV 内存布局对不上。开启SGLANG_DISAGG_STAGING_BUFFER1可再配SGLANG_DISAGG_STAGING_POOL_SIZE_MB默认 4096后prefill 侧把 KV 头切片汇聚到连续缓冲区整块 RDMA、decode 侧再散列回各自页高并发下吞吐可达逐 token 切片的 2–5×且能追平同构 TP 基线约 5% 以内。⚠️ 仅适用于 GQA/MHA 模型MLA 模型DeepSeek-V2/V3 系列不要开两侧 TP 相同时即使开启也会自动旁路。上生产前的检查清单多实例 健康检查prefill 和 decode 都至少部署多实例靠路由层的心跳HEARTBEAT_INTERVAL/MAX_FAILURE把挂掉的实例摘掉别指望单点。跨机架部署 decode 集群可以进一步分散故障域。过载时排队而不是拒绝网关内置重试、熔断Circuit Breaker、限流排队三件套调好阈值后高负载表现为 TTFT 变长而不是 5xx配置细节在 Model Gateway 文档 的 Reliability 一节。超时类问题先确认网络RDMA 设备、--disaggregation-ib-device映射是否逐卡正确再考虑放宽两个 300s 的超时到 600s——记住放宽意味着异常场景下资源回收更慢。负载倾斜检查路由策略是否匹配流量缓存命中敏感的负载用cache_aware必要时给 decode 侧设置--max-running-requests兜底。Profiling 姿势PD 模式下 prefill 与 decode worker 必须分别独立 profiletorch profiler 的限制方法见 Benchmark and Profiling 指南 的 PD 一节。方向上SGLang 后续在推进按输入特征动态调整 prefill/decode 资源配比、MoE 专家层的分布式调度以及用量化压缩降低 KV 传输带宽占用——如果你关注演进节奏可以留意仓库的 release notes。下一步先用上面的三步在单机上跑通确认路由能把请求完整跑完再按检查清单逐项补齐。延伸阅读PD Disaggregation 官方文档、多节点部署、超参调优指南、常见问题 FAQ。【免费下载链接】sglangSGLang is a high-performance serving framework for large language models and multimodal models.项目地址: https://gitcode.com/GitHub_Trending/sg/sglang创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻