| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
feat: 首轴是R轴的全载模板 Co-authored-by: gcw_VrYdxeoU<wangzhi126@huawei.com> # message auto-generated for no-merge-commit merge: !2516 merge feat/adapt_RA_Allload into develop feat: 首轴是R轴的全载模板 Created-by: gcw_VrYdxeoU Commit-by: gcw_VrYdxeoU Merged-by: cann-robot Description: # Pull Request ## 描述 feat: 首轴为R结构补一根无效轴以支持AllLoad全载模板 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue NA ## 如何测试 1、构造以R为首轴的reduce用例,看是否生成了R轴全载模板,并且不影响网络精度 2、构造以A为首轴的reduce用例(AR、ARA、AAA...AR除外,这些本来就会全载),看是否生成了R轴全载模板,并且不影响网络精度 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 NA See merge request: cann/graph-autofusion!2516 | 5 天前 | |
【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1149 merge develop_change_dir_of_metadef_headers into develop 【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 metadef在做同名头文件整改,整改完编译发现gaf失败,原因是gaf仓和ge仓也有同名且子目录相同的头文件,故需要将gaf仓的同名头文件的子目录进行整改,只给gaf仓内部使用,避免产生耦合编译问题。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. ci流水线pass 2. RDV pass ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1149 | 3 个月前 | |
perf: SIMT融合寄存器压力模型位宽感知——全成员uint32走32位细化常数+codegen位宽漂移防护 Co-authored-by: wangyichao0421<wangyichao1@huawei.com> # message auto-generated for no-merge-commit merge: !2657 merge feat/width-aware-register-model into develop perf: SIMT融合寄存器压力模型位宽感知——全成员uint32走32位细化常数+codegen位宽漂移防护 Created-by: wangyichao0421 Commit-by: wangyichao0421 Merged-by: cann-robot Description: ## 改动内容 **模型(indirect_load_utils.h,调度期门控与 codegen 共用单一来源)** - 寄存器压力模型常数上移至公共头文件,新增 32 位细化档:64 位基准 R = 24+18N+5S+3E(既有行为不变);全成员 uint32 时 R = 23+10N+4S+3E - SimtFusedRegisterDemand / SimtFusedThreadTier 内联助手 + SimtFusedMergeInfo 增加 R_est 组件计数 **门控后置(调度期 ApplyGraphPassGroup)** - 位宽判定来源改为各成员 lowering 元数据的 offset_width(与 codegen 选 fused OffsetType 的判定同源) - FinalizeLoweringMetadata 提前到融合发射标记之前构建(BuildSimtLoweringMetadata 仅依赖 simt_group_member 组员分支,与融合标记无关,构建顺序调换不改内容) - 门控在元数据之后执行:全成员 uint32 时 fused 成员上限 N=5→10、线程档整体放宽一档;64 位基准行为不变 **生成期 UB 预估触发条件修正(评审意见 P1)** - IsGroupSimtL4UbDoomed 进入条件改用 32 位基准(N≥11 才触发)——仅当两种位宽基准下均无融合可能(形态必然 L4)时才做 UB 下界校验 - N=6~10 全 uint32 组不再在门控前被整条丢弃(L2/L3 fused 机会保留);64 位时由 tiling 期资源校验淘汰、SK 兜底 - 同时解决"L2 无 value tile 却被 UB 下界否掉"的形态误用 **位宽漂移防护(codegen fused 路径)** - codegen 按当前图重建的策略位宽为权威:64 位时按 64 位基准重算档位取小,避免档位超出实际可容纳范围 ## 测试 - UT 公式边界:64 位 N=5/6 两侧门槛、32 位 N=10/11 两侧门槛、side load/链节点系数、档位映射 - UT 集成:三成员具体尺寸(span 静态可解→offset_width=uint32)→ 断言 merge_info.max_thread_tier=512(对照 64 位基准的 256 档,即位宽贯通的观测点) - 既有用例全部不受影响(符号尺寸→64 位→判定不变) ## 设计文档 设计文档维护在本仓库之外(内部文档库),「寄存器压力模型」章节已同步更新(位宽拆解表、常数与推导的口径说明、门控后置说明、生成期预估触发条件修正)。如需将设计文档入库请告知路径约定。 See merge request: cann/graph-autofusion!2657 | 1 天前 | |
【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1149 merge develop_change_dir_of_metadef_headers into develop 【PR】: [fix] [autofuse] adapt reform of the same-named header files of ge. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 metadef在做同名头文件整改,整改完编译发现gaf失败,原因是gaf仓和ge仓也有同名且子目录相同的头文件,故需要将gaf仓的同名头文件的子目录进行整改,只给gaf仓内部使用,避免产生耦合编译问题。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. ci流水线pass 2. RDV pass ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1149 | 3 个月前 | |
回退放开norm类RC模板切分 Co-authored-by: wei_shi<huangqianqian15@huawei.com> # message auto-generated for no-merge-commit merge: !2666 merge revert-mr-2659-1793086729787-auto into develop 回退放开norm类RC模板切分 Created-by: wei_shi Commit-by: wei_shi Merged-by: cann-robot Description: # Pull Request ## 描述 影响rdv run_SIM_torch网络,导致网络运行超时,回退fix: 修复R轴分核第一阶段展开共享图导致的核函数重复定义 + 放开norm类RC模板切分的提交 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 2. ## 核对清单 <!-- [x] 表示选中 --> - [ ] 我的代码遵循了项目的代码风格 - [ ] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [ ] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [ ] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!2666 | 13 小时前 | |
【PR】: fix: 修复 Reduce 子图复制的边重连 Co-authored-by: chengzhiwei<chengzhiwei5@huawei.com> # message auto-generated for no-merge-commit merge: !1544 merge develop into develop 【PR】: fix: 修复 Reduce 子图复制的边重连 Created-by: czways Commit-by: chengzhiwei Merged-by: cann-robot Description: # Pull Request ## 描述 修复 Autofuse 在 Reduce 相关场景复制或合并子图时的边重连问题:以源节点到克隆节点的 NodeCloneMap 替换按节点名的映射,分别重连数据边和控制边;同时按节点 ID 稳定输出节点顺序,消除调度组结果对容器遍历顺序的依赖。 ## 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue - 关联并在合并后关闭 [#215](https://gitcode.com/cann/graph-autofusion/issues/215):修复 Reduce 场景子图复制后的边重连异常。 ## 如何测试 1. 新增或更新 test_schedule_group_partitioner,覆盖调度组分区和图合并后的边重连。 2. 更新 test_optimizer 与 optimize_st,按结果集合验证,覆盖不同调度组顺序。 3. 本次仅整理 PR 元信息,未额外执行构建或测试命令。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [ ] 我已对代码进行了自测 - [x] 本次变更无需更新相关文档 - [x] 我在标题中使用了合适的类型标签(如:fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 ## 核心问题 **图中存在重名节点时,按节点名称做查找/映射/匹配会导致边连接错误或节点丢失。** 重名节点的来源: PartitionByNode 中,workspace_pre 和 workspace_post 通过 GetNewNodeName(src_node, dst_node, "Workspace", out_anchor->GetIdx()) 生成名称(reduce_schedule_case_generator.cpp:442-444)。当不同 reduce 节点被分区时,可能产生同名的 workspace 节点。这些重名节点进入图后,后续的克隆、分区操作按名称查找就会出错。 --- ## 修改点 1:新增 NodeCloneMap 类型别名 **文件**: autofuse/inc/graph_metadef/graph/utils/graph_utils.h:59 cpp // 新增 using NodeCloneMap = std::unordered_map<const Node *, NodePtr>; **为什么改**:旧方案用 std::unordered_map<std::string, NodePtr> 按节点名做映射。unordered_map 的 key 唯一,重名节点后插入的会覆盖先插入的,导致映射中丢失节点。改用裸指针 const Node * 作 key,每个节点的内存地址天然唯一,不受名称冲突影响。 --- ## 修改点 2:新增基于指针的 RelinkGraphEdges 重载 **文件**: autofuse/graph_metadef/graph/utils/graph_utils.cc:2978-3048 + graph_utils.h:942-947 新增 3 个函数: - RelinkClonedDataEdges — 按指针映射重连数据边 - RelinkClonedControlEdges — 按指针映射重连控制边 - GraphUtils::RelinkGraphEdges(const NodePtr &node, const NodeCloneMap &node_clone_map) — 公开入口 **为什么改**:旧的 RelinkGraphEdges(graph_utils.cc:2984)通过 node->GetName() + suffix 在 map 中查找克隆后的新节点。重名场景下查找会命中错误的节点,导致边连到错误目标。新实现用 node_clone_map.find(node.get()) 直接按原始节点指针查找对应的克隆节点,精确无误。 同时**显式处理了控制边**(RelinkClonedControlEdges),旧实现在同一函数中也处理控制边,新实现拆分为独立函数,逻辑更清晰。 --- ## 修改点 3:DoCopyAscNodeAndRelink 改用指针映射 **文件**: autofuse/graph_metadef/graph/ascendc_ir/core/ascendc_ir.cc:640-653 cpp // 旧 std::unordered_map<std::string, NodePtr> all_new_nodes; all_new_nodes[dst_new_node->GetName()] = ...; GraphUtils::RelinkGraphEdges(src_node, "", all_new_nodes); // 新 NodeCloneMap node_clone_map; node_clone_map[src_node.get()] = ...; GraphUtils::RelinkGraphEdges(src_node, node_clone_map); **为什么改**:图克隆(CopyFrom)时,如果源图中有重名节点(如 Reduce 分区产生的同名 workspace),按名映射会让后插入的同名节点覆盖先前的,克隆后边的重连会连到错误节点。改用 src_node.get() 作 key,保证每个源节点都能映射到正确的克隆节点。 --- ## 修改点 4:PartitionByConnectivity 输出节点收集从 map 改为 vector+sort **文件**: autofuse/optimize/task_generator/schedule_group_partitioner.cpp:68-82 cpp // 旧 std::map<std::string, ::ascir::NodeView> name_to_output_nodes; // ... name_to_output_nodes.emplace(node->GetName(), node); for (const auto &name_and_node : name_to_output_nodes) { node_order.emplace_back(name_and_node.second); } // 新 std::vector<AscNodePtr> output_nodes; // ... output_nodes.emplace_back(node); node_order = std::move(output_nodes); std::sort(node_order.begin(), node_order.end(), CompareByNodeId); **为什么改**:两个原因: 1. **避免重名输出节点被去重丢失**:std::map<std::string, ...> 的 key 唯一,重名输出节点会被去重。丢失输出节点后,该节点所在的连通分量不会被遍历到,最终 visited.size() != num_nodes 检查失败(schedule_group_partitioner.cpp:102-109),图分区直接报错。改用 vector 保留所有输出节点。 2. **保证确定性排序**:直接用 vector 会导致遍历顺序不确定(取决于图中节点排列),违反编码红线规则 5(图改写结果必须确定)。因此用 CompareByNodeId(按 GetOpDesc()->GetId() 排序)保证确定性的遍历顺序。旧实现靠 std::map 的 key 排序(按名称字典序),现在名称不可靠,改用 OpDesc ID 排序。 --- ## 修改点 5:AddConnectedNodes 和 MergeGraphs 改用指针映射 **文件**: autofuse/optimize/task_generator/schedule_group_partitioner.cpp:155,268,271,312,316 cpp // 旧 std::unordered_map<std::string, af::NodePtr> all_new_nodes; all_new_nodes[dst_new_node->GetName()] = dst_new_node; GraphUtils::RelinkGraphEdges(src_node, "", all_new_nodes); // 新 af::NodeCloneMap node_clone_map; node_clone_map[asc_node.get()] = dst_new_node; GraphUtils::RelinkGraphEdges(src_node, node_clone_map); **为什么改**:与修改点 3 相同的原因。子图构建和图合并过程中,如果连通分量内有重名节点,按名映射会导致边重连错误。 --- ## 修改点 6:新增 DoCopyAscNodeOutputTensorAttr 函数 **文件**: autofuse/optimize/task_generator/reduce_schedule_case_generator.cpp:53-77 cpp // 旧调用(PartitionByNode 中) DoCopyAscNodeTensorAttr(src_node, load_node); // 复制 src_node 的所有输出 DoCopyAscNodeTensorAttr(src_node, store_node); // 新调用 DoCopyAscNodeOutputTensorAttr(src_node, load_node, out_anchor->GetIdx()); // 只复制指定输出 DoCopyAscNodeOutputTensorAttr(src_node, store_node, out_anchor->GetIdx()); **为什么改**:旧函数 DoCopyAscNodeTensorAttr(第 34-51 行)遍历 src_node->outputs() 的**所有输出**,逐个复制到 dst_node 的对应索引: cpp for (size_t i = 0U; i < src_node->outputs().size(); i++) { auto tensor_attr_group = op_desc->MutableOutputDesc(i)->GetOrCreateAttrsGroup<...>(); *tensor_attr_group = src_node->outputs[i].attr; } 但 load_node 和 store_node 是单输出节点(只有 1 个 output)。当 src_node(reduce 节点)有多个输出时,i 会超过 load_node/store_node 的输出数量,MutableOutputDesc(i) 越界访问。 新函数 DoCopyAscNodeOutputTensorAttr 只将 src_node 的第 src_output_index 个输出的属性复制到 dst_node 的第 0 个输出,避免越界: cpp const auto output_desc = op_desc->MutableOutputDesc(0U); // dst_node 的第 0 个输出 *tensor_attr_group = src_node->outputs[src_output_index].attr; // src_node 的指定输出 --- ## 修改点 7:3 处节点匹配从名称比较改为指针比较 **文件**: autofuse/optimize/task_generator/reduce_schedule_case_generator.cpp,3 个函数各 1 处 cpp // 旧(PartitionByNode:460, PartitionLoad:507, PartitionScalar:531) if (peer_in_anchor->GetOwnerNodeBarePtr()->GetName() == dst_node->GetName()) // 新 if (peer_in_anchor->GetOwnerNodeBarePtr() == dst_node.get()) **为什么改**:这 3 处逻辑是遍历 src_node 的下游节点,判断哪个 peer 是目标节点 dst_node,以执行 RemoveEdge(src->dst) + AddEdge(load->dst)。旧实现通过名称比较判断,当图中存在与 dst_node 同名的其他节点时,会误判为匹配,导致: - 删除了不该删的边 - 在错误的节点上添加新边 改用指针直接比较 == dst_node.get(),精确匹配目标节点对象本身,不受重名干扰。 --- ## 修改点 8:测试适配——从按索引断言改为按集合断言 **文件**: autofuse/tests/st/optimize/optimize_st.cpp + autofuse/tests/ut/optimize/test_optimizer.cpp ### 8a. ConcatFirstDim 测试适配 cpp // 旧:按索引断言 schedule_groups[0] 和 [1] 的 axis 名称 EXPECT_EQ(axis_names_0, expected_0); EXPECT_EQ(axis_names_1, expected_1); // 新:用 set<set<string>> 收集所有 group 的结果,不依赖顺序 std::set<std::set<std::string>> axis_name_groups; // ... 收集所有 group EXPECT_EQ(axis_name_groups, expected_axis_name_groups); **为什么改**:修改点 4 将输出节点排序从按名称字典序改为按 OpDesc ID。这导致 schedule_groups 的顺序可能变化(不再保证 schedule_groups[0] 对应某一组)。旧的硬编码索引断言不再可靠,改用集合比较,不依赖顺序。 ### 8b. EliminateSizeVar 测试适配 cpp // 旧:按索引逐个断言 schedule_groups[0..6] 的 SizeVar 数量 EXPECT_EQ(schedule_groups[0]...GetAllSizeVar().size(), 4UL); EXPECT_EQ(schedule_groups[1]...GetAllSizeVar().size(), 5UL); // ... 7 个 // 新:用 set<size_t> 收集所有数量,与预期集合比较 std::set<size_t> size_var_counts; // ... 收集 const std::set<size_t> expected_size_var_counts{4UL, 5UL, 6UL, 7UL, 8UL, 9UL, 10UL}; EXPECT_EQ(size_var_counts, expected_size_var_counts); **为什么改**:同上,group 顺序不再确定。 ### 8c. NodeCacheMarkerConcat 测试适配 cpp // 旧:按固定索引路径断言 EXPECT_EQ(schedule_results[1].schedule_groups[1].impl_graphs.size(), 3UL); const auto &impl6_brc0 = impl_graphs[2].FindNode("brc0"); // 新:遍历所有 schedule_result、group、impl_graph 查找目标节点 bool found_cached_brc0 = false; // ... 遍历查找 EXPECT_TRUE(found_cached_brc0); **为什么改**:同上,索引顺序不再确定,改为遍历查找。 --- ## 修改点 9:新增重名节点 UT **文件**: autofuse/tests/ut/optimize/task_generator/test_schedule_group_partitioner.cpp ### 9a. DuplicateWorkspaceNames_CopyAndPartitionKeepEdges 构造含两个 workspace 节点的图,手动将两个 workspace 重命名为同名 "workspace",然后: 1. copied_graph.CopyFrom(graph) — 验证克隆后 workspace 边正确(一个 workspace 有 Data 输入,另一个有 Load 输出) 2. PartitionByConnectivity(graph) — 验证分区后边仍正确 ### 9b. DuplicateWorkspaceNames_PartitionDoesNotDropComponents 构造两个独立连通分量(data0→workspace0, data1→workspace1),将两个 workspace 重命名为同名,验证分区后仍得到 2 个子图(不被去重为 1 个)。 **为什么新增**:直接复现重名节点场景,回归验证修复效果。符合编码红线通用规则 7(不做无关重构)和测试规范(Bug 修复必须有复现用例)。 --- ## 修改点总结 | # | 修改点 | 根因 | 修复方式 | |---|--------|------|---------| | 1 | 新增 NodeCloneMap | 名称映射重名覆盖 | 改用指针作 key | | 2 | 新增 RelinkGraphEdges 重载 | 按名查找克隆节点出错 | 按指针查找 | | 3 | DoCopyAscNodeAndRelink 改用指针 | 同 #1 | 同 #1 | | 4 | 输出节点收集 map→vector+sort | 重名输出节点被 map 去重 | vector 保留全部 + ID 排序 | | 5 | AddConnectedNodes/MergeGraphs 改用指针 | 同 #1 | 同 #1 | | 6 | 新增 DoCopyAscNodeOutputTensorAttr | 多输出节点属性复制到单输出节点越界 | 只复制指定输出索引 | | 7 | 3 处名称比较→指针比较 | 重名节点名称匹配误判 | 指针直接比较 | | 8 | 4 个测试适配 | group 顺序变化 | 改用集合断言 | | 9 | 新增 2 个重名节点 UT | 无复现用例 | 构造重名场景验证 | See merge request: cann/graph-autofusion!1544 | 2 个月前 | |
feat: 支持Gather后置Norm复合区域识别与融合调度(含SIMT side-input视图适配) Co-authored-by: JaydenChu<zhumin54@huawei.com> # message auto-generated for no-merge-commit merge: !2329 merge reapply/pr-2064-gather-norm into develop feat: 支持Gather后置Norm复合区域识别与融合调度(含SIMT side-input视图适配) Created-by: JaydenChu Commit-by: JaydenChu Merged-by: cann-robot Description: ## 描述 在 IndirectLoad 候选生成链路中支持 Gather 后置 Norm 复合区域(Softmax / LayerNorm 等多个 Reduce + Broadcast + Elementwise 组合)的识别、校验与调度接入,打通 Softmax 专用/通用双路径分流;同时适配 SIMT body 内行级广播 side-input 的坐标重建。 ### 问题场景 含 IndirectLoad 的图后接 Norm 类计算时,现有 Gather+Reduce 候选链存在四类问题: 1. **Gather+Softmax 候选被误杀**:SoftmaxApiCall::Generate 固定把最后一个向量化轴当作 R,且专用 Softmax 节点保持完整输入输出形状;普通 Reduce 的 stride 推导对它推不出归约轴,导致候选在布局校验阶段被淘汰。 2. **多 Reduce 图断言失败**:CollectOutputBoundaries 遇到第二个 Reduce 时触发图级断言,LayerNorm 均值/方差双分支形态直接编译失败。 3. **SIMT body 内行级广播 side-input 编译失败**:带 arange/matmul 的图,softmax 复合区域的行级广播 side-input Load(如 [8,2048,1]/strides=[2048,1,0],每行读一个向量沿尾轴广播)经调度期视图 split 改写后 rank 失配且尺寸符号化,坐标重建断言失败。 4. **IL 模板 merge 后 vectorized_axis 不一致**:tensor merge 只折叠 axis/repeats/strides 不处理 vectorized_axis,中间窗口公共检查打误导性 ERROR。 ### 问题原因 - 现有 RewrittenGraphAnalysis::post_reduce 为单 Reduce 假设,无法表达多统计 Reduce 区域 - Softmax Pattern 替换依赖 ReducePartitionCaseGenerator 的 AllLoad 流程,遇 IndirectLoad 提前返回 - SIMT body 是静态成员函数(无 tiling data 参数),坐标重建要求编译期常量,视图 split 符号化后兜底失效 - tensor merge 与 vectorized_axis remap 分两步执行,中间窗口视图自洽性缺失 ### 修改方案 **复合区域识别与调度**: 1. 新增 norm_utils:NormInfo/NormStage 元数据,基于节点 ExtAttr 随候选图复制传递 2. 抽取 softmax_pattern_fusion_utils:MatchStableStructure/MatchStableDedicated 拆分匹配 3. CollectOutputBoundaries 收集全部 Reduce,逐个校验同轴 Broadcast 配对 4. SIMD 逐 Reduce 独立校验(ValidateSimdCompositeLayouts);SIMT 串行多阶段 5. simt_boundary_sync:SIMT 边界视图 split 同步与 vectorized_axis 两级重映射 6. SIMD padded 视图强制 strided 降级(按视图 strides 逐行写,行内 pad 由 ReduceInit 清中性值) **SIMT side-input 视图适配**: 7. SimtLoadMetadata 增加行级广播标记:generator 在视图改写前按原始结构判定(尾轴 stride==0、其余轴 row-major 稠密递推——从后往前),写入节点 attr 穿透 VF 克隆 8. codegen 坐标重建兜底:rank mismatch 断言前按 output_index / 尾轴宽 去尾维寻址(读[行,列]值沿尾轴广播的正确语义) 9. IL 模板 tensor merge 后,vectorized_axis 中失效旧轴立即替换为 merged 轴(消除中间窗口不一致,RemapOutputVectorizedAxes 的 direct_ancestor 路径无缝衔接到 inner 轴) ### 修改效果 - Gather+Softmax(专用 API)、Gather+LayerNorm(多 Reduce 共享输入)、Gather+串行多阶段均进入正常调度链 - 行级广播 side-input(含带 arange/matmul 图)正确寻址 - SIMD padded 视图降级 strided,消除 index 越界读 - 全部失败路径候选级淘汰并记录日志(原为图级断言失败) - 原有单 Reduce、无 Reduce、SIMD 模板场景行为不变 - 未侵入通用 ScheduleTask 结构 ## 变更类型 - [x] ✨ New feature - [x] 🐛 Bug fix ## 关联的Issue 无 ## 如何测试 1. 已执行:codegen 全量 55/55、optimize_ut 734、optimize_st 213 全部通过 2. 已验证:行级广播兜底(标记/递推/寻址)各环节形态断言通过 3. 待执行:生产带 arange/matmul 图复测 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对功能进行了自测(全量回归+形态断言) - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了适当的类型标签(feat:) - [x] 我已仔细阅读贡献指南(CONTRIBUTING.md)并遵循所有规则 See merge request: cann/graph-autofusion!2329 | 1 个月前 | |
fix: 默认关闭Split模板打分 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1788 merge fix/split-score-env-switch into develop fix: 默认关闭Split模板打分 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 1. 主要解决的问题 - Split 多模板场景此前会生成 case 级打分函数,可能改变默认模板选择;本 PR 要求默认关闭 Split/Slice 的 tiling case 级打分,但保留 Split/Slice 模板和候选生成;不再通过环境变量重新开启打分。 ## 2. 修改方案 - SplitFusionCaseGenerator 保持原有模板和候选生成流程,并按模板数量对齐 score_functions;仅不再生成 Split score function,空字符串表示该 case 不参与 score。Slice 的非连续 Load 继续由既有 NDDMA score eligibility 跳过 score。删除相关生成封装和环境变量控制。 - IdentifyZeroStrideAxisIndices:输出 view 缺少当前调度轴时按该输出沿轴不变化处理,继续保留 stride 长度校验。 - IndirectLoad SIMT:完成 Broadcast 折叠后再次搬移 input-pre 单目链,确保 SIMT 输入边界仍为原始 GM Load。 - 本次提交不修改 NDDMA 建模公式或模板候选,仅保留既有对 Slice/Split 场景的 score eligibility 约束。 ## 3. 代码修改流程图 mermaid flowchart TD A[SplitFusionCaseGenerator 生成模板] --> B{多模板?} B -- 否 --> C[生成单模板] B -- 是 --> D[保持 score_functions 与模板数量对齐] D --> E[不生成 Split score,使用默认选择] F[IndirectLoad SIMT] --> G[折叠直连 Broadcast] G --> H[再次搬移 input-pre 单目链] H --> I[GM Load 作为 SIMT 输入边界] J[Zero-stride 轴分析] --> K{输出 view 是否包含调度轴?} K -- 否 --> L[按零 stride 处理] K -- 是 --> M[按输出 stride 分析] ## 4. 测试用例说明 ### 4.1 LLT测试 - Split UT:SplitScheduleCaseGeneratorTest.split_data_to_different_axis 直接断言两个模板均生成、score_functions 与模板数量对齐,且两个 score 字符串均为空;不再测试环境变量开关。 - 本地构建:cmake --build build --target optimize_ut -j 8,通过。 - 本地 IndirectLoad 广播 codegen ST: ctest --test-dir build/autofuse/tests --output-on-failure -R '^indirect_load_broadcast_.*_codegen_v2$' -j 1,15/15 通过。 - 本地 framework 复现用例: optimize_st --gtest_filter=OptimizerSt.ScalarBroadcastOptimization_Two_Scalar,通过。 - 提交前检查:pre-commit(clang-format、codespell、OAT 等)通过。 - 远端流水线:#1066483(SHA 44e6a5490644)compile、UT、ST 全部通过。 - 既有全量 optimize_ut 曾在非 Split 用例 TestOptimizer.ReOrderMergeAxisGraph_scheduler 启动处异常退出,Split 专项构建和测试不受影响。 ### 4.2 BBIT测试 | 指标 | 原始 | v1(小尾轴) | v2(尾轴对齐) | **v3(关闭打分)** | |---|---|---|---|---| | Pass数 | 38 | 40 | 54 | **102** | | 净增Pass | - | +2 | +16 | **+64** | | Fail→Pass | - | ~2 | ~46 | **71** | | Pass→Fail | - | ~0 | ~30 | **7** | | 迭代提升(vs orig) | - | 7 | 14 | **21** | | 迭代退化(vs orig) | - | 98 | 95 | **25** | | 迭代加速比中位数 | 0.961 | 1.060 | 1.087 | **0.992** | | 加速比<1用例数 | 113 | 59 | 43 | **72** | 叠加关闭打分后,有102个用例通过了: **v3 patch(关闭Split的ScheduleResult打分)效果显著:** ## 5. 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 6. 关联的 Issue - 暂无。 ## 7. 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 本次为内部行为调整,无需修改用户文档 - [x] 我在标题中使用了合适的类型标签(fix:) - [x] 我已经详细阅读并遵守 CONTRIBUTING.md ## 8. 其他信息 - Split/Slice 的模板和候选未关闭;仅关闭 tiling case 级 score,不支持通过环境变量重新开启 Split score。 - 未将 docs/design/slice_non_contiguous_performance.md 纳入 Git 跟踪。 See merge request: cann/graph-autofusion!1788 | 2 个月前 | |
【PR】: [feat] 修改transpose刷轴逻辑,确保transpose的基础模版和转nddma模版均保持全图一套轴. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1739 merge develop_transpose_one_set_axis into develop 【PR】: [feat] 修改transpose刷轴逻辑,确保transpose的基础模版和转nddma模版均保持全图一套轴. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 修改存在transpose节点的ascgraph的刷轴逻辑,主要修改两个场景: (1)对于transpose转nddma的模版,将nddma的sched.axis轴序改为和transpose后的轴序一致 (2)对于保留transpose节点的模版,遍历transpose节点所有的输入链路上的节点,依次将每个节点的sched.axis轴序刷成transpose后的轴序 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 构造包含transpose节点的图并且transpose能融合的场景,观察融合后的ascgraph里面是否为一套sched.axis轴(af后端会同时生成保留transpose和transpose转nddma的模版) ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1739 | 2 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 5 天前 | ||
| 3 个月前 | ||
| 1 天前 | ||
| 3 个月前 | ||
| 13 小时前 | ||
| 2 个月前 | ||
| 1 个月前 | ||
| 2 个月前 | ||
| 2 个月前 |