Prhub

#29571 fix: include CP size in PP rank offset

原始 PR 作者 SSSunzt 合并时间 2026-06-29 16:01 文件变更 3 提交数 1 评论 6 代码增减 +143 / -3

执行摘要

修复 PP 通信中缺失 CP 维度导致的 rank 偏移错误

来自 issue #29567:当 pp_size>1, attn_cp_size>1, attn_dp_rank>0 时,PP point-to-point 通信中 dp_offset 缺失 attn_cp_size 因子,导致 rank 不匹配和潜在挂起。参考官方 rank 布局定义于 dp_attention.py:250-252。

值得精读,尤其是了解分布式 rank 布局和多维度并行交织的通信设计。对理解 sglang 的 (dp, cp, tp) 维度布局有启发。

讨论亮点

ShangmingCai 在 review 中指出:"Logic looks good. We used to reuse the DP field for CP, since they are separated now, this fix adapts to the new impl." 这揭示此前 CP 和 DP 复用了一个字段,现在分离后需要显式相乘。

实现拆解

  1. 修改 python/sglang/srt/managers/scheduler_pp_mixin.py_pp_send_pyobj_to_next_stage_pp_recv_pyobj_from_prev_stagedp_offset 计算,从 attn_dp_rank * attn_tp_size 改为 attn_dp_rank * attn_cp_size * attn_tp_size
  2. 修改 python/sglang/srt/managers/scheduler_components/request_receiver.py_pull_raw_reqsdp_offset 计算,同样加入 attn_cp_size
  3. 新增 test/registered/unit/managers/test_pp_cp_rank_offsets.py,通过两个测试用例分别验证 request_receiver 和 scheduler_pp_mixin 在模拟的 (dp1, cp2, tp2) 布局下产生的预期 rank 值。
文件 模块 状态 重要度
test/registered/unit/managers/test_pp_cp_rank_offsets.py 秩偏移 added 7.24
python/sglang/srt/managers/scheduler_pp_mixin.py PP 调度 modified 5.88
python/sglang/srt/managers/scheduler_components/request_receiver.py 请求接收 modified 5.68

关键符号

_pp_send_pyobj_to_next_stage _pp_recv_pyobj_from_prev_stage _pull_raw_reqs

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

评论区精华

CP 和 DP 字段分离后的适配 设计

ShangmingCai: "Logic looks good. We used to reuse the DP field for CP, since they are separated now, this fix adapts to the new impl."

结论:设计合理,批准合并。 · 已解决

风险与影响

涉及分布式 P2P 通信核心路径,若计算错误会导致集群挂起或数据损坏。由于改动简单(仅一行因子乘法)且已有单元测试覆盖两个主要路径,风险可控。但测试仅在 CPU 模拟环境运行,生产环境多卡组合仍需验证。

仅影响同时启用 PP、CP 和 DP 的部署场景(如 pp_size>1, attn_cp_size>1, attn_dp_rank>0),对默认配置(pp=1 或 cp=1)无影响。修复后此类拓扑的 point-to-point 通信不再错位,减少挂起几率。

核心路径变更 分布式通信

关联 Issue

#29567 [Bug] Incorrect dp_offset in PP point-to-point request transfer when attn_cp_size > 1

完整报告

参与讨论