Pull Request已成功合入, 合并人@ascend-robot
(感谢 limuan 的贡献)变更摘要
此 PR 在 ProcessGroupHCCL::createHCCLCommOrigin 中引入环境变量 ROOTINFO_SUBCOMM_ENABLE 作为子通信器创建逻辑的守卫开关:仅当该环境变量显式设置为 "1" 时,才尝试通过 createHCCLCommSub 创建子 HCCL 通信域;否则直接跳过子通信器路径,进入基于 HcclRootInfo 的标准通信器创建流程。同时补充了相应的日志输出,便于定位子通信器创建成功与回退的情况。
主要改动
- 引入环境变量守卫
ROOTINFO_SUBCOMM_ENABLE:在createHCCLCommOrigin函数中新增getenv("ROOTINFO_SUBCOMM_ENABLE")检查,将原有的isSub判断与createHCCLCommSub调用包裹在env != nullptr && strcmp(env, "1") == 0条件内,未设置该环境变量时不再执行子通信器创建逻辑。 - 子通信器创建成功时新增警告日志:当
createHCCLCommSub返回true时,通过TORCH_NPU_HCCL_LOGW输出提示,明确告知子通信器已创建但不支持 resume 功能。 - 子通信器创建失败时回退日志保留:原有
TORCH_NPU_HCCL_LOGI回退提示日志被移入环境变量守卫内部,仅在启用子通信器路径且创建失败时输出,语义更加准确。


代码审查
我已经彻底审查了这个 diff。让我总结一下分析结果。
审查分析
这个 diff 修改了 ProcessGroupHCCL::createHCCLCommOrigin 函数,将 createHCCLCommSub(isOrigin=true) 的调用路径用环境变量 ROOTINFO_SUBCOMM_ENABLE 保护起来。
变更逻辑分析:
-
旧行为:对于子进程组(
global_ranks_in_group非空),总是先尝试通过createHCCLCommSub(isOrigin=true)从缓存中获取 global comm 来创建子通信器;失败则回退到 rootinfo 路径。 -
新行为:只有当环境变量
ROOTINFO_SUBCOMM_ENABLE=1时,才尝试createHCCLCommSub(isOrigin=true)路径;否则直接走 rootinfo 路径。 -
调用链:
createHCCLCommEx(第一层尝试createHCCLCommSub(isOrigin=false))→ 失败后调用createHCCLCommOrigin(第二层尝试,现在被 env var 控制)。
逐项排查:
getenv的线程安全性:已有大量相同用法(如第 289、347、356 行等),且此处立即消费返回值,无实际风险。strcmp可用性:<cstdlib>已包含,strcmp通过传递包含在目标平台可用。- 边界条件:
env为nullptr已正确检查;env为空字符串""时strcmp("", "1") != 0,正确走 rootinfo 回退。 - rootinfo 回退路径对子组的正确性:使用
getSize()/getRank()(子组的 size/rank),通过broadcastMasterID广播 rootinfo,可正确创建子组通信器。 - 无资源泄漏、无 use-after-free、无未初始化变量使用。
结论:此 diff 是一个干净的特性开关(feature gate)变更,未引入逻辑错误、安全漏洞、崩溃或回归风险。
审查总结
- P0: 0
- P1: 0
- P2: 0
- P3: 0
已审查文件:
torch_npu/csrc/distributed/ProcessGroupHCCL.cpp— 无问题
整体风险评估:低风险。 该变更是将子通信器的 createSubHcclComm 路径置于 ROOTINFO_SUBCOMM_ENABLE 环境变量开关之后,未启用时走成熟的 rootinfo 回退路径,不改变现有默认行为。
⚠️ 已识别出整体风险,但无法提取行内评论,请参考整体评估。




【合入来源】
【修改方案】
子通信域特性与故障快恢场景下的resume通信域特性冲突,暂时不支持resume子通信域,所以子通信域特性增加一个环境变量开关
【资料变更】
不涉及
【接口变更】
不涉及
【功能验证】
正常拉起训练

【CheckList】