执行摘要
- 一句话:修复 DP buffer 缺失 group 参数
- 推荐动作:建议快速合并。属于 PR#19329 的遗漏修复,改动清晰,经过 CI 验证。可作为理解 SGLang 中通信组管理与 DP/TP 交互的参考案例。
功能与动机
PR#19329 修复了 symm 注册通信组与 collect 操作组不一致导致 symm 失败的问题,但遗漏了 deepseek_v4.py 和 communicator.py 中的两处调用点:deepseek_v4.py 的 forward 中 _use_tp_moe_gather 路径下的 get_global_dp_buffer 和 get_local_dp_buffer 调用未传入 get_tp_group();communicator.py 的 _scatter_hidden_states_moe 方法中 get_local_dp_buffer 调用未传入正确的 group。本 PR 补充了这些遗漏。
实现拆解
-
deepseek_v4.py:导入调整与 forward 调用修改
- 在 python/sglang/srt/models/deepseek_v4.py 中添加 get_tp_group 导入。
- 在 forward 方法的 _use_tp_moe_gather 分支中,get_global_dp_buffer() 改为 get_global_dp_buffer(get_tp_group()),get_local_dp_buffer() 改为 get_local_dp_buffer(get_tp_group())。
-
communicator.py:_scatter_hidden_states_moe 中 group 选择逻辑
- 在 python/sglang/srt/layers/communicator.py 的 _scatter_hidden_states_moe 方法中,添加 group 选择逻辑:当 get_tensor_model_parallel_world_size() == get_attention_dp_size() 时使用 get_tp_group(),否则使用 get_attention_tp_group()。
- get_local_dp_buffer() 调用改为 get_local_dp_buffer(group) 并传入正确 group。
配套变更:仅源码修改,无测试文件或配置变更。
关键文件:
python/sglang/srt/models/deepseek_v4.py(模块 模型层;类别 source;类型 data-contract): DeepSeekV4 模型 forward 路径中 get_global_dp_buffer 和 get_local_dp_buffer 调用缺少 group 参数,导致 symm 通信组不一致。
python/sglang/srt/layers/communicator.py(模块 通信层;类别 source;类型 core-logic): _scatter_hidden_states_moe 方法中 get_local_dp_buffer 调用缺少 group 参数,需要根据 tp world size 与 attention dp size 的关系选择合适的通信组。
关键符号:未识别
关键源码片段
python/sglang/srt/models/deepseek_v4.py
DeepSeekV4 模型 forward 路径中 get_global_dp_buffer 和 get_local_dp_buffer 调用缺少 group 参数,导致 symm 通信组不一致。
# forward 方法中 _use_tp_moe_gather 分支的修改
if _use_tp_moe_gather:
# 传入 get_tp_group() 以确保 symm 注册的通信组与后续 allgather 使用的 tp group 一致
hidden_states, local_hidden_states = (
get_global_dp_buffer(get_tp_group()),
hidden_states,
)
dp_gather_partial(hidden_states, local_hidden_states, forward_batch)
...
if _use_tp_moe_gather:
# 同样,scatter 时也需要正确的通信组
hidden_states, global_hidden_states = (
get_local_dp_buffer(get_tp_group()),
hidden_states,
)
dp_scatter(hidden_states, global_hidden_states, forward_batch)
python/sglang/srt/layers/communicator.py
_scatter_hidden_states_moe 方法中 get_local_dp_buffer 调用缺少 group 参数,需要根据 tp world size 与 attention dp size 的关系选择合适的通信组。
# DP scatter (if DP attention is enabled)
if context.attn_dp_size > 1:
# 根据 TP world size 与 attention DP size 的关系选择正确的通信组
if get_tensor_model_parallel_world_size() == get_attention_dp_size():
group = get_tp_group()
else:
group = get_attention_tp_group()
hidden_states_output, global_hidden_states = (
get_local_dp_buffer(group), # 传入正确的 group
hidden_states,
)
dp_scatter(hidden_states_output, global_hidden_states, forward_batch)
hidden_states = hidden_states_output
评论区精华
无 Reviewer 提出实质讨论。auto-review bot 仅确认了变更内容,未提供具体反馈。
风险与影响
- 风险:低风险。本 PR 仅补充了缺失的 group 参数,属于 PR#19329 的补丁性质修复;改动范围局限在两文件,且逻辑与已有代码一致。未引入新的测试,但原有功能经过 CI 验证(CI 已通过)。可能存在对非 DeepSeekV4 模型的影响,但
get_tp_group 导入和使用仅限于 _use_tp_moe_gather 和 attn_dp_size>1 的路径,这些路径当前仅 DeepSeekV4 模型会进入。
- 影响:直接影响:修复了 DeepSeekV4 模型在 attention context parallel + data parallel 场景下 symm 注册通信组错误的问题。影响范围限定于启用
_use_tp_moe_gather 或 attn_dp_size>1 的推理场景。对不涉及 DP 或 TP 的部署无影响。
- 风险标记:暂无
关联脉络
- PR #19329 Bugfix: fix symm not enabled due to incorrect registration of comm: 本 PR 是 PR#19329 的补丁,补充了遗漏的修改点。
参与讨论