Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
Inductor 场景执行用例 tc_af_inductor_layernorm_backend_0193(shape=(128,6,23),两条 LayerNorm 路径 + 三路 sum/mean/abs 输出,融合为单张 HintGraph)时,Autofuse Optimize 阶段在 SortSubGraphsByDependency 报 sorted[4] != total[7],拓扑排序卡死,整体编译以 Optimize fail ret 1343225857 中断。
tc_af_inductor_layernorm_backend_0193
SortSubGraphsByDependency
sorted[4] != total[7]
Optimize fail ret 1343225857
根因:ReducePartitionMultipleCitations 对多输出共享节点(÷23 常量 broadcast2、beta 广播 broadcast8、gamma 广播 broadcast9)分别独立决定断图方向,且各节点保留的 consumer 遍历顺序不一致——broadcast2 保留 A 链 consumer(产生 A→B 依赖),broadcast8/broadcast9 保留 B 链 consumer(产生 B→A 依赖),反向依赖对叠加后子图 1 与子图 3 互相等待,形成真实的跨子图数据依赖闭环。原图为无环 DAG,环完全由断图方向不一致制造。
ReducePartitionMultipleCitations
sum(layernorm(input.transpose(0,1)))
mean(layernorm(input))
abs(layernorm(input))
1 -> 3
broadcast2_to_truediv1
3 -> 1
broadcast8_to_mul5
broadcast9_to_add3
多输出共享节点流向不同 Reduce 时的断图方向应由全局机制统一裁决:共享引用链内按唯一 anchor(最小 Reduce ID)统一保留 anchor 侧路径、剪断非 anchor 侧路径,保证子图依赖图无环,拓扑排序可完成,LayerNorm 三路输出编译及执行正常。
SortSubGraphsByDependency: sorted[4] != total[7] Optimize fail ret 1343225857
子图依赖环(故障时):
0 ──→ 4 ──→ 1 ⇄ 3 ──→ 6 2 ──→ 5 ──↗
修复已提交 PR:https://gitcode.com/cann/graph-autofusion/pull/1891(`fix reduce layer norm`),包含两层修复:
cache_reuse_info
schedule_group_tail.cpp
GroupLevelCache
GetCacheReuseInfo
真实 LayerNorm bugshot 回归已确认:原 1 <-> 3 依赖环消失,SortSubGraphsByDependency 通过,流程推进至 host C++ 编译阶段。配套 UT:双 Reduce 交叉引用链、同源同 Reduce 去重、Workspace 复用组 body/tail 一致性等 4 条。
1 <-> 3
Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.
Describe the current behavior / 问题描述 (Mandatory / 必填)
Inductor 场景执行用例
tc_af_inductor_layernorm_backend_0193(shape=(128,6,23),两条 LayerNorm 路径 + 三路 sum/mean/abs 输出,融合为单张 HintGraph)时,Autofuse Optimize 阶段在SortSubGraphsByDependency报sorted[4] != total[7],拓扑排序卡死,整体编译以Optimize fail ret 1343225857中断。根因:
ReducePartitionMultipleCitations对多输出共享节点(÷23 常量 broadcast2、beta 广播 broadcast8、gamma 广播 broadcast9)分别独立决定断图方向,且各节点保留的 consumer 遍历顺序不一致——broadcast2 保留 A 链 consumer(产生 A→B 依赖),broadcast8/broadcast9 保留 B 链 consumer(产生 B→A 依赖),反向依赖对叠加后子图 1 与子图 3 互相等待,形成真实的跨子图数据依赖闭环。原图为无环 DAG,环完全由断图方向不一致制造。Environment / 环境信息 (Mandatory / 必填)
Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)
tc_af_inductor_layernorm_backend_0193(模型:sum(layernorm(input.transpose(0,1)))、mean(layernorm(input))、abs(layernorm(input))三路输出);SortSubGraphsByDependency失败:sorted[4] != total[7];1 -> 3(来源断点broadcast2_to_truediv1)与3 -> 1(来源断点broadcast8_to_mul5、broadcast9_to_add3)同时存在,即双向依赖成环。Describe the expected behavior / 预期结果 (Mandatory / 必填)
多输出共享节点流向不同 Reduce 时的断图方向应由全局机制统一裁决:共享引用链内按唯一 anchor(最小 Reduce ID)统一保留 anchor 侧路径、剪断非 anchor 侧路径,保证子图依赖图无环,拓扑排序可完成,LayerNorm 三路输出编译及执行正常。
Related log / screenshot / 日志 / 截图 (Mandatory / 必填)
子图依赖环(故障时):
broadcast2_to_truediv1(÷23 保留 A 链 consumer,A 供 B)broadcast8_to_mul5、broadcast9_to_add3(beta/gamma 保留 B 链 consumer,B 供 A)Special notes for this issue/备注 (Optional / 选填)
修复已提交 PR:https://gitcode.com/cann/graph-autofusion/pull/1891(`fix reduce layer norm`),包含两层修复:
ReducePartitionMultipleCitations重写为两阶段——图改写前按数据边收集 citation(显式过滤 Load/Store/Workspace synthetic 节点),共享 Reduce 的 citation 组用 Union-Find 合并,每链取最小 Reduce ID 为唯一 anchor,非 anchor 路径统一断开,(source, reduce) 对去重防止重复切分;cache_reuse_info过滤不一致,生成的schedule_group_tail.cpp引用未定义的GroupLevelCache导致 host C++ 编译失败),已在GetCacheReuseInfo入口统一过滤。真实 LayerNorm bugshot 回归已确认:原
1 <-> 3依赖环消失,SortSubGraphsByDependency通过,流程推进至 host C++ 编译阶段。配套 UT:双 Reduce 交叉引用链、同源同 Reduce 去重、Workspace 复用组 body/tail 一致性等 4 条。