已合并
fix: skip broadcast backward for scalar-like producers with empty views #2104
fix: skip broadcast backward for scalar-like producers with empty views #2104
已合并
Jett_Woo创建于 9月14日
Jett_Woo成员
9月14日

Pull Request

描述

修复 BroadcastBackwardPass 对 scalar-like 生产者的处理缺陷。

浮点改写协议产出的 IndexExpr(int64, 空输出视图) → Broadcast → Cast(f32) 链(测试环境 2026-09-14 plog 首次触发)会使 pass 的 scalar 门控失效:

  • CollectBackwardStartNodes 的门控只认 kScalarType,IndexExpr/ScalarData(scalar-like,输出视图为空)绕过门控进入后移;
  • ReorderBroadcasts 先改写图边后,GetBroAxisesIndex 的前后视图轴数断言失败(0 轴 vs N 轴),图停留在半改写状态(边已重排、属性/dtype 未同步),且错误被 RunPasses 忽略后继续编译。

修复内容(broadcast_backward_pass.cpp,+22/-2):

  1. 新增 IsScalarLikeProducer(Scalar/ScalarData/IndexExpr),与 codegen 侧 IsScalarNodeType 白名单语义对齐;CollectBackwardStartNodes 门控与多消费路径 BackwardMultiRefBroadcast 的 is_pre_scalar 判定统一扩展;
  2. ProcessOriginalBackwardLogic 在改写图边前增加前广播视图与广播输出视图的轴数守卫,不一致整体跳过(fail-closed),杜绝半改写状态。

配套测试:测试 builder 新增 IndexExpr 构造方法(真实前端空视图形态,不自动补视图);新增 3 个 UT 覆盖 IndexExpr/ScalarData 门控拒绝与视图守卫兜底。

变更类型

关联的Issue

#302(IndexExpr/Arange Autofusion 与 broadcast backward 合入交叉触发的缺陷,缺陷本体位于 broadcast backward pass)

如何测试

  1. UT:新增 BroadcastBackwardPass.SkipsIndexExprBroadcastSource / SkipsScalarDataBroadcastSource / SkipsBroadcastWithMismatchedPreViewAxes 三个用例——修复前在未修复代码上验证 RED(RunPass 返回 FAILED,错误链与测试环境 plog 逐行一致),修复后 GREEN;
  2. 回归:optimize_ut 全量 759 用例(711 通过 + 48 既有跳过,0 失败);BroadcastBackwardPass 套件 76 用例(基线 33 通过 + 40 既有跳过 → 36 通过 + 40 跳过,仅新增 3 个通过,无既有行为变化);
  3. 真机(Ascend950PR,55 组合三配置对照):无 pass 基线 / develop 原版 pass / pass+本修复——修复零回归(44 PASS 集合完全一致),断言崩溃、半改写、E19999 刷屏全部消除。

核对清单

其他信息

真机对照验证表明:IndexExpr/Arange RDV 回归中另有 11 个组合在原版 pass 下同样失败(multi_arange 断言崩溃;triu/remainder_cast/degenerate_arange_add_3d 因退化轴视图的语义改写错误导致 codegen 失败)——为本修复之外的 pass 独立适配项,本修复未改变其结果(零回归),后续另行跟进。

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 Jett_Woo 的贡献)
JJett_Woo成员
9月14日 创建了 pull request,commit 3a454e79
JJett_Woo成员
9月14日 关联了issue:[Requirement|需求建议]: 支持 IndexExpr 和 Arange Autofusion
atomgit-bot
atomgit-bot
9月14日 评论:

变更摘要

本 PR 修复 BroadcastBackwardPass 对 scalar-like 生产者(输出视图为空)的处理缺陷:浮点改写协议产出的 IndexExpr(int64, 空输出视图) → Broadcast → Cast(f32) 链会绕过原有只认 kScalarType 的 scalar 门控进入广播后移,进而在 ReorderBroadcasts 改写图边后触发 GetBroAxisesIndex 的前后视图轴数断言失败,使图停留在半改写状态且错误被 RunPasses 忽略。核心改动集中在 broadcast_backward_pass.cpp:新增 IsScalarLikeProducer 统一扩展门控判定,并在改写图边前增加轴数守卫(fail-closed)杜绝半改写状态;同时测试 builder 新增 IndexExpr 构造方法以还原真实前端空视图形态,配套新增 3 个 UT 用例。

