# PR #25585 完整报告

- 仓库：`sgl-project/sglang`
- 标题：[Bugfix] Fix missing group arg in get dp buffer
- 合并时间：2026-05-19 02:08
- 原文链接：http://prhub.com.cn/sgl-project/sglang/pull/25585

---

# 执行摘要

- 一句话：修复 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 补充了这些遗漏。

# 实现拆解

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`（模块 模型层；类别 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 通信组不一致。

```python
# 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 的关系选择合适的通信组。

```python
# 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 的补丁，补充了遗漏的修改点。