已关闭
[RFC]: HCCL协商模式重构支持通过全局通信域创建子通信域 #1831
wjlflyer创建于  5月7日关闭于  5月26日
wjlflyer成员
5月7日 创建

状态(Status): Reviewing
作者(Authors): @wjlflyer
创建日期(Created): 2026-05-07
更新日期(Updated): 2026-05-07
相关 Issue/PR: https://gitcode.com/Ascend/pytorch/pull/34151

1. 概述

1.1 简介

在torch_npu中创建通信域时,如果没有使用rank_table的话,会通过底层hccl的协商模式,也就是HcclCommInitRootInfoConfig接口创建通信域。这里有一个优化点,如果已经创建过全局通信域的话,此时可以基于全局通信域来创建子通信域,有助于提升初始化通信域的效率。

1.2 动机

在盘古现场进行模型训练时,通过HCCL协商模式初始化通信域阶段耗时较长,客户的脚本中会提前创建全局通信域。此时如果通过创建子通信域方式,有助于提升性能。

1.3 目标

目标:
1、在基于HCCL协商模式初始化通信域时,支持创建子通信域,从而降低初始化阶段耗时,提升性能。

2. 用例分析

1、用户和torch_npu之间交互的用例
image.png
描述:用户通过torch_npu创建通信域

2、torch_npu和hccl通信库交互的用例
image.png
描述:torch_npu通过hccl通信库可以基于协商模式初始化通信域,或创建子通信域。

3. 方案设计

3.1 总体方案

现有流程

ProcessGroupHCCL中现有创建通信域的流程如下:
image.png
createHCCLComm是创建通信域方法,内部会有两个分支,分别基于RankTable方式创建(createHCCLCommEx),或基于协商模式创建(createHCCLCommOrigin);

基于RankTable方式创建,createHCCLCommEx的内部流程如下:
image.png
基于RankTable方式创建中,会判断当前是否是创建全局通信域,全局通信域走createGlobalHcclComm,子通信域走createSubHcclComm;
其中问题是,只有在RankTable方式中,才会走创建子通信域,现在我们希望基于协商模式也能走创建子通信域。

新的流程

设计新的流程图如下:
image.png
1、定义一个新的方法createHCCLCommSub,封装创建子通信域的逻辑;
2、createHCCLComm方法中,先判断是否创建子通信域,如果是则走createHCCLCommSub,如果不是的话,再走RankTable方式创建(createHCCLCommEx),或协商模式创建(createHCCLCommOrigin)。

3.2 技术选型(可选)

不涉及

3.3 安全隐私与DFX设计

安全隐私:本提案不涉及安全隐私内容
可测试性:在代码的分支逻辑中添加debug/info日志,可以确认代码的分支是否符合预期。

3.4 编程与调用设计

3.4.1 编程模型基本设计

开发环境:开发者需要基于昇腾硬件环境,安装cann驱动,以及torch_npu+pytorch等套件;
开发约束:开发者需要基于Python语言进行开发;

3.4.2 接口定义与设计
3.4.2.1 ProcessGroupHCCL::createHCCLCommSub
  • 接口描述:将ProcessGroupHCCL中原有的创建子通信域的逻辑,提取出一个单独的方法。
bool ProcessGroupHCCL::createHCCLCommSub(
    const std::string& devicesKey,
    const std::vector<at::Device>& devices,
    HcclCommType commType,
    HcclCommConfig* commConfig,
    std::vector<std::shared_ptr<HCCLComm>> &hcclComms,
    std::vector<c10_npu::NPUStream> &streamVal,
    int p2pRank);
  • 输入/输出参数:
    输入参数:
参数名称 类型 描述 取值范围
devicesKey std::string 设备标识键,用于唯一标识一组设备组合,在 P2P 场景下会用于计算 hcclid
devices std::vectorat::Device NPU 设备列表,指定需要创建子通信器的设备集合
commType HcclCommType 通信器类型,HcclCommType::DEFAULT (0): 默认类型通信器,HcclCommType::P2P (1): 点对点通信器
commConfig HcclCommConfig HCCL 通信器配置指针
hcclComms std::vector<std::shared_ptr> 输出的 HCCL 子通信器智能指针数组
streamVal std::vector<c10_npu::NPUStream> 输出的 NPU 流数组,与创建的通信器一一对应
p2pRank int P2P 通信时的 rank 标识,仅在 commType == HcclCommType::P2P 时有效

输出参数:

类型 描述 取值范围
bool 是否创建成功,true:成功,false:失败
3.4.3 使用说明

该特性不需要额外的配置参数,使用时注意以下几点:
1、用户未配置rank table文件,则torch_npu不会走HcclCommInitClusterInfoConfig方式初始化通信域;
2、先基于全局通信域执行集合通信,此时torch_npu会通过HcclCommInitRootInfoConfig接口,基于协商模式创建全局通信域;
3、再基于子通信域执行集合佟铁鑫,则此时torch_npu会通过HcclCreateSubCommConfig接口创建子通信域;

4. 测试设计

测试场景 前置工作 执行动作 预期结果
RankTable 创建全局通信域 准备好RankTable文件 创建全局通信域 执行createHCCLCommEx分支正常
RankTable 创建子通信域 准备好RankTable文件 创建子通信域 执行createHCCLCommSub分支正常
协商模式(RootInfo )创建全局通信域 创建全局通信域 验证 fallback 到 createHCCLCommOrigin分支
协商模式(RootInfo )创建子通信域 创建子通信域 执行createHCCLCommSub分支正常

5. 缺点与风险 (可选)

不涉及

6. 现有技术 (可选)

不涉及

7. 未解决问题 (可选)

1、在基于协商模式创建通信域时,执行的是hccl通信库的HcclCommInitRootInfoConfig方法,该方法内部目前有内置逻辑,只有在3w卡以上规模时,才会生效协商模式,这个阈值较高,希望能开放给用户配置,该问题单独给hccl通信库提需求解决。

欢迎加入社区,感谢您对社区的贡献 🎉!

likedislike
Wwjlflyer成员
5月7日 添加了label:rfc
此处折叠了34条事件消息 查看更多
Wwjlflyer成员
6月6日 修改标题为 “[RFC]: HCCL协商模式重构支持通过全局通信域创建子通信域”,原标题为“[RFC]: HCCL协商模式支持通过全局通信域创建子通信域”