FEATURED · 精选文章

slime 中的 SGLang PD Disaggregation:为 Agentic RL 与长上下文 Rollout 拆分 Prefill/Decode 服务拓扑

发布时间 / 2026/9/16 12:30:11
来源 / 创域科博编辑部
栏目 / 资讯中心
slime 中的 SGLang PD Disaggregation:为 Agentic RL 与长上下文 Rollout 拆分 Prefill/Decode 服务拓扑 slime 中的 SGLang PD Disaggregation为 Agentic RL 与长上下文 Rollout 拆分 Prefill/Decode 服务拓扑【免费下载链接】slimeslime is an LLM post-training framework for RL Scaling.项目地址: https://gitcode.com/GitHub_Trending/slime12/slime在 slime 的 RL 后训练框架中rollout 阶段常常不是一批短 completion 的均匀负载多轮对话、长上下文推理和 agentic 任务会让 prompt 处理Prefill与 token 生成Decode呈现出截然不同的计算与显存特征。本文以 slime 官方文档 pd-disaggregation.md 为核心系统讲解如何在 SGLang rollout 中拆分 Prefill 与 Decode worker、两种配置路径--prefill-num-servers与--sglang-config的用法与取舍并深入仓库源码与测试用例说明 PD 拓扑在训练循环中实际是如何被创建、路由与运维的。读完本文你将掌握为多轮/agentic RL 负载配置生产级 PD 服务拓扑的完整实战方案。什么是 PD Disaggregation为什么 RL 场景尤其需要它PD DisaggregationPrefill/Decode 分离将一次请求的两类核心计算阶段拆分到不同的 worker 上执行。SGLang 原生支持这种部署模式而 slime 把它作为 rollout 阶段的一种可选服务拓扑开放给训练任务。其背后的动机非常直接Prefill 是计算密集型一次性处理整段 prompt可并行度高而 Decode 是显存带宽密集型逐 token 自回归生成单步计算量小、依赖历史 KV cache。把两者放在同构的引擎组里往往意味着无法同时为两种负载选择最优的张量并行TP规模与显存分配。这一差异在多轮、长上下文与 agentic RL 负载中被急剧放大。agentic 与 verifier-based 工作负载通常具有来自工具/环境历史的长 prompt每个样本的多轮交互长尾的 decode 延迟会话级前缀缓存prefix cache的复用机会actor、reference、reward、judge 等不同模型对资源的不同需求。PD 让 slime 在保持训练循环不变的前提下采用与真实 serving 工作负载更接近的 rollout 拓扑。对于短的单轮任务默认的单一 SGLang 引擎组布局通常更简单、更合适是否需要 PD取决于负载特征。适用场景何时该用 PD Disaggregation根据官方文档当出现以下一种或多种情况时建议启用 PD Disaggregationrollout 上下文很长或随轮次增长多轮历史不断累积decode 阶段主导了 rollout 耗时生成 token 多、等待时间集中在 decode前缀缓存局部性prefix-cache locality对多轮会话很重要prefill 与 decode 需要不同的 TP、显存或运行时设置例如 prefill 用更小的 TP 提高单卡吞吐decode 用更大的 TP 降低延迟你希望 SGLang serving 拓扑更接近生产部署而不是一个单一均匀的推理组。而对于短的单轮任务默认的 regular SGLang 引擎布局通常更简单无需引入 PD 的复杂度。配置路径一简单方式--prefill-num-servers对于只有一个 actor 模型的简单 PD 布局slime 提供了轻量级入口。在命令行中设置 prefill worker 的数量即可python train.py \ --prefill-num-servers 1 \ ...这是简单脚本常用的轻量路径适合只需要拆分 prefill/decode、而不需要分别调优每个服务组的场景。从源码看该参数在 arguments.py 中注册为--prefill-num-serversint 类型默认None。当它被设置时resolve_sglang_config()会调用SglangConfig.from_prefill_num_servers()把它转换为一个等价的 PD 配置prefill_gpus args.prefill_num_servers * args.rollout_num_gpus_per_engine decode_gpus total_gpus - prefill_gpus也就是说prefill 组占用prefill-num-servers × rollout-num-gpus-per-engine张卡剩余 GPU 全部划给 decode 组见 sglang_config.py。这种方式隐藏了服务组细节但灵活性有限无法独立设置 prefill 与 decode 各自的 TP 或 SGLang 参数。配置路径二进阶方式--sglang-config对于生产级 rollout 拓扑官方文档明确推荐使用 SGLang Config。它允许独立配置 prefill 与 decode 组还能表达 EPD 风格布局、异构服务组、多模型 serving 以及按组覆盖 SGLang 参数。基础 PD 配置示例# sglang_pd.yaml sglang: - name: actor update_weights: true server_groups: - worker_type: prefill num_gpus: 4 num_gpus_per_engine: 2 overrides: chunked_prefill_size: 8192 - worker_type: decode num_gpus: 12 num_gpus_per_engine: 4 overrides: mem_fraction_static: 0.88启动命令python train.py \ --sglang-config sglang_pd.yaml \ --rollout-num-gpus 16 \ ...配置字段详解--sglang-config指向一个 YAML 文件顶层是sglang键值为模型定义列表。模型级与组级字段如下模型级字段Model-Level字段类型默认值说明namestr必填该模型的唯一标识如actor、ref、reward用作args.sglang_model_routers的 keymodel_pathstrargs.hf_checkpointHF checkpoint 路径同一模型下所有服务组必须使用相同路径update_weightsbool自动推断该模型是否接收训练权重更新未设置时若 model_path 与--hf-checkpoint一致则推断为true否则为false并给出警告num_gpus_per_engineintargs.rollout_num_gpus_per_engine该模型所有服务组的默认 TP 规模组级可覆盖server_groupslist必填定义引擎拓扑的ServerGroupConfig列表兼容旧字段名engine_groups服务组级字段Server Group-Level字段类型默认值说明worker_typestr必填引擎类型regular标准、prefillPD prefill worker、decodePD decode worker、placeholder保留 GPU 槽位但不启动引擎num_gpusint必填该组分配的 GPU 总数必须 0num_gpus_per_engineint模型级num_gpus_per_engineTP 规模覆盖值即每个引擎实例占用的 GPU 数overridesdict{}SGLangServerArgs字段覆盖优先级最高覆盖--sglang-*CLI 参数Worker 类型说明类型说明适用场景regular标准 SGLang 引擎默认模式同时处理 prefill 与 decodeprefillPD 分离的 prefill worker专用于 prompt 处理与decodeworker 配对decodePD 分离的 decode worker专用于 token 生成与prefillworker 配对placeholder保留 GPU 槽位不创建引擎为训练共置或未来使用预留 GPU这些字段与数据类一一对应ServerGroupConfig定义了worker_type、num_gpus、num_gpus_per_engine、overrides并在__post_init__中校验 worker_type 合法性合法值为regular、prefill、decode、placeholder、encoder以及num_gpus 0ModelConfig则承载模型级字段并实现resolve()解析逻辑见 sglang_config.py。多组差异化的意义上例中 prefill 组使用num_gpus_per_engine: 2TP2与chunked_prefill_size: 8192decode 组使用num_gpus_per_engine: 4TP4与更高的静态显存比例mem_fraction_static: 0.88。这正是 PD 的核心价值prefill 用较小 TP 换取更高的单卡吞吐decode 用较大 TP 压低生成延迟两者容量可独立伸缩。SGLang Config 文档对此的总结是PD 分离允许更小的 prefill TP提升单卡吞吐、更大的 decode TP降低延迟、以及 prefill/decode 容量的独立扩展。EPD 等扩展布局从源码看服务组类型还支持encoder见 sglang_config.py用于 EPDEncoder-Prefill-Decode分离encoder 引擎先启动其 URL 会自动注入到 prefill 组作为encoder_urls见 disaggregation.py这是 PD 之上面向多模态等负载的进一步扩展也印证了--sglang-config的可表达范围远超简单 PD。底层实现PD 拓扑如何被创建与注册了解配置后我们进入源码层面看 PD 拓扑的完整生命周期。入口是 deployment.py 中的start_rollout_servers()调用resolve_sglang_config(args)解析配置。解析顺序为显式--sglang-config→--prefill-num-servers→ 默认 regular 单组若显式配置的 GPU 总数与--rollout-num-gpus不一致会直接断言失败见 sglang_config.py。对每个模型调用model_config.resolve(args)完成组级默认值num_gpus_per_engine、model_path回落与update_weights自动推断。通过_start_router()启动该模型专属的 router。关键点在于当模型存在 PD 分离时router 会以pd_disaggregationTrue启动见 deployment.py即 SGLang Model Gatewaysgl-router开启 PD 模式负责把请求按阶段调度到 prefill / decode 组。依据模型是否含 encoder / PD 分组分别走start_epd_server_groups()、start_pd_server_groups()或普通逐组启动逻辑。start_pd_server_groups()会为每个组创建ServerGroup并start_engines()把引擎初始化句柄异步收集起来见 disaggregation.py。每个模型封装成RolloutServer含 server_groups、router 地址、update_weights 标记最后填充args.sglang_model_routers {name: (router_ip, router_port)}供 rollout 代码按模型名路由请求。在引擎侧worker_type会被翻译成 SGLang 的disaggregation_modeprefill worker 额外要求disaggregation_bootstrap_portdecode worker 则以disaggregation_modedecode启动见 sglang_engine.pyprefill 组的端口分配中也会为每个引擎预留disaggregation_bootstrap_port见 engine_group.py用于 prefill 与 decode 之间的 KV 传输。slime 会在每个 PD 引擎的 Ray actor 环境中注入一系列 SGLang 运行参数包括关闭 TP 显存失衡检查、启用 CUDA graph 的 memory saver 等见 engine_group.py这些细节进一步表明 PD 拓扑在 slime 中是一等公民而非临时拼凑的脚本。PD 与 RL 训练循环的结合PD 之所以对 RL 重要是因为它让 rollout 拓扑与训练循环解耦权重同步按模型进行只有update_weights: true的模型通常是 actor接收训练权重更新ref、reward 等冻结模型原样服务。这在多模型 PD 组合配置中尤为关键——actor 走 prefill/decode 拆分ref/reward 走 regular 组即可参考 sglang-config.md 的完整示例。按模型路由自定义 rollout 函数可用get_model_url(args, actor, /generate)从args.sglang_model_routers读取指定模型的 router 地址见 sglang-config.md。会话亲和路由多轮 agent 场景中同一个样本的多轮 turn 若能命中同一 worker即可复用前缀缓存。slime 为每个样本分配唯一session_id在consistent_hashing路由策略下以X-SMG-Routing-Key头传给 SGLang Model Gateway保证同会话所有 turn 稳定路由到同一 worker显著提升前缀缓存命中率详见 sglang-config.md 的 Session-Affinity Routing 一节。运维注意事项与最佳实践官方文档给出如下运维要点对于新的复杂部署优先使用--sglang-config而非--prefill-num-servers。两者互斥见 arguments.py 的断言校验--prefill-num-servers是旧式入口新部署建议迁移。多轮 agent 场景下使用 router 的 session affinity 路由让同一样本的各轮复用前缀缓存。保持--rollout-num-gpus等于 SGLang config 描述的总 GPU 数——源码会在resolve_sglang_config()中断言二者相等。不要在同一模型条目内混用regularworker 与prefill/decodeworker。PD 要求一个模型的服务组要么全部是 prefill/decode 对要么全部是 regular参考 sglang-config.md 的 FAQ。当 prompt 处理与 token 生成的瓶颈不同时分别调优 prefill 与 decode 的 TP。同一模型内所有服务组必须共享同一个model_path这在ModelConfig.resolve()中被显式校验见 sglang_config.py需要不同模型时请定义为独立的模型条目。num_gpus不能被num_gpus_per_engine整除时多节点引擎按每节点 GPU 数计算例如 8 GPU/节点下num_gpus_per_engine: 16意味着每个引擎横跨 2 个节点。实战验证仓库中的 PD 测试用例仓库测试 test_qwen3.6_35B_A3B_pd_mooncake.py 是一个端到端的 PD Mooncake 传输后端参考实现展示了 PD 配置如何与 SGLang 其他特性协同--rollout-num-gpus-per-engine 4 \ --sglang-mem-fraction-static 0.75 \ --sglang-enable-dp-attention \ --sglang-dp-size 4 \ --sglang-ep-size 4 \ --sglang-max-running-requests 512 \ --prefill-num-servers 1 \ --sglang-disaggregation-transfer-backend mooncake \ --sglang-speculative-algorithm EAGLE \ --sglang-speculative-num-steps 3 \这个用例同时组合了 PD 分离、Mooncake KV 传输后端、DP attention 与 EAGLE 投机解码且使用了--colocate与训练共置说明 PD 拓扑在生产级含共置训练、显存释放/加载场景下的可行性。另在 tests/utils/test_sglang_config.py 中单元测试验证了update_weights的自动推断、engine_groups兼容别名以及多模型 GPU 总数统计可作为理解配置解析行为的参考。与相关文档的关系PD Disaggregation 是 slime SGLang 部署体系中的一个组成部分SGLang Config 是--sglang-config的完整参考手册覆盖多模型 serving、EPD、placeholder 组、per-group overrides、router 策略与解析规则Agentic RL Training Roadmap 说明 agentic RL 训练路线PD 是其中的典型 rollout 拓扑需求Trace Viewer 用于观测与定位 rollout 性能问题。对于任何面向多轮、长上下文或 agentic 负载的 slime RL 任务建议将 PD Disaggregation 纳入 rollout 拓扑设计的第一步先用--prefill-num-servers快速验证收益再迁移到--sglang-config精细调优 prefill/decode 的 TP、显存与 SGLang 参数最终形成与生产 serving 一致的部署形态。【免费下载链接】slimeslime is an LLM post-training framework for RL Scaling.项目地址: https://gitcode.com/GitHub_Trending/slime12/slime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