主要改动

  • 新增 IsScalarLikeProducer 门控函数: 在 broadcast_backward_pass.cpp 中新增 IsScalarLikeProducer(识别 Scalar/ScalarData/IndexExpr,与 codegen 侧 IsScalarNodeType 白名单语义对齐),并将 CollectBackwardStartNodes 的门控判定与多消费路径 BackwardMultiRefBroadcast 的 is_pre_scalar 判定从仅认 kScalarType 统一扩展为该函数,使 scalar-like 生产者按 scalar 输入支持性被正确拒绝后移。
  • 新增前广播视图轴数守卫: 在 ProcessOriginalBackwardLogic 改写图边之前,比较前广播节点与广播输出节点的 AscTensorAttr 的 repeats 轴数,不一致时整体跳过(fail-closed),避免产生边已重排而属性/dtype 未同步的半改写状态。
  • 测试 builder 新增 IndexExpr 构造方法: 在 asc_graph_builder.h / asc_graph_builder.cpp 中新增 AscGraphBuilder::IndexExpr(name, expr, dtype),与真实前端一致地保持 scalar-like 节点输出视图为空(不补 axis/repeats/strides),区别于 Scalar/ScalarData 自动补齐 repeats 的测试便利行为。
  • 新增 3 个 UT 用例: 在 test_broadcast_backward_pass.cpp 中新增 SkipsIndexExprBroadcastSource、SkipsScalarDataBroadcastSource、SkipsBroadcastWithMismatchedPreViewAxes,分别覆盖 IndexExpr/ScalarData 的门控拒绝,以及非 scalar-like 生产者(Load)输出视图被置空后由轴数守卫兜底拒绝的场景,均断言图连接与 dtype 保持原状。
likedislike
不准确?
atomgit-bot
atomgit-bot
9月14日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
CANN-robotCANN-robot成员
9月14日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
9月14日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

✅ Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
repo-cann/graph-autofusion ✅ wangxiaotian995, yangyongqiang0606, zhang_shengjie (3/2) ✅ yangyongqiang0606 (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

Jett_Woo, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
CANN-robotCANN-robot成员
9月14日 将niuyuhu,yangyongqiang0606,liyuewei,xchu42,zhang_shengjie,depeng1994,wqtshg_wt,peiyang,shengnan666,XuebinYang,sjtulxh,zhanj,zhujingjing,xuyafei,wangxiaotian995设为评审人
CANN-robotCANN-robot成员
9月14日 将niuyuhu,yangyongqiang0606,liyuewei,xchu42,zhang_shengjie,depeng1994,wqtshg_wt,peiyang,shengnan666,XuebinYang,sjtulxh,zhanj,zhujingjing,xuyafei,wangxiaotian995设为审查人
Jett_Woo成员
9月14日 评论:

compile

likedislike
JJett_Woo成员
9月14日 预合并成功(commit_id: e1d30aa6081345454d86af60e5ebfa4aaa5b6360)
CANN-robot
CANN-robot成员
9月14日 评论:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robot成员
9月14日 添加了label:ci-pipeline-running
CANN-robotCANN-robot成员
9月14日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
9月14日 添加了label:ci-pipeline-passed
xchu42
xchu42成员
9月14日 评论:

/lgtm

likedislike
zhang_shengjie成员
9月14日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
9月14日 添加了label:lgtm
此处折叠了6条事件消息 查看更多
CANN-robotCANN-robot成员
9月14日 删除了label:ci-pipeline-passed
CANN-robot
CANN-robot成员
9月14日 评论:

Notification

This pull request has been changed(code update) or closed, so removes the following label(s): ci-pipeline-passed.

likedislike
CANN-robotCANN-robot成员
9月14日 删除了label:lgtm
CANN-robot
CANN-robot成员
9月14日 评论:

Notice

New code changes of the pull request are detected and remove these labels lgtm. 😳

likedislike
Jett_Woo成员
9月14日 评论:

compile

likedislike
JJett_Woo成员
9月14日 预合并成功(commit_id: 3ace2f4ed2a73ee564828a1625cda6560ff72978)
CANN-robot
CANN-robot成员
9月14日 评论:
🚀 CI 流水线已启动
📋 执行详情: 点击查看流水线
likedislike
CANN-robotCANN-robot成员
9月14日 添加了label:ci-pipeline-running
CANN-robotCANN-robot成员
9月14日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
9月14日 添加了label:ci-pipeline-passed
JJett_Woo成员
9月14日 添加了 squash commit 备注:fix: skip broadcast backward for scalar-like producers with empty views
zhang_shengjie成员
9月14日 评论:

/lgtm

likedislike
wangxiaotian995成员
9月14日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
9月14日 添加了label:lgtm
yangyongqiang
yangyongqiang成员
9月14日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
9月14日 添加了label:approved
CANN-robotCANN-robot成员
9月14日 合入了pull request