| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260) Co-authored-by: m0_56712298<wukeran@huawei.com> # message auto-generated for no-merge-commit merge: !1862 merge fix/issue-256-260-develop into develop fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260) Created-by: m0_56712298 Commit-by: m0_56712298 Merged-by: cann-robot Description: # Pull Request ## 描述 修复 v35 AscendC DataCopySimdSimt 在目的地址未按 32 字节对齐时的无符号长度回绕问题。 - padding 分支仅复制 min(length, padding_elements) 个实际元素。 - 当 length <= padding_elements 时完成实际元素复制后直接返回,避免无符号减法回绕。 - 新增边界行为单元测试,校验目标元素正确且缓冲区其余元素未被写入。 同时修复 Issue #258 中 BrcInline repeat stride 的 uint8_t 截断问题。 - repeat stride 超过 255 blocks 时回退到已有 counter 路径。 - 可表示范围内继续使用 repeat 快路径。 - 新增策略回归测试,验证两个外层位置均由 counter 路径处理。 同时修复 Issue #259 中 Cast repeat stride 的 uint8_t 截断问题。 - 先以 uint32_t 计算输入、输出 repeat stride,避免窄化后再判断。 - 任一 repeat stride 超过 255 blocks 时,按行调用已有普通 Cast 路径。 - 可表示范围内继续使用 repeat 快路径。 - 新增大输出 stride 回归测试,校验两行输出位置及 padding 区域未被额外写入。 同时修复 Issue #260 中 Concat tail mask 的 uint16_t 截断问题。 - 以 uint32_t 保存 32 位 tail mask,避免写入 mask word 前丢失高 16 位。 - 新增 GenMaskReg 高位保留回归测试,直接校验 8 个 uint32_t mask word。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue - 正式关联:#256 - 同一 PR 修复:https://gitcode.com/cann/graph-autofusion/issues/258 - 同一 PR 修复:https://gitcode.com/cann/graph-autofusion/issues/259 - 同一 PR 修复:https://gitcode.com/cann/graph-autofusion/issues/260 GitCode 每个 PR 仅允许正式关联一个 Issue,因此保留原 #256 的正式关联,并在此记录 #258、#259、#260。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. cmake --build build --target test_ascendc_api_v35 -j 8:通过。 2. test_ascendc_api_v35 --gtest_filter=TestApiGather.DataCopySimdSimtSmallLengthWithinPadding --gtest_brief=1:1/1 通过。 3. test_ascendc_api_v35 --gtest_brief=1:352/352 通过。 4. bash scripts/oat_check.sh:#256 的三个变更文件检查通过。 5. test_ascendc_api --gtest_filter=TestApiBroInline.*:15/15 通过。 6. bash scripts/oat_check.sh autofuse/ascendc/api/brc_inline_api.h autofuse/tests/ut/ascendc/api/test_brc_inline_api.cpp:#258 的两个变更文件检查通过。 7. test_ascendc_api --gtest_filter=TestApiCast.LargeDstRepeatStrideFallsBackToLoop:1/1 通过。 8. test_ascendc_api --gtest_filter='*Cast*':43/43 通过。 9. test_ascendc_api:456/456 通过。 10. bash scripts/oat_check.sh autofuse/ascendc/api/cast.h autofuse/tests/ut/ascendc/api/test_cast.cpp:#259 的两个变更文件检查通过。 11. cmake --build build --target test_ascendc_api_v35 -j 8:#260 增量编译通过。 12. test_ascendc_api_v35 --gtest_filter='RegbaseApiConcatTest.*':2/2 通过。 13. bash scripts/oat_check.sh autofuse/v35/ascendc/api_regbase/concat.h autofuse/tests/v35/ut/ascendc/api_regbase/test_concat.cpp:#260 的两个变更文件检查通过。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档(本次修复不涉及文档变更) - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本次 PR 包含 #256、#258、#259 和 #260 四个独立 fix: commit,不涉及 API/ABI、图改写、构建交付或运行时接口变更。 See merge request: cann/graph-autofusion!1862 | 6 天前 | |
【PR】: [feat] 添加图级别的sched信息,并新增对应的python/序列化/dump接口. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1790 merge develop_transpose_one_set_axis into develop 【PR】: [feat] 添加图级别的sched信息,并新增对应的python/序列化/dump接口. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 给ascgraph新增图级schedInfo,同时提供对外的getter/setter接口,为后续将node级schedInfo收编成图级schedInfo做铺垫。 当前新增图级接口之后,在schedule的入口处先将图级的schedInfo下发给node级schedInfo,保持内部逻辑先不动,等后续node级schedInfo全部收编完成后再一把切换。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. inductor+af流程,前端保持老流程不动,所有inductor+af用例和网络均不受影响,验证兼容性 2. inductor+af流程,前端将设置node级sched.axis接口改为直接设置图级sched.axis接口,所有inductor+af用例和网络仍不受影响,验证新接口无问题 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1790 | 6 天前 | |
【fix】: 修复FusedBackend场景的一些问题 Co-authored-by: 李玥玮<liyuewei1@huawei.com> # message auto-generated for no-merge-commit merge: !1834 merge 0_local into develop 【fix】: 修复FusedBackend场景的一些问题 Created-by: liyuewei Commit-by: 李玥玮 Merged-by: cann-robot Description: # Pull Request ## 描述 1、ATT没有过滤workspace节点同时是整图output节点的情况,导致编译错误。这种情况复用output的GM即可,不必另外申请workspace。 2、ATT生成tiling代码时没有考虑多AscBackend节点的情况,导致编译错误。这种情况tiling_data结构体是多级的,不能默认在最外层结构体调用成员变量。 3、把tiling_data中的workspace_size改为workspace_offset语义,kernel代码里就不需要累加了,也不会生成多余的GlobalTensor。 4、workspace连接两张子图,通过两张子图的切分情况都可以计算出workspace大小,但是ATT没有取最大值,应该修改为取max作为结果。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: NA ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1834 | 6 天前 | |
feat: 修改autofuse_headers Co-authored-by: 叶龙剑<yelongjian1@huawei.com> # message auto-generated for no-merge-commit merge: !668 merge dev-headers0605 into develop feat: 修改autofuse_headers Created-by: yelongjian Commit-by: 叶龙剑 Merged-by: cann-robot Description: # Pull Request ## 描述 修改autofuse_headers ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.NA ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!668 | 3 个月前 | |
【fix】: 修复FusedBackend场景的一些问题 Co-authored-by: 李玥玮<liyuewei1@huawei.com> # message auto-generated for no-merge-commit merge: !1834 merge 0_local into develop 【fix】: 修复FusedBackend场景的一些问题 Created-by: liyuewei Commit-by: 李玥玮 Merged-by: cann-robot Description: # Pull Request ## 描述 1、ATT没有过滤workspace节点同时是整图output节点的情况,导致编译错误。这种情况复用output的GM即可,不必另外申请workspace。 2、ATT生成tiling代码时没有考虑多AscBackend节点的情况,导致编译错误。这种情况tiling_data结构体是多级的,不能默认在最外层结构体调用成员变量。 3、把tiling_data中的workspace_size改为workspace_offset语义,kernel代码里就不需要累加了,也不会生成多余的GlobalTensor。 4、workspace连接两张子图,通过两张子图的切分情况都可以计算出workspace大小,但是ATT没有取最大值,应该修改为取max作为结果。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: NA ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1834 | 6 天前 | |
【fix】: 修复FusedBackend场景的一些问题 Co-authored-by: 李玥玮<liyuewei1@huawei.com> # message auto-generated for no-merge-commit merge: !1834 merge 0_local into develop 【fix】: 修复FusedBackend场景的一些问题 Created-by: liyuewei Commit-by: 李玥玮 Merged-by: cann-robot Description: # Pull Request ## 描述 1、ATT没有过滤workspace节点同时是整图output节点的情况,导致编译错误。这种情况复用output的GM即可,不必另外申请workspace。 2、ATT生成tiling代码时没有考虑多AscBackend节点的情况,导致编译错误。这种情况tiling_data结构体是多级的,不能默认在最外层结构体调用成员变量。 3、把tiling_data中的workspace_size改为workspace_offset语义,kernel代码里就不需要累加了,也不会生成多余的GlobalTensor。 4、workspace连接两张子图,通过两张子图的切分情况都可以计算出workspace大小,但是ATT没有取最大值,应该修改为取max作为结果。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: NA ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1834 | 6 天前 | |
【PR】: [feat] 添加图级别的sched信息,并新增对应的python/序列化/dump接口. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1790 merge develop_transpose_one_set_axis into develop 【PR】: [feat] 添加图级别的sched信息,并新增对应的python/序列化/dump接口. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 给ascgraph新增图级schedInfo,同时提供对外的getter/setter接口,为后续将node级schedInfo收编成图级schedInfo做铺垫。 当前新增图级接口之后,在schedule的入口处先将图级的schedInfo下发给node级schedInfo,保持内部逻辑先不动,等后续node级schedInfo全部收编完成后再一把切换。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. inductor+af流程,前端保持老流程不动,所有inductor+af用例和网络均不受影响,验证兼容性 2. inductor+af流程,前端将设置node级sched.axis接口改为直接设置图级sched.axis接口,所有inductor+af用例和网络仍不受影响,验证新接口无问题 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1790 | 6 天前 | |
【PR】: 补齐tensorflow相关的autofuse融合样例 Co-authored-by: @gcw_Xt6hqG9y<1634807286@qq.com> # message auto-generated for no-merge-commit merge: !1765 merge add_tensorflow_example into develop 【PR】: 补齐tensorflow相关的autofuse融合样例 Created-by: gcw_Xt6hqG9y Commit-by: @gcw_Xt6hqG9y Merged-by: cann-robot Description: # Pull Request ## 描述 补齐tensorflow相关的autofuse融合样例。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.根据example/tensorflow目录下对应用例文档执行用例并观察结果 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1765 | 20 天前 | |
【PR】: [feat] 添加图级别的sched信息,并新增对应的python/序列化/dump接口. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1790 merge develop_transpose_one_set_axis into develop 【PR】: [feat] 添加图级别的sched信息,并新增对应的python/序列化/dump接口. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 给ascgraph新增图级schedInfo,同时提供对外的getter/setter接口,为后续将node级schedInfo收编成图级schedInfo做铺垫。 当前新增图级接口之后,在schedule的入口处先将图级的schedInfo下发给node级schedInfo,保持内部逻辑先不动,等后续node级schedInfo全部收编完成后再一把切换。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. inductor+af流程,前端保持老流程不动,所有inductor+af用例和网络均不受影响,验证兼容性 2. inductor+af流程,前端将设置node级sched.axis接口改为直接设置图级sched.axis接口,所有inductor+af用例和网络仍不受影响,验证新接口无问题 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1790 | 6 天前 | |
【PR】: [fix] 修改仓内同名头文件ge_error_codes_af.h. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1931 merge develop_fix_headers into develop 【PR】: [fix] 修改仓内同名头文件ge_error_codes_af.h. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 修改仓内同名头文件ge_error_codes_af.h。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 属于代码重构,ci流水线和rdv pass即可 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1931 | 6 天前 | |
【PR】: fix reduce layer norm Co-authored-by: chengzhiwei<chengzhiwei5@huawei.com> # message auto-generated for no-merge-commit merge: !1891 merge develop into develop 【PR】: fix reduce layer norm Created-by: czways Commit-by: chengzhiwei Merged-by: cann-robot Description: # Pull Request Inductor LayerNorm 双链多引用断图方向不一致导致 SortSubGraphsByDependency 依赖环编译失败 ## 描述 请清晰准确地描述本次 Pull Request 的意图和变更内容。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> Closes #293 ## 如何测试 描述测试此变更的步骤和前提条件: 1. 2. ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 # PR #1891 修改说明:fix reduce layer norm > PR 链接:<https://gitcode.com/cann/graph-autofusion/pull/1891> > 关联 Issue:<https://gitcode.com/cann/graph-autofusion/issues/293>(Closes #293) > 分支:czways/develop → cann/graph-autofusion@develop > 当前版本:head f0329e47(2026-09-01 更新,**已移除 tiling 相关修改**,ATT GetCacheReuseInfo 修复由他人另行交付) > 变更规模:3 个文件,+209 / -16 > 完整根因推演与复盘:见 autofuse/bugshot/tmp/root_cause_derivation.md --- ## 1. 问题现象 Inductor 场景执行 LayerNorm 融合用例 tc_af_inductor_layernorm_backend_0193(输入 shape=(128,6,23),模型为两条 LayerNorm 路径 + 三路输出:sum(layernorm(x.transpose(0,1)))、mean(layernorm(x))、abs(layernorm(x)))时,Autofuse Optimize 阶段在 SortSubGraphsByDependency 报 sorted[4] != total[7],拓扑排序卡死,整体编译以 Optimize fail ret 1343225857 中断。 7 个子图中只排出 4 个,子图 1 与子图 3 互相等待——本 PR 修复该依赖环的根因。 > 历史备注:根因修复后曾暴露下游 ATT tiling cache 的 GroupLevelCache body/tail 编译失败(f8cf01e 休眠缺陷)。该二级问题**不在本 PR 修复范围内**,已由他人另行修复交付;本 PR 现只包含 Optimize 断图根因修复。 ## 2. 根因分析 ### 2.1 图结构前提 Inductor 将整个模型融合为单张 HintGraph,含两条几乎镜像的 LayerNorm 计算链(A 链 = transpose 后 LN,B 链 = 原始输入 LN),两链之间无直接数据边,但共享同一批输入节点:broadcast2(÷23 常量)、broadcast8(beta 权重)、broadcast9(gamma 权重)、scalar1(eps)。 ### 2.2 断图机制 GenerateGeneralCase 依次执行三个断图 pass(ReducePartitionPostFusion → PartitionNorm → ReducePartitionMultipleCitations)。断开一条边的标准产物是 4 个新节点: producer → Store → Ws_pre ~~(同名,之间无边)~~ Ws_post → Load → consumer 写侧句柄与读侧句柄是**两个不同节点、同一个名字**,运行时靠同名配对传递内存。**剪哪条边就是在决定"谁供谁"**——pre 落在生产侧子图,post 落在消费侧子图,形成一条"生产方必须先执行"的跨子图依赖。 ### 2.3 故障机制:断图方向不一致制造真实依赖环 ReducePartitionMultipleCitations(修复前)对每个多输出共享节点独立决策:"保留第一个遍历到的 consumer 方向,断开其余"。由于各节点 consumer 遍历顺序不同,方向互相矛盾: | 共享节点 | 保留的 consumer | 剪断侧 | 产生的跨链依赖 | |---|---|---|---| | broadcast2(÷23) | A 链 truediv | B 链 truediv1 | A 供 B(子图1→子图3) | | broadcast8(beta) | B 链 mul3 | A 链 mul5 | B 供 A(子图3→子图1) | | broadcast9(gamma) | B 链 add2 | A 链 add3 | B 供 A(子图3→子图1) | 子图依赖图: 0 ──→ 4 ──→ 1 ⇄ 3 ──→ 6 ← 1⇄3 双向依赖即环 2 ──→ 5 ──↗ 原图是无环 DAG;环完全由断图方向不一致制造,且每条依赖边都对应真实 workspace 数据流(非名称匹配假依赖),无法在排序层补救。 ### 2.4 已证伪的备选方案(避免重走弯路) | 方案 | 结论 | |---|---| | 修改 Workspace 节点名消除同名 | 证伪:同名是 buffer 复用的有意设计,改名破坏 allocator 映射 | | 忽略 Workspace 依赖 / 在 HasDataDependency 加特判 | 证伪:本 case 依赖边全部真实,特判可致 consumer 先于 producer 执行 | | SCC 缩点合并环上子图 | 回退:可让排序通过,但改变子图融合粒度、跳过 R-core 模板,治标不治本 | | 仅把 GetOutNodes() 换成 GetOutDataNodes() | 证伪:断图后 synthetic Load 节点(如 mean_Load)确实拥有多个数据输出,API 切换挡不住,必须按节点类型过滤 | | 每节点独立取最小 Reduce ID | 证伪:局部最优不等于全局一致,各节点方向仍可互相打架 | ## 3. 修复思路与实现 ### 3.1 共享引用链统一 anchor(断图方向全局裁决) ReducePartitionMultipleCitations(reduce_schedule_case_generator.cpp/.h)重写为两阶段,并拆分为三个职责单一的函数: ReducePartitionMultipleCitations 主流程(单 Reduce 早退) ├─ CollectCitationGroups 阶段一:图改写前收集 citation ├─ BuildCitationGroupAnchors 阶段二 a:Union-Find 合并 + 选 anchor └─ PartitionCitationGroups 阶段二 b:统一方向断图 + 去重 **阶段一:收集 citation**(先于任何本 pass 内的断边,避免被自己改写过的图污染) 1. 多输出起点过滤:!IsLoad && !IsStore && !IsOps<Workspace> && GetOutDataNodes().size() > 1——显式排除 synthetic 节点(断图产物 Store/Load/Ws 虽确实有多个数据输出,但不是用户图的真实共享节点); 2. FindOutputReduce **仅沿数据边**(GetOutNodes() → GetOutDataNodes())递归探测每个输出最终流到的 Reduce,形成 citation 三元组 (source, citation, reduce);不处理控制边是正确选择——下游依赖矩阵(HasDataDependency)本身只按数据边推导,方向决策必须与被保护的约束同构; 3. citation 按 (reduce ID, citation ID) 升序排序——保证后续决策确定,不依赖容器遍历顺序(对应编码红线"图改写结果必须确定")。 **阶段二 a:共享链合并与 anchor 选取** 1. Union-Find:任意两个 citation 组若共享同一 Reduce,合并为同一条共享引用链。本图 7 个共享节点(scalar1、b2、b8、b9、rsqrt、rsqrt1、add3)因都同时流到 sum2/sum3 被合并成一条链; 2. 每链取**最小 Reduce ID** 为唯一 anchor(本图 sum2=41 < sum3=51 → anchor=sum2)。取最小 ID 非性能偏好,是要一个**确定、可复现**的裁决规则。 **阶段二 b:统一方向断图** - 规则全链唯一:citation.reduce == anchor 的路径**保留原始数据边**;其余路径统一调用 PartitionByNode 断开。所有断边方向一致把非 anchor 侧(sum3 侧)隔离为纯消费侧,依赖图在构造上不可能成环; - **(source, reduce) 对去重**:PartitionByNode(src, dst) 只剪断 src→dst 单边(实现含 peer == dst_node 守卫,不改道 src 其余出边)。修复前的旧实现通过 reduce_nodes 集合隐式按 (source, reduce) 去重——首个 Reduce 方向保留直连,每个新出现的 Reduce 只切一次;按 (source, citation) 边去重会切掉同一 source 流向同一非 anchor Reduce 的全部 citation 边,切分边集合较旧实现扩大、属行为变更,故对齐旧语义(每个非 anchor Reduce 只切一条 citation 边,其余保持直连,行为保守且不引入额外跨分量依赖)。 ### 3.2 与旧实现的行为对比 | 维度 | 旧实现 | 新实现 | |---|---|---| | 多输出起点判定 | GetOutNodes().size() > 1(含控制边、含 synthetic 节点) | 仅数据边出度 > 1,排除 Load/Store/Workspace | | 下游 Reduce 探测 | 沿控制边也可达 | 仅沿数据边 | | 断边方向 | 每节点独立,由遍历顺序决定(未定义,可成环) | 共享链合并 + 最小 Reduce ID anchor 全局裁决(构造性无环) | | 去重语义 | (source, reduce) 隐式去重 | (source, reduce) 显式去重(对齐) | | 断边原语 | PartitionByNode 族 | **未改**(Workspace 命名/buffer 复用/codegen ABI 保持) | ### 3.3 真实图验证(2026-08-31 bugshot 回归) 修复后 [TEMP_REDUCE] 插桩日志(验证时临时添加,PR 已清理)逐条确认: - 9 个多输出节点中**无任何 Load/Store/Workspace** 起点——synthetic 过滤生效; - 7 个 citation 组 Union-Find 合并为一条链,anchor 统一为 sum2(41); - 全部 6 条断边(b2→truediv、b9→add3、b8→mul5、rsqrt→broadcast11、add3→sum3、scalar1→add)**方向一致**断向 sum3 侧——对照修复前 b2→truediv1 断向 sum2 侧的方向反转,反向依赖对消除; - 原始 1 ⇄ 3 环消失,SortSubGraphsByDependency 通过。 ## 4. 变更文件清单 | 文件 | 变更 | |---|---| | autofuse/optimize/task_generator/reduce_schedule_case_generator.cpp | ReducePartitionMultipleCitations 重写(拆分三函数);FindOutputReduce 数据边化;新增 <map>/<numeric>/<set> 头 | | autofuse/optimize/task_generator/reduce_schedule_case_generator.h | 新增 Citation/CitationGroups 类型与三个函数声明(均在 private: 段,无 ABI 影响) | | autofuse/tests/ut/optimize/task_generator/test_reduce_schedule_case_generator.cpp | 新增 2 条 UT(见下) | > 注:本 PR 早期版本曾包含 ATT GetCacheReuseInfo 统一过滤(tiling_code_generator.cpp + att_generator_unittest.cpp 2 条 UT),因该问题已由他人修复,为避免重复交付已移除(2026-09-01,head 70cc7e5d → f0329e47)。 ## 5. 测试设计 | 用例 | 覆盖点 | |---|---| | TestReduce_Multi_Cita_Multi_Out_NoDependencyCycle | 双 Reduce 交叉引用链(shared0/shared1 两级多输出、sum1/sum0 双 Reduce)——真正进入新算法路径(单 Reduce 图在 IsOnlyHasOneOrLessReduce 早退);断言调度成功 + kCommon 模板 + 两组 workspace 断点对恰各一对 | | TestReduce_Multi_Cita_SameReduce_NoDuplicatePartition | 同一 source 多条 citation 流向同一 Reduce 的场景,断言 workspace 断点对数量符合预期。**注**:按图构造 sum0 先创建(ID 更小)→ anchor=sum0,实际仅切 branch2(sum1 侧唯一 citation)一条边,(source, reduce) 与 (source, citation) 两种去重键结果相同——去重路径本身未被该用例区分,属残留覆盖缺口;建议补"非 anchor 侧 ≥2 条 citation"构造 | **已执行的验证**: | 验证项 | 结果 | |---|---| | optimize UT(ReduceScheduleCaseGeneratorTest 全套含新增 2 条) | ✅ 通过 | | optimize ST(多 citation 多输出归一化拓扑强化用例) | ✅ 通过 | | 真实 bugshot:Optimize 拓扑排序(原故障点) | ✅ 通过(0831 回归,环消除) | | 真实 bugshot:host C++ 编译(asc_tiling.py) | ⏳ 依赖 ATT 侧修复(他人交付)验证 | | 真实 bugshot:设备端三路输出数值精度 | ⏳ 待执行 | ## 6. 性能影响 - 编译期:一次 citation 收集 + O(组数²×组内 citation) 的共享 Reduce 探测(组数与本图规模为个位数)+ 集合判重,均为编译期常数开销;FindOutputReduce 无 memo,重汇聚宽图存在重复子遍历(可观测但非运行时问题) - 运行时:零新增分支;断边原语未改,生成的 kernel 代码结构不变 - 运行时性能变化点:切分方向确定化会改变部分存量图(多输出节点流向多 Reduce 的形态)的分图结构,融合粒度/性能特征可能与历史版本不同(方向为切分面收窄、更保守)——**非 LayerNorm 场景的性能基线对比是合入前建议项** ## 7. 遗留与后续 1. ATT GetCacheReuseInfo 修复由他人交付后,在真实 bugshot 环境联合重跑:确认 asc_tiling.py host C++ 编译通过 → 设备端三路输出精度校验通过(E2E 闭环); 2. E2E 全绿后关闭 Issue #293 并归档 bugshot 分析文档; 3. 测试覆盖补强:新增"同一 source ≥2 条 citation 流向同一非 anchor Reduce"用例,真正触达 (source, reduce) 去重与并查集合并路径; 4. (可选)FindOutputReduce 增加节点级 memo(node → 首个可达 reduce)与 visited 保护:重汇聚图上避免重复子遍历,总复杂度降为 O(V+E),同时消除理论上的递归栈溢出风险(阶段一无图改写,memo 安全); 5. (既有问题,非本 PR 引入,建议另立 issue)PartitionByNode 对多输出口 source 会为每个 out_anchor 建 Store/Ws 写链——dst 未连接的端口产生无读者的悬空写链;本 PR 场景 source 均单口未触发。 See merge request: cann/graph-autofusion!1891 | 6 天前 | |
【PR】:[feat] [autofuse] Migrate autofuse from ge to graph-autofusion. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !301 merge master_af into master 【PR】:[feat] [autofuse] Migrate autofuse from ge to graph-autofusion. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 从 ge 仓解耦autofuse组件,从ge仓的compiler/graph/optimize/autofuse目录迁移至本仓autofuse目录,未来在本仓独立发包和演进,ge 仓的集成方式不变。 迁移内容主要包括自动融合范围识别、自动算子代码生成、Auto Tiling优化、动态shape及混合精度等特性。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.上板验证inductor+af单片段流程pass 2.上板验证inductor+af整网流程pass ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!301 | 4 个月前 | |
fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260) Co-authored-by: m0_56712298<wukeran@huawei.com> # message auto-generated for no-merge-commit merge: !1862 merge fix/issue-256-260-develop into develop fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260) Created-by: m0_56712298 Commit-by: m0_56712298 Merged-by: cann-robot Description: # Pull Request ## 描述 修复 v35 AscendC DataCopySimdSimt 在目的地址未按 32 字节对齐时的无符号长度回绕问题。 - padding 分支仅复制 min(length, padding_elements) 个实际元素。 - 当 length <= padding_elements 时完成实际元素复制后直接返回,避免无符号减法回绕。 - 新增边界行为单元测试,校验目标元素正确且缓冲区其余元素未被写入。 同时修复 Issue #258 中 BrcInline repeat stride 的 uint8_t 截断问题。 - repeat stride 超过 255 blocks 时回退到已有 counter 路径。 - 可表示范围内继续使用 repeat 快路径。 - 新增策略回归测试,验证两个外层位置均由 counter 路径处理。 同时修复 Issue #259 中 Cast repeat stride 的 uint8_t 截断问题。 - 先以 uint32_t 计算输入、输出 repeat stride,避免窄化后再判断。 - 任一 repeat stride 超过 255 blocks 时,按行调用已有普通 Cast 路径。 - 可表示范围内继续使用 repeat 快路径。 - 新增大输出 stride 回归测试,校验两行输出位置及 padding 区域未被额外写入。 同时修复 Issue #260 中 Concat tail mask 的 uint16_t 截断问题。 - 以 uint32_t 保存 32 位 tail mask,避免写入 mask word 前丢失高 16 位。 - 新增 GenMaskReg 高位保留回归测试,直接校验 8 个 uint32_t mask word。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue - 正式关联:#256 - 同一 PR 修复:https://gitcode.com/cann/graph-autofusion/issues/258 - 同一 PR 修复:https://gitcode.com/cann/graph-autofusion/issues/259 - 同一 PR 修复:https://gitcode.com/cann/graph-autofusion/issues/260 GitCode 每个 PR 仅允许正式关联一个 Issue,因此保留原 #256 的正式关联,并在此记录 #258、#259、#260。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. cmake --build build --target test_ascendc_api_v35 -j 8:通过。 2. test_ascendc_api_v35 --gtest_filter=TestApiGather.DataCopySimdSimtSmallLengthWithinPadding --gtest_brief=1:1/1 通过。 3. test_ascendc_api_v35 --gtest_brief=1:352/352 通过。 4. bash scripts/oat_check.sh:#256 的三个变更文件检查通过。 5. test_ascendc_api --gtest_filter=TestApiBroInline.*:15/15 通过。 6. bash scripts/oat_check.sh autofuse/ascendc/api/brc_inline_api.h autofuse/tests/ut/ascendc/api/test_brc_inline_api.cpp:#258 的两个变更文件检查通过。 7. test_ascendc_api --gtest_filter=TestApiCast.LargeDstRepeatStrideFallsBackToLoop:1/1 通过。 8. test_ascendc_api --gtest_filter='*Cast*':43/43 通过。 9. test_ascendc_api:456/456 通过。 10. bash scripts/oat_check.sh autofuse/ascendc/api/cast.h autofuse/tests/ut/ascendc/api/test_cast.cpp:#259 的两个变更文件检查通过。 11. cmake --build build --target test_ascendc_api_v35 -j 8:#260 增量编译通过。 12. test_ascendc_api_v35 --gtest_filter='RegbaseApiConcatTest.*':2/2 通过。 13. bash scripts/oat_check.sh autofuse/v35/ascendc/api_regbase/concat.h autofuse/tests/v35/ut/ascendc/api_regbase/test_concat.cpp:#260 的两个变更文件检查通过。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档(本次修复不涉及文档变更) - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本次 PR 包含 #256、#258、#259 和 #260 四个独立 fix: commit,不涉及 API/ABI、图改写、构建交付或运行时接口变更。 See merge request: cann/graph-autofusion!1862 | 6 天前 | |
feat: 支持ATT analysis tool Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1855 merge att-analysis-pr-vendor into develop feat: 支持ATT analysis tool Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 1. 主要解决的问题 ATT 模板和 tiling 的问题定位通常需要对比默认 Autofuse、开启 PGO、强制模板等场景,再结合 [PROF]/[DFX] 日志、profiling、kernel meta 和 dump 图判断差异原因。原有分析工具位于外部目录,使用时依赖固定文件名和目录结构,难以直接分析用户执行 PyTorch/Inductor 或 TensorFlow 脚本后产生的实际产物。 ## 2. 修改方案 - 在 autofuse/tools/att_analyze/src/att.py 提供统一 CLI 入口。 - 兼容日志文件、日志目录和递归产物目录,不假设用户一定使用仓内 sample 脚本。 - summary、compare、split-slog、perf-formula、verify-tiling、evidence 六个工具分别负责汇总、对比、拆分、公式分析、ABI 验证和证据导出。 - verify-tiling 支持 TensorFlow/Inductor ABI;preset_B.json 的 aiv_num 默认改为 56,并支持 --aiv-num 覆盖。执行前打印实际核数、来源、UB 大小和动态维度,方便用户核对硬件配置。 - output_code.py 只提取字面量 artifact,不执行用户 Python 文件;Inductor PGO 的分段 host 源码可被拆分后参与验证。 - 日志缺失时保留 parse_status,不把缺失值当作有效 0;evidence JSONL 包含来源路径和行号,便于后续 skill 或人工复核。 - 删除重复的 NOTICE、readme.md 和 docs/CSV_COMPARISON.md,工具目录的职责统一由 autofuse/tools/README.md 和 ATT README 说明;新增/整理的工具文件使用 2026 License。 ## 3. 代码目录结构 text autofuse/tools/att_analyze/ ├── src/att.py # 统一命令行入口 ├── src/commands/ │ ├── summary.py # ATT 日志汇总 │ ├── compare.py # 两次结果对比 │ ├── evidence.py # 机器可读证据导出 │ ├── split_slog.py # DFX/PROF 日志拆分 │ ├── perf_formula.py # pipe 公式和 SVG 分析 │ └── verify_tiling.py # TF/Inductor tiling ABI 验证 ├── src/core/ │ ├── log_parser.py # 日志解析和状态标记 │ ├── evidence_schema.py # evidence 记录结构 │ ├── file_utils.py # 输入发现和输出目录处理 │ └── tiling_func_reader.py # tiling 源码读取 ├── examples/examples.py # Python API 和 CLI 命令示例 ├── tests/{unit,functional,integration}/# 回归测试 ├── tests/data/ # 脱敏固定日志 fixture ├── README.md / README_en.md # 使用说明 └── .gitignore # 工具临时输出忽略规则 ## 4. 工具职责、使用方法和效果 | 工具 | 职责与输入 | 示例命令 | 实际效果 | | --- | --- | --- | --- | | summary | 从 ATT [PROF] 日志或目录提取算子、模板、graph/result/group/case、tiling 和性能字段 | python3 autofuse/tools/att_analyze/src/att.py summary run.log -f csv -o summary.csv | 输出 console/CSV/Excel 汇总;不完整记录带 parse_status | | compare | 对比默认、PGO、强制模板或其他候选的两个 summary CSV | python3 autofuse/tools/att_analyze/src/att.py compare default.csv candidate.csv -f text -o compare.txt | 按 Operator/Graph/Result/Group/Case 匹配,显示模板、case、tiling 和性能差异 | | evidence | 将日志转换为机器可读证据 | python3 autofuse/tools/att_analyze/src/att.py evidence run.log -o evidence/ | 生成 att-evidence.jsonl 和 manifest,记录来源路径、行号和解析状态 | | split-slog | 按算子及 graph/result/group/case 拆分 DFX 编译日志和 PROF 运行日志 | python3 autofuse/tools/att_analyze/src/att.py split-slog slog/ --op FlashAttentionScore -o split/ | 生成 compiler/、runtime/ 下的 case 日志,便于逐 case 定位 | | perf-formula | 解析 tiling 源码和 [PERF] pipe 公式 | python3 autofuse/tools/att_analyze/src/att.py perf-formula generated/ run.log --case r=0,g=0,c=1 -o perf/ | 生成 perf_formula.svg,标出最大 pipe 和跨 case 敏感参数;缺少 [PERF] 时明确提示证据不足 | | verify-tiling | 编译并执行用户提供的 TF/Inductor tiling 函数 | python3 autofuse/tools/att_analyze/src/att.py verify-tiling generated/ --scene tf --preset B --aiv-num 56 -o verify/ | 控制台打印有效配置和编译/执行结果,verify/result.json 保存 block_dim、workspace 或失败原因 | examples/examples.py 的第一个示例只打印以上 CLI 命令,不会自动编译、profiling 或执行 tiling 验证;其余示例展示 Python API 调用。 ## 5. 代码修改流程图 mermaid flowchart LR A[用户执行默认/PGO/强制模板场景] --> B[日志、profiling、kernel_meta、dump] B --> C{att CLI} C --> D[summary 汇总] D --> E[compare 对比选择和性能] B --> F[split-slog 拆分 DFX/PROF] B --> G[evidence 导出来源证据] B --> H[perf-formula 生成 pipe SVG] B --> I[verify-tiling 编译并执行 ABI] E --> J[报告模板/tiling 差异] F --> J G --> J H --> J I --> J 采集 [PROF]/[DFX] 时,用户通常需要在自己的执行命令中设置 ASCEND_SLOG_PRINT_TO_STDOUT=1 和 ASCEND_GLOBAL_LOG_LEVEL=1。本工具默认只读已有产物,不猜测 case,也不代替用户重新运行模型。 ## 6. 测试用例说明 | 检查项 | 结果 | | --- | --- | | ATT unit/integration/functional tests | 94 passed | | git diff --check | 通过 | | ruff、ruff-format、codespell | 通过 | | pre-commit(含 OAT、冲突标记、禁止 docs/superpowers) | 通过 | | CLI 合约测试 | 覆盖六个子命令和 CLI 示例顺序 | 固定 tests/data/ 仅用于回归;真实 CANN、TensorFlow 或 Inductor 日志格式变化时,应脱敏新增 fixture 并同步期望结果,不覆盖旧样例。上述测试验证工具解析和产物生成能力,不代表任何模型的性能或精度结论。 ## 7. 核对清单 - [x] 工具源码、测试和文档均在当前仓维护 - [x] 六个工具均有职责、输入、命令和效果说明 - [x] verify-tiling 打印有效 aiv_num 并支持命令行覆盖 - [x] 日志证据缺失时显式标记,不静默填充 0 - [x] 已删除重复文档和 NOTICE - [x] 顶层 docs/ 未修改 - [x] 顶层 autofuse/README*.md 未纳入最终 PR 差异 - [ ] 未执行设备侧 tiling 验证 ## 8. 其他信息 工具验证使用本仓 Python 环境和已有 ATT fixture;远端场景由用户提供运行环境和命令后再执行,标准远端通道为 ssh,不默认使用 devssh。PR 1856/1857 保留各自 skill 内容,并已同步本 PR 的工具版本。 See merge request: cann/graph-autofusion!1855 | 10 天前 | |
fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260) Co-authored-by: m0_56712298<wukeran@huawei.com> # message auto-generated for no-merge-commit merge: !1862 merge fix/issue-256-260-develop into develop fix: 修复 Gather 回绕及 BrcInline/Cast/Concat 截断(#256 #258 #259 #260) Created-by: m0_56712298 Commit-by: m0_56712298 Merged-by: cann-robot Description: # Pull Request ## 描述 修复 v35 AscendC DataCopySimdSimt 在目的地址未按 32 字节对齐时的无符号长度回绕问题。 - padding 分支仅复制 min(length, padding_elements) 个实际元素。 - 当 length <= padding_elements 时完成实际元素复制后直接返回,避免无符号减法回绕。 - 新增边界行为单元测试,校验目标元素正确且缓冲区其余元素未被写入。 同时修复 Issue #258 中 BrcInline repeat stride 的 uint8_t 截断问题。 - repeat stride 超过 255 blocks 时回退到已有 counter 路径。 - 可表示范围内继续使用 repeat 快路径。 - 新增策略回归测试,验证两个外层位置均由 counter 路径处理。 同时修复 Issue #259 中 Cast repeat stride 的 uint8_t 截断问题。 - 先以 uint32_t 计算输入、输出 repeat stride,避免窄化后再判断。 - 任一 repeat stride 超过 255 blocks 时,按行调用已有普通 Cast 路径。 - 可表示范围内继续使用 repeat 快路径。 - 新增大输出 stride 回归测试,校验两行输出位置及 padding 区域未被额外写入。 同时修复 Issue #260 中 Concat tail mask 的 uint16_t 截断问题。 - 以 uint32_t 保存 32 位 tail mask,避免写入 mask word 前丢失高 16 位。 - 新增 GenMaskReg 高位保留回归测试,直接校验 8 个 uint32_t mask word。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue - 正式关联:#256 - 同一 PR 修复:https://gitcode.com/cann/graph-autofusion/issues/258 - 同一 PR 修复:https://gitcode.com/cann/graph-autofusion/issues/259 - 同一 PR 修复:https://gitcode.com/cann/graph-autofusion/issues/260 GitCode 每个 PR 仅允许正式关联一个 Issue,因此保留原 #256 的正式关联,并在此记录 #258、#259、#260。 ## 如何测试 描述测试此变更的步骤和前提条件: 1. cmake --build build --target test_ascendc_api_v35 -j 8:通过。 2. test_ascendc_api_v35 --gtest_filter=TestApiGather.DataCopySimdSimtSmallLengthWithinPadding --gtest_brief=1:1/1 通过。 3. test_ascendc_api_v35 --gtest_brief=1:352/352 通过。 4. bash scripts/oat_check.sh:#256 的三个变更文件检查通过。 5. test_ascendc_api --gtest_filter=TestApiBroInline.*:15/15 通过。 6. bash scripts/oat_check.sh autofuse/ascendc/api/brc_inline_api.h autofuse/tests/ut/ascendc/api/test_brc_inline_api.cpp:#258 的两个变更文件检查通过。 7. test_ascendc_api --gtest_filter=TestApiCast.LargeDstRepeatStrideFallsBackToLoop:1/1 通过。 8. test_ascendc_api --gtest_filter='*Cast*':43/43 通过。 9. test_ascendc_api:456/456 通过。 10. bash scripts/oat_check.sh autofuse/ascendc/api/cast.h autofuse/tests/ut/ascendc/api/test_cast.cpp:#259 的两个变更文件检查通过。 11. cmake --build build --target test_ascendc_api_v35 -j 8:#260 增量编译通过。 12. test_ascendc_api_v35 --gtest_filter='RegbaseApiConcatTest.*':2/2 通过。 13. bash scripts/oat_check.sh autofuse/v35/ascendc/api_regbase/concat.h autofuse/tests/v35/ut/ascendc/api_regbase/test_concat.cpp:#260 的两个变更文件检查通过。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档(本次修复不涉及文档变更) - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本次 PR 包含 #256、#258、#259 和 #260 四个独立 fix: commit,不涉及 API/ABI、图改写、构建交付或运行时接口变更。 See merge request: cann/graph-autofusion!1862 | 6 天前 | |
【PR】: [feat] 修改同名头文件ge_error_codes.h/ascend_string.h/tensor.h. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !1878 merge develop_fix_headers into develop 【PR】: [feat] 修改同名头文件ge_error_codes.h/ascend_string.h/tensor.h. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 修改ge_error_codes.h/ascend_string.h/tensor.h三个和metadef仓同名的头文件,加上'_af'的后缀。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 代码重构,ci流水线与RDVpass即可 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1878 | 10 天前 | |
【PR】: 修复readme里pip安装torch_npu报错的问题 Co-authored-by: @gcw_Xt6hqG9y<1634807286@qq.com> # message auto-generated for no-merge-commit merge: !1913 merge readme-fix into develop 【PR】: 修复readme里pip安装torch_npu报错的问题 Created-by: gcw_Xt6hqG9y Commit-by: @gcw_Xt6hqG9y Merged-by: cann-robot Description: # Pull Request ## 描述 修复readme里pip安装torch_npu报错的问题 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.根据修改的autofusion/readme.md自测 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1913 | 6 天前 | |
【PR】: 修复readme里pip安装torch_npu报错的问题 Co-authored-by: @gcw_Xt6hqG9y<1634807286@qq.com> # message auto-generated for no-merge-commit merge: !1913 merge readme-fix into develop 【PR】: 修复readme里pip安装torch_npu报错的问题 Created-by: gcw_Xt6hqG9y Commit-by: @gcw_Xt6hqG9y Merged-by: cann-robot Description: # Pull Request ## 描述 修复readme里pip安装torch_npu报错的问题 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.根据修改的autofusion/readme.md自测 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1913 | 6 天前 | |
add l Co-authored-by: JaydenChu<zhumin54@huawei.com> Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !370 merge 5_11_1 into master 【PR】: 同步GE仓最新修改到AF仓(4.14上午11时~5.15晚,总计129个PR需要同步) Created-by: JaydenChu Commit-by: JaydenChu;xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 同步GE仓最新修改到AF仓(4.14上午11时~5.15晚,总计129个PR需要同步) 所有涉及PR(包含检查过不需要同步的)从编号#1904(4.14 https://gitcode.com/cann/ge/pull/1904)到#2904(5.15 http://gitcode.com/cann/ge/pull/1904) 每个实际已同步pr都对应此pr的一个commit(部分同步pr为了方便同步合并到了一个commit中) ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [x] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [x] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. 业务代码和llt编译通过 2. llt执行通过 3. 全量rdv验证通过 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!370 | 3 个月前 |
Autofuse
简介
AutoFuse是基于Ascend C的自动融合框架,支持自动融合范围识别、自动算子代码生成、Auto Tiling优化、动态shape及混合精度等特性;在算法网络中,由于存在大量的Vector计算,各个Vector计算之间会产生大量的内存搬运,导致Memory Bound问题。而AutoFuse通过自动将多个算子融合为一个算子,减少网络中的算子数量和内存搬运,从而缓解了Memory Bound问题,释放昇腾算力,提升模型的执行性能。
详细介绍,请参考《Autofuse自动融合》
Autofuse 目录结构
autofuse/
├── ascendc # ascendc api 定义
├── ascir # 算子注册 ascir
├── att # 自动 tiling 生成 模块
├── cmake # cmake 脚本文件
├── codegen # kernel 代码生成 模块
├── common # 通用工具方法
├── compiler # 对外API 接口
├── examples # 示例脚本,演示典型用法
├── graph_metadef # 基本图接口
├── inc # 供 GE 调用接口
├── optimize # 调度切分 模块
├── scripts # 脚本路径
├── tests # 测试用例与测试框架
├── tools # 调试与分析工具
├── v35 # 昇腾950 芯片相关优化
├── CMakeLists.txt # CMake 配置文件
├── blacklist.txt # 工程配置文件
├── README.md # 中文说明文档
└── README_en.md # 英文说明文档
构建与安装
参考执行构建。
上板验证指导
用户如果想在昇腾设备上体验 Autofuse 的功能与性能,可以先参考快速安装准备环境。无论是没有昇腾设备的开发者,还是已有昇腾设备的开发者,都可以快速搭建好环境。在此基础上,按照上一步构建与安装,增量安装了graph-autofusion仓编译生成的cann包。
AutoFuse 当前提供 PyTorch 和 TensorFlow 两种框架下的 Sample 用例,未来我们可能会支持更多框架。可根据实际使用场景参考对应文档完成环境安装和用例执行:
以下以 Pytorch 场景为例,指导如何搭建 Pytorch 环境,跑通 Pytorch场景下用例,并通过profiling数据观察最后的kernel性能。
安装依赖
安装 torch_npu
pip3 install numpy
pip3 install pyyaml
pip3 install setuptools
为确保使用与 AutoFuse AscendC 后端匹配的 torch_npu Daily 环境,torch_npu的安装请使用仓库提供的 PyTorch环境安装脚本 ,不建议直接通过 PyPI 安装 torch_npu。
在 Graph-AutoFusion 仓库根目录执行:
bash scripts/env_install/pytorch/setup_torch_npu_daily.sh
其他环境依赖
CMake >= 3.16.0
GCC >= 7.3.0
如需切换到 gcc15/gcc16,请在执行构建前显式设置 CC/CXX,例如:
export CC=gcc-15
export CXX=g++-15
也可以设置 GCC_VERSION=15 或 GCC_VERSION=16 交给脚本生成对应编译器命令。请不要使用 update-alternatives 修改系统默认 gcc。
切换编译器后请先清理 build/,避免 CMake 缓存继续使用旧的编译器配置。
在 openEuler 系统上,您可以通过以下命令安装:
sudo yum install cmake gcc
在 Ubuntu 系统上,您可以通过以下命令安装:
sudo apt-get install cmake gcc
设置环境变量
执行用例前,需要设置如下环境变量,设置运行NPU设备。
# 用户自己的 driver 包安装路径
source /usr/local/Ascend/driver/bin/setenv.sh
# 用户自己的 CANN 包安装路径
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 假设跑在 0卡,和脚本保持一致
export ASCEND_DEVICE_ID=0
执行用例
假设用例名为 test.py,直接执行: python3 test.py
更多调测相关环境变量
TORCH_COMPILE_DEBUG
作用: torch原生环境变量,启用详细调试日志,以及编译中间产物保存等。
使用方法:
export TORCH_COMPILE_DEBUG=1
注意: 多次执行相同脚本,会因为缓存存在而跳过编译,可以配合 TORCHINDUCTOR_FORCE_DISABLE_CACHES 使用,强制每次执行都重新编译。
TORCHINDUCTOR_FORCE_DISABLE_CACHES
作用: torch原生环境变量,禁用 Inductor 缓存,每次执行都会重新编译。
使用方法:
export TORCHINDUCTOR_FORCE_DISABLE_CACHES=1
注意: 会显著增加图启动耗时,实际部署时请勿使用该环境变量。
可选:ASCEND_LAUNCH_BLOCKING
作用: torch_npu原生环境变量,启用 Ascend 内核同步执行,每次kernel下发都会等待完成,便于确定首个报错的 kernel。
使用方法:
export ASCEND_LAUNCH_BLOCKING=1
注意: 会显著降低下发性能,实际部署时请勿使用该环境变量。
可选:AUTOFUSE_DFX_FLAGS
作用: autofuse DFX环境变量,落盘每个自动融合算子,对应的内部融合图结构。pbtxt文件可以使用netron.app 打开观察。 使用方法:
export AUTOFUSE_DFX_FLAGS="--codegen_compile_debug=true;--debug_dir=/path-to-dump/"
注意:Autofuse 后端会在设置的 dump 路径下生成每个融合算子的 dump 图。
编译性能诊断由 codegen_compile_debug=true 控制。例如:
export AUTOFUSE_DFX_FLAGS="--codegen_compile_debug=true"
开启后会:
- 输出每个 LLVM pass 的耗时(
-ftime-report=per-pass); - 生成编译器时间线 JSON 文件,默认保存到
~/.cache/autofuse_compile_trace,终端会输出[CompileTrace] <文件路径>。
Host 编译会复用已有 PCH,缓存未命中时尝试创建。PCH 缓存目录为 ~/.cache/autofuse_pch_cache;PCH 缓存或创建失败时会自动回退到普通 Host 编译。
结果分析 & 调测输出分析
用户开启 TORCH_COMPILE_DEBUG 后,调试信息会输出到当前执行目录下的 torch_compile_debug 子目录。其中,以 autofused_ 为前缀的目录是 torch_npu AscendC 后端生成的融合算子产物,其余目录为 PyTorch Inductor 生成的原生产物。每个以 autofused_ 为前缀的目录对应一个融合算子的白盒结构,可用于查看融合范围和代码生成结果。如果未生成以 autofused_ 为前缀的目录,则说明当前编译过程中没有产生融合算子。此时,可以根据终端输出中的 Fallback aten.xxxx $reason: xx原因 信息分析未发生融合的原因。
用户也可以通过 Profiling 相关配置,观察使能自动融合后的算子性能收益。对于上述 Sample 用例,可以注释整个 torch.compile(...) 代码块,使模型以非编译模式执行,作为未使能自动融合的对照场景。
# model = torch.compile(
# model,
# dynamic=False,
# fullgraph=True,
# options={"npu_backend": "ascendc"},
# )
分别采集未使能自动融合和使能自动融合两种场景的 Profiling 数据,并对比相同计算范围内所有相关算子的总耗时。
详细的Profiling性能分析工具的使用方法,可参见Profiling性能分析工具指南。
需要注意的是,不是模型里所有的算子都能被融合,对于在 Inductor 层未被 lowering 的算子,最后仍然以单算子形式存在。融合提升比,等于 (融合前所有算子耗时-融合后所有算子耗时)/融合前所有算子耗时。更进一步的,可以观察融合算子相比于单算子的 aiv_mte2_time(输入搬运耗时)和 aiv_mte3_time(输出搬运耗时)的提升情况。
对于精度的分析,详细的精度调试工具的使用方法,可参见精度调试工具指南。
复杂网络使能
用户在网络中使能 AutoFuse 时,无需单独导入 inductor_npu_ext,
只需在 torch.compile 中指定 AscendC 后端:
model = torch.compile(
model,
dynamic=False,
fullgraph=True,
options={"npu_backend": "ascendc"},
)