已关闭
[Bug-Report|缺陷反馈]: #784
chenyizhuo创建于  13 天前关闭于  12 天前
chenyizhuo
13 天前 创建

Describe the current behavior / 问题描述 (Mandatory / 必填)

hccl/experimental/README.md中要求贡献特性必须通过运行期开关控制是否生效,当前experimental/ops/all_reduce/example未加入运行期开关。

Steps to reproduce the issue / 重现步骤

NA

Describe the expected behavior / 预期结果 (Mandatory / 必填)

experimental/ops/all_reduce/example代码中按照hccl/experimental/README.md中的模板加入运行期开关

likedislike
Cchenyizhuo
13 天前 修改了issue 的描述
Cchenyizhuo
13 天前 修改了issue 的描述
Leewis成员
13 天前 评论:

问题确认:成立

1. 现状复核(代码证据)

  • 约束来源:experimental/README.md 第 5 节「运行期开关」(commit af6ae92f / MR !1258,2026-06-08 合入)明确要求:贡献特性必须通过环境变量 HCCL_EXPERIMENTAL_<NAME>=true 控制是否生效,项目入口提供 IsXxxEnabled() 判断函数,且特性入口必须 if (IsXxxEnabled()) { ... } 守卫。
  • example 现状:全目录检索无任何 getenv / IsXxxEnabled / HCCL_EXPERIMENTAL_* 用法。当前唯一的生效门控均为编译期/静态条件:
    1. ENABLE_EXPERIMENTAL=ON(experimental/ops/CMakeLists.txt:11-17 守卫,由 build.sh --experimental 控制,本目录随 add_subdirectory(all_reduce/example) 编入 hccl 目标);
    2. CANN_VERSION_NUM >= CANN_VERSION(9, 0, 0)(executor .cc:374);
    3. 运行期拓扑条件 userRankSize == 2——但它不是开关,而是 REGISTER_ALG_ATTRS 中 op.opPriorityCheck 的优先选中条件(executor/ins_v2_all_reduce_experimental_sole_executor.cc:386-388),条件满足即无条件生效。
  • 时间线:开关约束 2026-06-08 合入;example(前身 register_v2_test)2026-09-01 创建(commit 2107dfc6),晚于约束约 3 个月,创建时即未按约束实现;2026-09-22 适配最新 src(commit 17171488)时也未补充。

2. 影响评估

  • 默认构建(ENABLE_EXPERIMENTAL=OFF):example 不参与编译,零影响。
  • 实验构建(ON):example 经 REGISTER_EXEC_V2 / REGISTER_ALG_ATTRS 注册进与主链路相同的注册表(CollAlgExecRegistryV2 / AlgAttrsRegistry),其 opPriorityCheck 在选择器扫描算法时全局生效——进程内所有单机两卡 AllReduce(受支持数据类型)被本算法无条件优先选中,无需任何显式开启动作(example README 第 5 节记录的验证结果"runner 双 rank 均选中 CcuMSAllReduceExperimentalSoleMesh"亦印证了这一点)。后果:
    • 改变该构建中主链路算法在两卡场景的常规选择结果;
    • 挤占其他 experimental 算法的验证空间——example README 限制#1 已自认此风险("opPriorityCheck 会在选择器扫描算法时全局生效……验证其他 experimental/ 算法时,必须裁剪本目录的编译/注册以确保本算法不被选中"),但其对策是手工裁剪构建,这正是第 5 节运行期开关要消除的"意外开启影响主干"路径。

3. 修复建议(对齐 README §5 模板与仓内参照实现)

仓内已有完全合规的参照实现:experimental/ops/op_common/recursive_executor/executor/adaptor_executor.cc:18-26 的 IsRecursiveExecutorEnabled()(constexpr 主开关默认 false + 环境变量 HCCL_EXPERIMENTAL_RECURSIVE_EXECUTOR 判 "true")。建议 example 照此补充:

  1. 新增 IsAllReduceExampleEnabled()(开关名建议 HCCL_EXPERIMENTAL_ALL_REDUCE_EXAMPLE,按 §5 命名约定,最终命名由责任田确认);
  2. 守卫位置:REGISTER_ALG_ATTRS 属性中增加 op.opCustomCheck(返回 false 即被过滤出 cost 竞争——开关关闭时算法完全不参与选择,实现完整隔离),并让 op.opPriorityCheck 以 开关 && userRankSize == 2 判断(开启时才两卡优先)。REGISTER_EXEC_V2 为静态注册、无法运行期门控,选择回调层即本特性的正确"入口";
  3. 模板细节提示:按模板字面 constexpr bool xxxEnabled = false 时特性硬关(环境变量亦无效),需维护者翻转常量后才可经环境变量启用。本样例的定位是验证 A5 注册链路可用性,constexpr 默认取 false(与 recursive_executor 一致)还是 true(保留样例经环境变量即可测的可用性),建议责任田权衡;
  4. 同步更新 example README:第 4 节「用法」补充运行期开关说明;限制#1 的"必须裁剪编译/注册"手工对策改由开关控制替代。

4. 扩展发现(建议责任田同批评估)

  1. birs 项目开关命名不合规:experimental/ops/reduce_scatter/reduce_scatter_op_experimental.cc:143-153 的 MatchBIRS() 读取 HCCL_BIRS_ENABLE 且判断 "TRUE"——不符合 §5 的 HCCL_EXPERIMENTAL_<NAME> 命名与 "true" 取值约定,也无 constexpr 主开关,建议一并对齐;
  2. 建议为 experimental/ 新增代码增加开关合规性静态检查(如 CI 扫描特性代码须包含 HCCL_EXPERIMENTAL_ 前缀的环境变量守卫),防止同类问题随新贡献再次引入。

本回复为 AI 结合源码深度分析生成,将同步对应责任田团队进行二次确认。

likedislike
LLeewis成员
12 天前 将 chenyizhuo 设为负责人
Leewis成员
12 天前 评论:

https://gitcode.com/cann/hccl/pull/3407 相关PR已修改合入;

likedislike
LLeewis成员
12 天前 issue状态由 进行中 改变为 已完成
LLeewis成员
12 天前 关闭了 issue
CANN-robotCANN-robot成员
12 天前 添加了label:resolved