Prhub

#27492 Add all_to_all_single to GroupCoordinator

原始 PR 作者 merrymercy 合并时间 2026-06-07 17:48 文件变更 1 提交数 1 评论 2 代码增减 +20 / -0

执行摘要

为 GroupCoordinator 新增 all_to_all_single 通信操作

PR 正文指出:"This enables all-to-all sequence parallelism support for models that manage SP at the model level." 即支持在模型层管理序列并行时所需的 all-to-all 通信原语。

建议精读此 PR 以了解 sglang 中如何扩展分布式通信原语。设计决策上,采用自定义算子注册 + 私有方法分离的模式值得关注。建议后续考虑添加 NPU/XPU 兼容性处理,并补充对应测试。

讨论亮点

Review 中 gemini-code-assist[bot] 提出了一个兼容性建议:为支持 NPU 和 XPU 设备,应在 all_to_all_single 方法中像 all_gather_into_tensor 和 reduce_scatter_tensor 一样,当 _is_npu 或 _is_xpu 时为这些加速器直接调用私有方法 _all_to_all_single(绕过自定义算子注册)。该建议未被 appluse 或后续提交采纳。

实现拆解

  1. 注册自定义算子:在 parallel_state.py 中添加 reg_all_to_all_single 函数,使用 @register_custom_op(mutates_args=["output"]) 装饰器,遵循与 reg_reduce_scatter_tensor 相同的模式,通过 group_name 查找 GroupCoordinator 实例并调用私有方法。
  2. 实现私有通信方法:在 GroupCoordinator 类中添加 _all_to_all_single(self, output, input) 方法,直接调用 torch.distributed.all_to_all_single,使用 self.device_group 作为通信组。
  3. 实现公共接口:添加 all_to_all_single(self, output, input) 方法,当 world_size=1 时直接拷贝 input 到 output(避免不必要的通信开销),否则调用注册的自定义算子 reg_all_to_all_single。
  4. 遵循现有模式:该实现完全沿袭 reduce_scatter_tensor 的层次结构,包括自定义算子注册、私有方法、公共方法的分离,确保一致性。
  5. 未包含测试变更:本次提交仅包含源码文件修改,没有对应的单元测试或集成测试文件变更。
文件 模块 状态 重要度
python/sglang/srt/distributed/parallel_state.py 分布式通信 modified 7.57

关键符号

reg_all_to_all_single _all_to_all_single all_to_all_single

关键源码片段

python/sglang/srt/distributed/parallel_state.py core-logic

该文件是分布式通信的核心实现,本次 PR 的所有变更均在此文件中完成,包括自定义算子注册和 GroupCoordinator 的方法添加。

# python/sglang/srt/distributed/parallel_state.py# 自定义算子注册,遵循与 reg_reduce_scatter_tensor 相同的模式
@register_custom_op(mutates_args=["output"])
def reg_all_to_all_single(
    output: torch.Tensor, input: torch.Tensor, group_name: str
) -> None:
    """通过 group_name 查找 GroupCoordinator 并调用私有方法进行 all_to_all 通信。"""
    assert group_name in _groups, f"Group {group_name} is not found."
    group = _groups[group_name]()
    if group is None:
        raise ValueError(f"Group {group_name} is destroyed.")
    group._all_to_all_single(output, input)
​
​
class GroupCoordinator:
    # ... 其他代码
​
    def _all_to_all_single(
        self, output: torch.Tensor, input: torch.Tensor
    ) -> None:
        """底层通信实现:直接调用 PyTorch 分布式原语。"""
        torch.distributed.all_to_all_single(
            output, input, group=self.device_group
        )
​
    def all_to_all_single(
        self, output: torch.Tensor, input: torch.Tensor
    ):
        """公共接口:world_size=1 时直接拷贝,否则通过自定义算子路由。"""
        if self.world_size == 1:
            output.copy_(input)
            return
        # 按照已有模式(如 reduce_scatter_tensor),通过注册的算子调用
        reg_all_to_all_single(output, input, group_name=self.unique_name)

评论区精华

NPU/XPU 兼容性 compatibility

gemini-code-assist[bot] 建议在 all_to_all_single 方法中检查 _is_npu 或 _is_xpu 标志,为这些设备直接调用私有方法 _all_to_all_single,避免自定义算子注册的问题。

结论:该建议未在 PR 中采纳或讨论后续处理。 · unresolved

风险与影响

  1. 兼容性风险:当前实现仅通过通用自定义算子路径,未处理 NPU/XPU 设备的特殊需求。如果这些设备不支持自定义算子注册,可能导致运行时错误。
  2. 测试覆盖缺失:没有对应的测试变更,all_to_all_single 的功能正确性依赖集成测试,若缺少多 GPU 测试,可能遗留未见 bug。
  3. 回归风险:新增的代码与已有通信模式一致,回归风险较低,但 world_size=1 的短路路径可能被误用。
  1. 用户影响:对用户透明,但为需要序列并行的模型提供了关键通信原语。
  2. 系统影响:扩展了 GroupCoordinator 的通信能力,未来模型开发者可使用 all_to_all_single 实现更灵活的并行策略。
  3. 团队影响:低,仅涉及单一文件,遵循现有代码模式。
缺少测试覆盖 兼容性风险(NPU/XPU)

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论