执行摘要
- 一句话:修复 PP 通信中缺失 CP 维度导致的 rank 偏移错误
- 推荐动作:值得精读,尤其是了解分布式 rank 布局和多维度并行交织的通信设计。对理解 sglang 的 (dp, cp, tp) 维度布局有启发。
功能与动机
来自 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。
实现拆解
- 修改
python/sglang/srt/managers/scheduler_pp_mixin.py 中 _pp_send_pyobj_to_next_stage 和 _pp_recv_pyobj_from_prev_stage 的 dp_offset 计算,从 attn_dp_rank * attn_tp_size 改为 attn_dp_rank * attn_cp_size * attn_tp_size。
- 修改
python/sglang/srt/managers/scheduler_components/request_receiver.py 中 _pull_raw_reqs 的 dp_offset 计算,同样加入 attn_cp_size。
- 新增
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(模块 秩偏移;类别 test;类型 test-coverage;符号 _make_ps, _fake_group, _make_receiver, TestPPCPRankOffsets): 新增测试,覆盖 request_receiver 和 scheduler_pp_mixin 中 rank 计算的修正逻辑。
python/sglang/srt/managers/scheduler_pp_mixin.py(模块 PP调度;类别 source;类型 core-logic;符号 _pp_send_pyobj_to_next_stage, _pp_recv_pyobj_from_prev_stage): 核心修改,修复 PP 对象发送和接收路径中的 rank 偏移计算。
python/sglang/srt/managers/scheduler_components/request_receiver.py(模块 请求接收;类别 source;类型 core-logic;符号 _pull_raw_reqs): 修改 PP 接收方在 pull_raw_reqs 中的 rank 偏移计算。
关键符号:_pp_send_pyobj_to_next_stage, _pp_recv_pyobj_from_prev_stage, _pull_raw_reqs
评论区精华
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 复用了一个字段,现在分离后需要显式相乘。
- CP 和 DP 字段分离后的适配 (design): 设计合理,批准合并。
风险与影响
- 风险:涉及分布式 P2P 通信核心路径,若计算错误会导致集群挂起或数据损坏。由于改动简单(仅一行因子乘法)且已有单元测试覆盖两个主要路径,风险可控。但测试仅在 CPU 模拟环境运行,生产环境多卡组合仍需验证。
- 影响:仅影响同时启用 PP、CP 和 DP 的部署场景(如 pp_size>1, attn_cp_size>1, attn_dp_rank>0),对默认配置(pp=1 或 cp=1)无影响。修复后此类拓扑的 point-to-point 通信不再错位,减少挂起几率。
- 风险标记:核心路径变更, 分布式通信
关联脉络
参与讨论