Prhub

#19548 fix: support PP2+CP8+TP8 (PP with context parallelism)

sgl-project/sglang · 作者 whybeyoung · 合并时间 2026-03-17 00:51

分析状态 已生成
文件变更 2提交数 7 · 评论 10
代码增减 +11 / -3
bugfix run-ci scheduling

执行摘要

修复调度器以支持 PP 与 CP 并行,解决 H20 配置下 PP2+CP8+TP8 的通信问题。

PR body中引用PR #19504的评论提到:'i fixed it on H20 * 8 * 2',表明需要修复在H20集群上PP2+CP8+TP8配置下的问题。Issue评论中yiakwy-xpu-ml-framework-team确认修改后PP2+CP工作正常,否则无法生成输出。

建议技术管理者和工程师精读scheduler_pp_mixin.py中的通信逻辑修改,特别是CP广播的添加,以理解分布式数据同步机制。同时关注server_args.py中的配置检查变化,确保在启用PP与CP时正确设置enable_nsa_prefill_context_parallel等变量,并留意未解决的attn_cp_size讨论。

讨论亮点

Review中核心讨论点包括:

  • ShangmingCai建议直接移除断言,但whybeyoung解释需保留条件性断言以避免未实现/测试的无效配置启动,最终达成共识保留修改。
  • yiakwy-xpu-ml-framework-team提出attn_cp_size定义混淆问题,并指出TP=2时也应支持CP、H200无约束,但此疑虑未在本次PR中解决。
  • 所有讨论以批准结束,但遗留了关于attn_cp_size澄清和TP约束的后续工作。

实现拆解

主要改动在两个文件:

  • python/sglang/srt/managers/scheduler_pp_mixin.py:修改_pp_send_pyobj_to_next_stage_pp_recv_pyobj_from_prev_stage函数,添加条件self.attn_tp_rank == 0 and self.attn_cp_rank == 0限制发送/接收操作仅由TP0+CP0 rank执行,并在接收后添加CP广播broadcast_pyobj以确保所有CP rank获取数据。
  • python/sglang/srt/server_args.py:在_handle_context_parallelism方法中,将断言self.pp_size == 1改为条件性检查if not self.enable_nsa_prefill_context_parallel: assert self.pp_size == 1,从而允许PP与CP在NSA预填充上下文并行启用时共存,并设置attn_cp_size = tp_size以适配配置。
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler_pp_mixin.py scheduling modified 8.0
python/sglang/srt/server_args.py configuration modified 5.0

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

关键符号

_pp_send_pyobj_to_next_stage _pp_recv_pyobj_from_prev_stage _handle_context_parallelism

评论区精华

断言移除讨论 设计

ShangmingCai 建议移除断言,whybeyoung 解释需保留以避免无效配置启动,因为未实现 / 测试的组合可能导致问题。

结论:保留条件性断言,仅当 enable_nsa_prefill_context_parallel 为假时触发。 · 已解决

attn_cp_size 澄清和 TP 约束 question

yiakwy-xpu-ml-framework-team 提出 attn_cp_size 定义混淆,并指出 TP=2 时也应支持 CP、H200 无约束,建议移除相关限制。

结论:未在本次 PR 中解决,遗留后续讨论。 · unresolved

风险与影响

技术风险包括:

  • 核心调度通信路径变更(如scheduler_pp_mixin.py中的发送/接收条件)可能引入死锁或数据不一致风险,特别是在分布式环境中依赖TP和CP rank为零的假设。
  • 配置检查放宽(server_args.py中的条件性断言)可能导致无效组合被允许,增加运行时错误风险。
  • 缺少针对PP+CP组合的专门测试,依赖现有CI覆盖,可能隐藏边缘情况。
  • 通信逻辑依赖于特定硬件配置(如H20),在其他平台可能需调整。

影响范围:

  • 用户:现在可以在支持NSA预填充上下文并行的配置下使用PP与CP组合,扩展大规模模型部署的并行选项,提升H20等硬件的资源利用率。
  • 系统:修复已知bug,确保PP2+CP8+TP8等配置正常工作,但需用户正确设置环境变量以避免性能下降或错误。
  • 团队:解决了关键并行支持问题,但遗留了attn_cp_size定义和TP约束的混淆,需后续澄清以维护代码清晰度。
核心路径变更 缺少专门测试 配置检查放宽

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

执行摘要

本次PR修复了SGLang调度器中Pipeline Parallelism (PP) 与Context Parallelism (CP) 结合使用的通信问题,支持PP2+CP8+TP8等配置,通过修改调度器发送/接收逻辑并放宽配置断言,确保在H20等硬件上并行部署正常工作。

功能与动机

动机源于H20 GPU集群上PP与CP结合使用时出现的问题,导致无法生成输出。PR body引用PR #19504的评论,明确需修复此配置下的bug。Issue评论中yiakwy-xpu-ml-framework-team验证修改后PP2+CP工作正常,强调了修复的紧迫性。

实现拆解

主要改动点按模块拆解:

  • 调度器模块(scheduler_pp_mixin.py
    • 修改_pp_send_pyobj_to_next_stage_pp_recv_pyobj_from_prev_stage函数,添加条件self.attn_tp_rank == 0 and self.attn_cp_rank == 0,确保只有TP和CP rank为零的进程进行进程间通信。
    • 在接收后添加CP广播代码块:
      python if self.attn_cp_size > 1: data = broadcast_pyobj( data, self.attn_cp_group.rank, self.attn_cp_cpu_group, src=self.attn_cp_group.ranks[0], )
  • 配置模块(server_args.py
    • _handle_context_parallelism方法中,将硬性断言assert self.pp_size == 1改为条件性检查,仅当enable_nsa_prefill_context_parallel为假时触发,允许PP与CP在NSA预填充上下文并行启用时共存。
    • 设置attn_cp_size = tp_size以适配配置路径。

评论区精华

Review讨论中关键交锋包括:

  • ShangmingCai建议移除断言,但whybeyoung反驳:

    "The assert blocks the case: context parallelism on (attn_cp_size > 1) with pipeline parallelism on (pp_size > 1) while NSA prefill context parallel is off (enable_nsa_prefill_context_parallel=False). That combination is not implemented/tested; removing the check would allow an invalid config to start."
    最终采纳条件性断言,平衡灵活性与安全性。

  • yiakwy-xpu-ml-framework-team提出混淆点:关于attn_cp_size定义和TP约束,指出TP=2时也应支持CP,但此问题被标记为未解决,需后续澄清。

风险与影响

风险

  1. 核心调度通信路径变更可能引入死锁或数据不一致,特别是在分布式环境中依赖特定rank假设。
  2. 配置检查放宽可能导致用户误用未测试组合,引发运行时错误。
  3. 缺少针对PP+CP组合的专门测试,依赖CI覆盖可能不足。

影响

  • 积极影响:扩展并行配置选项,支持更高效的大规模模型部署,提升H20等硬件资源利用率。
  • 潜在影响:需用户确保正确设置enable_nsa_prefill_context_parallel等变量,团队需跟进未解决的attn_cp_size讨论以维护代码质量。

关联脉络

从历史PR看,本次PR与近期调度器优化(如PR #22577修复空闲检测、PR #22453修复HiSparse解码侧)共享调度器模块的演进趋势,反映团队在分布式并行性和性能调优上的持续投入。虽然未直接关联到特定功能线,但共同支撑SGLang在高负载环境下的稳定性和扩展性。

参与讨论