Prhub

#25585 [Bugfix] Fix missing group arg in get dp buffer

原始 PR 作者 ShangmingCai 合并时间 2026-05-19 02:08 文件变更 2 提交数 2 评论 2 代码增减 +18 / -4

执行摘要

修复 DP buffer 缺失 group 参数

PR#19329 修复了 symm 注册通信组与 collect 操作组不一致导致 symm 失败的问题,但遗漏了 deepseek_v4.py 和 communicator.py 中的两处调用点:deepseek_v4.py 的 forward 中 _use_tp_moe_gather 路径下的 get_global_dp_bufferget_local_dp_buffer 调用未传入 get_tp_group();communicator.py 的 _scatter_hidden_states_moe 方法中 get_local_dp_buffer 调用未传入正确的 group。本 PR 补充了这些遗漏。

建议快速合并。属于 PR#19329 的遗漏修复,改动清晰,经过 CI 验证。可作为理解 SGLang 中通信组管理与 DP/TP 交互的参考案例。

讨论亮点

无 Reviewer 提出实质讨论。auto-review bot 仅确认了变更内容,未提供具体反馈。

实现拆解

  1. 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())

  2. 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 模型层 modified 6.1
python/sglang/srt/layers/communicator.py 通信层 modified 5.35

关键源码片段

python/sglang/srt/models/deepseek_v4.py data-contract

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 core-logic

`_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

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

低风险。本 PR 仅补充了缺失的 group 参数,属于 PR#19329 的补丁性质修复;改动范围局限在两文件,且逻辑与已有代码一致。未引入新的测试,但原有功能经过 CI 验证(CI 已通过)。可能存在对非 DeepSeekV4 模型的影响,但 get_tp_group 导入和使用仅限于 _use_tp_moe_gatherattn_dp_size>1 的路径,这些路径当前仅 DeepSeekV4 模型会进入。

直接影响:修复了 DeepSeekV4 模型在 attention context parallel + data parallel 场景下 symm 注册通信组错误的问题。影响范围限定于启用 _use_tp_moe_gatherattn_dp_size>1 的推理场景。对不涉及 DP 或 TP 的部署无影响。

关联 Issue

#19329 Bugfix: fix symm not enabled due to incorrect registration of comm

完整报告

参与讨论