| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix: Autofuse 输出日志和错误提示文案标准化 (#312) Co-authored-by: hamburgerbobo<gaoyubo4@huawei.com> # message auto-generated for no-merge-commit merge: !2098 merge fix/log-output-issue into develop fix: Autofuse 输出日志和错误提示文案标准化 (#312) Created-by: hamburgerbobo Commit-by: hamburgerbobo Merged-by: cann-robot Description: # Pull Request ## 描述 本 PR 整改 Autofuse 输出日志和错误提示文案,提升日志可读性、问题定位能力和统一日志管理一致性。 - 修正日志中的拼写、语法和主谓一致问题。 - 补充越限日志的当前值和合法范围。 - 为 VF 性能日志补充 cycle 单位。 - 将生产 Python 编译流程中的自定义 print 接入已有统一日志接口。 - 翻译计划中指定的中文输出文案,并同步通用求解器生产生成器、source mirror 和 UT 期望。 - 更新统一日志接口相关 Python UT。 本 PR 仅包含本次日志整改涉及的源码和必要测试更新,不包含日志分析 CSV、设计文档、.gitignore 或当前分支中的其他历史提交。 ## 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue https://gitcode.com/cann/graph-autofusion/issues/312 Fixes #312 合并后关闭已关联的 Issue。 ## 如何测试 1. 使用 CANN 9.2.0 配置 CMake,执行 cmake --build build --target aihac_codegen -j 8。 2. 执行 cmake --build build --target pyautofuse -j 8。 3. 执行编译相关 Python UT,结果为 113 passed。 4. 执行 ATT Analyze 单测和功能测试,结果分别为 38 passed 和 4 passed。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本次仅涉及日志文案和统一日志输出接口,不改变图优化、Codegen 算法、运行时数据流或对外 API/ABI。项目文档无需更新。 See merge request: cann/graph-autofusion!2098 | 29 天前 | |
feat: 支持静态Shape根据ub大小过滤非法template Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !964 merge feat/static-ub-template-filter into develop feat: 支持静态Shape根据ub大小过滤非法template Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 描述 ### 一、主要解决的问题 Autofuse 在 schedule 模板生成后,所有模板会进入 ATT 生成 tiling func 和 solver 阶段。部分模板在所有可调 tile 取最小值 1、动态轴取 1 时的最小 UB 占用已超过平台 UB 上限,属于必然无解模板,但仍消耗后续编译资源。 本 PR 在 BufQueAllocator().AllocBufQue() 之后新增 StaticUbTemplateFilter,提前丢弃必然无解的模板,减少无效编译开销。同时将 ATT 与 Schedule 共用的 UB 表达式构建逻辑抽取到 autofuse/common/ub_expr/,保证两端使用同一份 UB 表达式来源。 ### 二、修改方案 #### 2.1 新增 StaticUbTemplateFilter(optimize 层) - 在 optimize.cpp 的 AllocBufQue 之后调用 StaticUbTemplateFilter().Filter() - 遍历 FusedScheduledResult 中每个 ScheduledResult 的 schedule group/impl graph - 通过公共 AscGraphUbExprBuilder 构建 UB 表达式上下文 - 对 tile inner axis 替换为 1、动态轴替换为 1,执行静态求值得到 min_ub_usage - min_ub_usage > platform_info.ub_size 时丢弃模板 - 平台信息不可用或求值失败时保留模板,不做激进过滤 - 全部模板被过滤时沿用现有无候选模板失败路径 #### 2.2 新增公共 UB 表达式层(common/ub_expr) - ub_expr_types.h:定义 UbExprContext、UbExprBuildResult、UbExprCmp 等公共类型 - asc_graph_ub_expr_builder.{h,cpp}:基于 AscGraph 构建 UB 表达式上下文,覆盖 Queue/Buffer/TmpBuffer size 表达式、container 命名、tile 变量、动态轴变量等 - ub_expr_utils.{h,cpp}:从 UbExprContext 获取原始 UB 表达式 #### 2.3 扩展 PlatformContext - 新增 TryGetInitializedPlatformInfo:无副作用读取已初始化的平台信息,不触发 runtime 初始化 - 新增 TryGetUbSizeOverride:支持上层通过 SetPlatformInfo 注入 UB size(soc_ver 为空时) - 保持 GetPlatformInfo/SetPlatformInfo 既有行为不变 #### 2.4 ATT 侧适配 - gen_model_info.cpp:新增 RefreshCommonUbExprContext,基于公共 AscGraphUbExprBuilder 刷新 UB 表达式上下文,替换旧的 container 表达式 - ub_named_expr_builder.{h,cpp}:ATT 内部命名化 UB 表达式构建,复用公共 BuildUbExpr 获取原始表达式 - axes_reorder_solver_gen.cpp:适配公共 UB 表达式接口 #### 2.5 测试覆盖 - 新增 UT:test_static_ub_template_filter(过滤器正向/异常/边界)、test_ub_expr_utils(BuildUbExpr)、test_platform_context(新接口) - 新增 ATT UT:test_gen_model_info(UB 刷新)、test_axes_reorder_gen(命名化 UB 表达式) - 更新 runtime stub 适配新接口 - 已有 ST/UT 适配:optimize_st、optimize_st_v2、test_optimizer_v2、test_python_ascir ### 三、代码修改流程图 mermaid flowchart TD A[Optimize 生成 schedule 模板] --> B[BufQueAllocator::AllocBufQue] B --> C[StaticUbTemplateFilter::Filter] C --> D{PlatformInfo 可用且 ub_size > 0?} D -- 否 --> E[跳过过滤, 保留全部模板] D -- 是 --> F[遍历 ScheduledResult] F --> G[AscGraphUbExprBuilder::Build] G --> H[UbExprUtils::BuildUbExpr] H --> I[tile=1, 动态轴=1 替换] I --> J{静态求值成功?} J -- 否 --> K[WARNING, 保留模板] J -- 是 --> L{min_ub > ub_size?} L -- 是 --> M[丢弃模板] L -- 否 --> N[保留模板] M --> O[继续后续流程] N --> O K --> O E --> O style C fill:#90EE90,stroke:#006400,stroke-width:2px style G fill:#90EE90,stroke:#006400,stroke-width:2px style H fill:#90EE90,stroke:#006400,stroke-width:2px ## 变更类型 - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue ## 如何测试 ### 一、测试用例说明 #### 1.1 单元测试 - test_static_ub_template_filter:覆盖平台信息可用/不可用、UB 超限/未超限、表达式求值失败、全部模板被过滤等场景 - test_ub_expr_utils:覆盖 BuildUbExpr 正向和空表达式场景 - test_platform_context:覆盖 TryGetInitializedPlatformInfo 和 TryGetUbSizeOverride - test_gen_model_info:覆盖 UB 表达式刷新 - test_axes_reorder_gen:覆盖命名化 UB 表达式构建 #### 1.2 系统测试 - optimize_st、optimize_st_v2:验证 optimize 全流程包含 UB 过滤 - test_optimizer_v2:v35 optimize 流程适配 - test_python_ascir:Python ASCIR 测试适配 ### 二、构建命令 bash sh build.sh -u --module=autofuse_framework -j 8 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 ### 验证方法 - 静态 shape 场景:构造 UB 超限模板,验证被正确过滤 - 动态 shape 场景:动态轴取 1 后 UB 超限模板被过滤 - 平台信息不可用:验证跳过过滤,保留全部模板 - 表达式求值失败:验证 WARNING 日志和模板保留 ### 注意事项 - 本 PR 仅做必要条件过滤(保守过滤),不替换 ATT 最终 UB solver - 不修改对外 ABI/API,不新增 Python 绑定 - 不引入新的用户配置项或环境变量 - 不触发 runtime platform 初始化 ### 提交记录 | Commit | 描述 | 修改文件数 | 修改行数 | |--------|------|-----------|----------| | 15856eb | feat: add static ub template filter | 28 | +1790/-56 | | a8bd396 | test: cover named ub expr builder | 2 | +17/-0 | | aedf707 | fix: preserve platform info semantics for ub filter | 5 | +52/-12 | ### 修改文件清单 | 文件路径 | 修改类型 | 说明 | |---------|---------|------| | autofuse/optimize/static_ub_template_filter.h | 新增 | 静态 UB 模板过滤器头文件 | | autofuse/optimize/static_ub_template_filter.cpp | 新增 | 过滤器实现:遍历模板、求值、剪枝 | | autofuse/common/ub_expr/ub_expr_types.h | 新增 | UbExprContext/UbExprBuildResult 等公共类型 | | autofuse/common/ub_expr/asc_graph_ub_expr_builder.h | 新增 | AscGraph UB 表达式构建器头文件 | | autofuse/common/ub_expr/asc_graph_ub_expr_builder.cpp | 新增 | Queue/Buffer/TmpBuffer UB 表达式构建实现 | | autofuse/common/ub_expr/ub_expr_utils.h | 新增 | UB 表达式工具类头文件 | | autofuse/common/ub_expr/ub_expr_utils.cpp | 新增 | BuildUbExpr 实现 | | autofuse/common/platform_context.cpp | 修改 | 新增 TryGetInitializedPlatformInfo/TryGetUbSizeOverride | | autofuse/inc/common/platform_context.h | 修改 | 新增无副作用平台信息读取接口 | | autofuse/optimize/optimize.cpp | 修改 | AllocBufQue 后调用 StaticUbTemplateFilter | | autofuse/att/gen_model_info/gen_model_info.cpp | 修改 | 基于公共 UB builder 刷新 context | | autofuse/att/.../ub_named_expr_builder.h | 新增 | ATT 命名化 UB 表达式头文件 | | autofuse/att/.../ub_named_expr_builder.cpp | 新增 | ATT 命名化 UB 表达式实现 | | autofuse/att/.../axes_reorder_solver_gen.cpp | 修改 | 适配公共 UB 表达式接口 | | autofuse/tests/... (16 files) | 新增/修改 | UT/ST 测试用例和 runtime stub 适配 | See merge request: cann/graph-autofusion!964 | 3 个月前 | |
fix: ensure deterministic codegen and reliable PGO fallback Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1662 merge fix/codegen-determinism-p0 into develop fix: ensure deterministic codegen and reliable PGO fallback Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 #### 1.1 跨进程 codegen 产物不确定 相同静态图在独立进程中可能生成不同的源码和缓存 hash,导致 Inductor PGO 无法稳定复用 codegen 结果。根因包括: - VF 并行节点和边界锚点排序依赖节点 ID、插入顺序。 - VF 拓扑排序只考虑数据边,未纳入控制依赖。 - 临时 Buffer 分配顺序受裸指针地址影响。 #### 1.2 PGO skip 场景未可靠回退 - fallback 程序返回 0,调用方将 no-op 误判为调优成功。 - PGO 搜索结果文件缺失时直接抛出 OSError,中断正常回退流程。 ### 二、问题解决前后对比 | 场景 | 解决前 | 解决后 | 效果 | |------|--------|--------|------| | VF 并行节点排序 | 使用节点 ID,同级节点顺序受插入顺序影响 | 使用节点名作为稳定主键,入口校验节点名唯一 | 跨进程节点顺序一致 | | VF 依赖建模 | 仅统计数据边 | 数据边、控制边共同参与拓扑排序,并对相同后继去重 | 保留执行顺序约束 | | VF 边界锚点 | 沿节点和 peer 遍历顺序收集 | 按节点名、anchor index 排序 | 输入输出 tensor 编号稳定 | | 临时 Buffer 分配 | 按指针地址或不完整的生命期键排序 | 按生命期、allocation_order、group_id 排序 | Buffer ID 和源码稳定 | | PGO skip 返回码 | 返回 0,被误判为成功 | 返回 1 | 正确回退原始解 | | 搜索文件缺失 | 抛出 OSError | 返回失败三元组 | 编译流程不中断 | | optimize_ut 编译 | 缺少 AscGraphBuilder 声明 | 显式包含 asc_graph_builder.h | 阻塞编译恢复 | | NBNC 告警 | MergeTensorByGroupId 为 51 | 删除一次性类型别名,等价表达后为 50 | 满足 codecheck 门限 | mermaid flowchart LR subgraph Before[解决前] B1[VF 顺序受 ID 和插入顺序影响] --> B2[边界顺序不稳定] B2 -->|影响| B3[Buffer ID 受指针地址影响] B3 -->|导致| B4[源码和缓存 hash 波动] B5[PGO skip 返回 0] --> B6[误判调优成功] B7[测试缺少直接 include] --> B8[optimize_ut 编译失败] end subgraph After[解决后] A1[节点名和控制依赖稳定拓扑] --> A2[稳定边界锚点] A2 -->|保证| A3[稳定生命期分配] A3 -->|实现| A4[源码和缓存 hash 一致] A5[PGO skip 返回 1] --> A6[回退原始解] A7[显式 include] --> A8[optimize_ut 编译通过] end B4 -.修复.-> A4 B6 -.修复.-> A6 B8 -.修复.-> A8 ### 三、修改方案 #### 3.1 VF 排序稳定化 - Partition 入口校验节点名唯一,避免稳定排序键产生歧义。 - 并行节点优先按节点名排序;拓扑依赖从 GetOutDataNodes 改为 GetOutAllNodes。 - VF 输入输出边界按节点名和 anchor index 排序。 #### 3.2 Buffer 分配稳定化 - TensorInfo、TensorGroup 增加 allocation_order,并按图遍历顺序赋值。 - TensorGroupLifeLess 以 merged_life_start 为主键,以 allocation_order、group_id 为稳定次键。 - AllocTmpBuff 将指针 map 内容收集到 vector 后稳定排序,再分配 Buffer。 #### 3.3 PGO 回退可靠化 - PGO fallback 生成代码返回值从 0 改为 1,使 pgo_program_exec 进入失败回退路径。 - pgo_get_top_result 捕获 OSError,结果文件缺失时返回 (None, None, None)。 #### 3.4 Review 阻塞项修复 - test_vf_partition.cpp 显式包含 asc_graph_builder.h,消除传递 include 依赖。 - MergeTensorByGroupId 直接使用 int64_t map key,并用 const auto 保存 group_id;不改变分组逻辑,NBNC 从 51 降至 50。 ## 变更类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [ ] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的 Issue 无。 ## 如何测试 ### 一、本地验证 | 验证项 | 命令或范围 | 结果 | |--------|------------|------| | optimize UT 构建 | cmake --build build --target optimize_ut -j 8 | 通过,生成最新 optimize_ut | | 定向回归 | Buffer 分配 1 项、VF 分区 4 项 | 5/5 通过 | | Python UT | test_compile_adapter.py | 41 项通过 | | Codegen UT | PgoTilingKeyCountOverflowShouldFallbackTfAndPgoRunner | 1 项通过 | | 格式与补丁 | git diff --check、git clang-format --diff | 通过 | | 提交门禁 | pre-commit | clang-format、codespell、OAT 等全部通过 | | NBNC | MergeTensorByGroupId | 50 | 定向回归覆盖: - 临时 Buffer 按生命期稳定分配。 - VF 控制依赖保序。 - 重复节点名在改图前被拒绝。 - VF 输出和 tensor 顺序不受并行节点插入顺序影响。 ### 二、远端 compile - 流水线 #1004745,HEAD 1cac68b542f8:success。 - static-check、compile、llt 均完成;X86、ARM、Ubuntu 24 构建及 API_Check、PreSmoke 通过。 - ci-pipeline-passed label 已回写,结果对应最新提交。 ### 三、系统与上板验证 - Ascend 950 环境下,SR001、SR007、SR012 多进程重复生成的 cache hash 均唯一。 - NC018 静态 shape 场景中,baseline Top1 与 PGO Top3 的 prepare、profile 均通过,cache_reused=True。 - 验证时成套加载同一次构建的 Graph-autofusion 动态库,避免新旧组件混用。 ## 核对清单 - [x] 代码遵循项目代码风格 - [x] 已完成针对性自测 - [x] 本变更不涉及公开文档更新 - [x] PR 标题使用合适的类型标签 - [x] 已阅读并遵守 CONTRIBUTING.md ## 其他信息 ### 兼容性与影响 - 不修改公开 API/ABI、Python/C++ 绑定、构建打包或 runtime 接口。 - 图优化只固定同级节点和边界锚点顺序,并补全既有控制依赖,不引入新 pass。 - Buffer 变更只消除非确定性遍历顺序;PGO 返回码调整是既有失败语义修正。 - 未新增高频日志、额外 runtime 调用或显著复杂度,性能影响可忽略。 ### 提交记录 | Commit | 描述 | 修改文件数 | |--------|------|-----------| | b71a34a0 | ensure deterministic codegen across processes | 7 | | 58571b25 | preserve control dependencies in VF ordering | 2 | | 269b71d9 | fallback when TF PGO search is skipped | 5 | | 1cac68b5 | address review build and codecheck issues | 2 | ### 修改文件清单 | 文件路径 | 说明 | |----------|------| | autofuse/v35/optimize/partition/vector_func_partitioner.cpp | VF 拓扑与边界锚点稳定排序,纳入控制依赖 | | autofuse/v35/optimize/partition/vector_func_partitioner.h | 声明节点名唯一性校验 | | autofuse/optimize/buffer_allocate/buf_que_allocator.cpp | 记录临时 Buffer allocation_order | | autofuse/optimize/buffer_allocate/mem_reuse_manager.cpp | 稳定分配顺序并修复 NBNC 告警 | | autofuse/optimize/buffer_allocate/mem_reuse_manager.h | 声明单组临时 Buffer 分配函数 | | autofuse/optimize/buffer_allocate/tensor_mem_defs.h | 增加 allocation_order | | autofuse/codegen/codegen_tiling_pgo_runtime.cpp | 修正 PGO fallback 返回码 | | autofuse/compiler/python/compile_adapter.py | 处理 PGO 搜索文件缺失 | | autofuse/tests/v35/ut/optimize/test_vf_partition.cpp | VF 稳定性、控制依赖和重复名 UT;补直接 include | | autofuse/tests/ut/optimize/test_buf_que_allocator.cpp | Buffer 稳定分配 UT | | autofuse/tests/ut/python/test_compile_adapter.py | 搜索文件缺失 UT | | autofuse/tests/ut/codegen/test_codegen_tiling.cpp | 适配 PGO fallback 返回码 | | autofuse/tests/st/backend_e2e/pgo_add_abs_inductor_test/pgo_add_abs_inductor_backend_generate.cpp | 适配 fallback 生成代码 | See merge request: cann/graph-autofusion!1662 | 2 个月前 | |
fix: ensure deterministic codegen and reliable PGO fallback Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1662 merge fix/codegen-determinism-p0 into develop fix: ensure deterministic codegen and reliable PGO fallback Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 #### 1.1 跨进程 codegen 产物不确定 相同静态图在独立进程中可能生成不同的源码和缓存 hash,导致 Inductor PGO 无法稳定复用 codegen 结果。根因包括: - VF 并行节点和边界锚点排序依赖节点 ID、插入顺序。 - VF 拓扑排序只考虑数据边,未纳入控制依赖。 - 临时 Buffer 分配顺序受裸指针地址影响。 #### 1.2 PGO skip 场景未可靠回退 - fallback 程序返回 0,调用方将 no-op 误判为调优成功。 - PGO 搜索结果文件缺失时直接抛出 OSError,中断正常回退流程。 ### 二、问题解决前后对比 | 场景 | 解决前 | 解决后 | 效果 | |------|--------|--------|------| | VF 并行节点排序 | 使用节点 ID,同级节点顺序受插入顺序影响 | 使用节点名作为稳定主键,入口校验节点名唯一 | 跨进程节点顺序一致 | | VF 依赖建模 | 仅统计数据边 | 数据边、控制边共同参与拓扑排序,并对相同后继去重 | 保留执行顺序约束 | | VF 边界锚点 | 沿节点和 peer 遍历顺序收集 | 按节点名、anchor index 排序 | 输入输出 tensor 编号稳定 | | 临时 Buffer 分配 | 按指针地址或不完整的生命期键排序 | 按生命期、allocation_order、group_id 排序 | Buffer ID 和源码稳定 | | PGO skip 返回码 | 返回 0,被误判为成功 | 返回 1 | 正确回退原始解 | | 搜索文件缺失 | 抛出 OSError | 返回失败三元组 | 编译流程不中断 | | optimize_ut 编译 | 缺少 AscGraphBuilder 声明 | 显式包含 asc_graph_builder.h | 阻塞编译恢复 | | NBNC 告警 | MergeTensorByGroupId 为 51 | 删除一次性类型别名,等价表达后为 50 | 满足 codecheck 门限 | mermaid flowchart LR subgraph Before[解决前] B1[VF 顺序受 ID 和插入顺序影响] --> B2[边界顺序不稳定] B2 -->|影响| B3[Buffer ID 受指针地址影响] B3 -->|导致| B4[源码和缓存 hash 波动] B5[PGO skip 返回 0] --> B6[误判调优成功] B7[测试缺少直接 include] --> B8[optimize_ut 编译失败] end subgraph After[解决后] A1[节点名和控制依赖稳定拓扑] --> A2[稳定边界锚点] A2 -->|保证| A3[稳定生命期分配] A3 -->|实现| A4[源码和缓存 hash 一致] A5[PGO skip 返回 1] --> A6[回退原始解] A7[显式 include] --> A8[optimize_ut 编译通过] end B4 -.修复.-> A4 B6 -.修复.-> A6 B8 -.修复.-> A8 ### 三、修改方案 #### 3.1 VF 排序稳定化 - Partition 入口校验节点名唯一,避免稳定排序键产生歧义。 - 并行节点优先按节点名排序;拓扑依赖从 GetOutDataNodes 改为 GetOutAllNodes。 - VF 输入输出边界按节点名和 anchor index 排序。 #### 3.2 Buffer 分配稳定化 - TensorInfo、TensorGroup 增加 allocation_order,并按图遍历顺序赋值。 - TensorGroupLifeLess 以 merged_life_start 为主键,以 allocation_order、group_id 为稳定次键。 - AllocTmpBuff 将指针 map 内容收集到 vector 后稳定排序,再分配 Buffer。 #### 3.3 PGO 回退可靠化 - PGO fallback 生成代码返回值从 0 改为 1,使 pgo_program_exec 进入失败回退路径。 - pgo_get_top_result 捕获 OSError,结果文件缺失时返回 (None, None, None)。 #### 3.4 Review 阻塞项修复 - test_vf_partition.cpp 显式包含 asc_graph_builder.h,消除传递 include 依赖。 - MergeTensorByGroupId 直接使用 int64_t map key,并用 const auto 保存 group_id;不改变分组逻辑,NBNC 从 51 降至 50。 ## 变更类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [ ] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的 Issue 无。 ## 如何测试 ### 一、本地验证 | 验证项 | 命令或范围 | 结果 | |--------|------------|------| | optimize UT 构建 | cmake --build build --target optimize_ut -j 8 | 通过,生成最新 optimize_ut | | 定向回归 | Buffer 分配 1 项、VF 分区 4 项 | 5/5 通过 | | Python UT | test_compile_adapter.py | 41 项通过 | | Codegen UT | PgoTilingKeyCountOverflowShouldFallbackTfAndPgoRunner | 1 项通过 | | 格式与补丁 | git diff --check、git clang-format --diff | 通过 | | 提交门禁 | pre-commit | clang-format、codespell、OAT 等全部通过 | | NBNC | MergeTensorByGroupId | 50 | 定向回归覆盖: - 临时 Buffer 按生命期稳定分配。 - VF 控制依赖保序。 - 重复节点名在改图前被拒绝。 - VF 输出和 tensor 顺序不受并行节点插入顺序影响。 ### 二、远端 compile - 流水线 #1004745,HEAD 1cac68b542f8:success。 - static-check、compile、llt 均完成;X86、ARM、Ubuntu 24 构建及 API_Check、PreSmoke 通过。 - ci-pipeline-passed label 已回写,结果对应最新提交。 ### 三、系统与上板验证 - Ascend 950 环境下,SR001、SR007、SR012 多进程重复生成的 cache hash 均唯一。 - NC018 静态 shape 场景中,baseline Top1 与 PGO Top3 的 prepare、profile 均通过,cache_reused=True。 - 验证时成套加载同一次构建的 Graph-autofusion 动态库,避免新旧组件混用。 ## 核对清单 - [x] 代码遵循项目代码风格 - [x] 已完成针对性自测 - [x] 本变更不涉及公开文档更新 - [x] PR 标题使用合适的类型标签 - [x] 已阅读并遵守 CONTRIBUTING.md ## 其他信息 ### 兼容性与影响 - 不修改公开 API/ABI、Python/C++ 绑定、构建打包或 runtime 接口。 - 图优化只固定同级节点和边界锚点顺序,并补全既有控制依赖,不引入新 pass。 - Buffer 变更只消除非确定性遍历顺序;PGO 返回码调整是既有失败语义修正。 - 未新增高频日志、额外 runtime 调用或显著复杂度,性能影响可忽略。 ### 提交记录 | Commit | 描述 | 修改文件数 | |--------|------|-----------| | b71a34a0 | ensure deterministic codegen across processes | 7 | | 58571b25 | preserve control dependencies in VF ordering | 2 | | 269b71d9 | fallback when TF PGO search is skipped | 5 | | 1cac68b5 | address review build and codecheck issues | 2 | ### 修改文件清单 | 文件路径 | 说明 | |----------|------| | autofuse/v35/optimize/partition/vector_func_partitioner.cpp | VF 拓扑与边界锚点稳定排序,纳入控制依赖 | | autofuse/v35/optimize/partition/vector_func_partitioner.h | 声明节点名唯一性校验 | | autofuse/optimize/buffer_allocate/buf_que_allocator.cpp | 记录临时 Buffer allocation_order | | autofuse/optimize/buffer_allocate/mem_reuse_manager.cpp | 稳定分配顺序并修复 NBNC 告警 | | autofuse/optimize/buffer_allocate/mem_reuse_manager.h | 声明单组临时 Buffer 分配函数 | | autofuse/optimize/buffer_allocate/tensor_mem_defs.h | 增加 allocation_order | | autofuse/codegen/codegen_tiling_pgo_runtime.cpp | 修正 PGO fallback 返回码 | | autofuse/compiler/python/compile_adapter.py | 处理 PGO 搜索文件缺失 | | autofuse/tests/v35/ut/optimize/test_vf_partition.cpp | VF 稳定性、控制依赖和重复名 UT;补直接 include | | autofuse/tests/ut/optimize/test_buf_que_allocator.cpp | Buffer 稳定分配 UT | | autofuse/tests/ut/python/test_compile_adapter.py | 搜索文件缺失 UT | | autofuse/tests/ut/codegen/test_codegen_tiling.cpp | 适配 PGO fallback 返回码 | | autofuse/tests/st/backend_e2e/pgo_add_abs_inductor_test/pgo_add_abs_inductor_backend_generate.cpp | 适配 fallback 生成代码 | See merge request: cann/graph-autofusion!1662 | 2 个月前 | |
fix: ensure deterministic codegen and reliable PGO fallback Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1662 merge fix/codegen-determinism-p0 into develop fix: ensure deterministic codegen and reliable PGO fallback Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 ### 一、主要解决的问题 #### 1.1 跨进程 codegen 产物不确定 相同静态图在独立进程中可能生成不同的源码和缓存 hash,导致 Inductor PGO 无法稳定复用 codegen 结果。根因包括: - VF 并行节点和边界锚点排序依赖节点 ID、插入顺序。 - VF 拓扑排序只考虑数据边,未纳入控制依赖。 - 临时 Buffer 分配顺序受裸指针地址影响。 #### 1.2 PGO skip 场景未可靠回退 - fallback 程序返回 0,调用方将 no-op 误判为调优成功。 - PGO 搜索结果文件缺失时直接抛出 OSError,中断正常回退流程。 ### 二、问题解决前后对比 | 场景 | 解决前 | 解决后 | 效果 | |------|--------|--------|------| | VF 并行节点排序 | 使用节点 ID,同级节点顺序受插入顺序影响 | 使用节点名作为稳定主键,入口校验节点名唯一 | 跨进程节点顺序一致 | | VF 依赖建模 | 仅统计数据边 | 数据边、控制边共同参与拓扑排序,并对相同后继去重 | 保留执行顺序约束 | | VF 边界锚点 | 沿节点和 peer 遍历顺序收集 | 按节点名、anchor index 排序 | 输入输出 tensor 编号稳定 | | 临时 Buffer 分配 | 按指针地址或不完整的生命期键排序 | 按生命期、allocation_order、group_id 排序 | Buffer ID 和源码稳定 | | PGO skip 返回码 | 返回 0,被误判为成功 | 返回 1 | 正确回退原始解 | | 搜索文件缺失 | 抛出 OSError | 返回失败三元组 | 编译流程不中断 | | optimize_ut 编译 | 缺少 AscGraphBuilder 声明 | 显式包含 asc_graph_builder.h | 阻塞编译恢复 | | NBNC 告警 | MergeTensorByGroupId 为 51 | 删除一次性类型别名,等价表达后为 50 | 满足 codecheck 门限 | mermaid flowchart LR subgraph Before[解决前] B1[VF 顺序受 ID 和插入顺序影响] --> B2[边界顺序不稳定] B2 -->|影响| B3[Buffer ID 受指针地址影响] B3 -->|导致| B4[源码和缓存 hash 波动] B5[PGO skip 返回 0] --> B6[误判调优成功] B7[测试缺少直接 include] --> B8[optimize_ut 编译失败] end subgraph After[解决后] A1[节点名和控制依赖稳定拓扑] --> A2[稳定边界锚点] A2 -->|保证| A3[稳定生命期分配] A3 -->|实现| A4[源码和缓存 hash 一致] A5[PGO skip 返回 1] --> A6[回退原始解] A7[显式 include] --> A8[optimize_ut 编译通过] end B4 -.修复.-> A4 B6 -.修复.-> A6 B8 -.修复.-> A8 ### 三、修改方案 #### 3.1 VF 排序稳定化 - Partition 入口校验节点名唯一,避免稳定排序键产生歧义。 - 并行节点优先按节点名排序;拓扑依赖从 GetOutDataNodes 改为 GetOutAllNodes。 - VF 输入输出边界按节点名和 anchor index 排序。 #### 3.2 Buffer 分配稳定化 - TensorInfo、TensorGroup 增加 allocation_order,并按图遍历顺序赋值。 - TensorGroupLifeLess 以 merged_life_start 为主键,以 allocation_order、group_id 为稳定次键。 - AllocTmpBuff 将指针 map 内容收集到 vector 后稳定排序,再分配 Buffer。 #### 3.3 PGO 回退可靠化 - PGO fallback 生成代码返回值从 0 改为 1,使 pgo_program_exec 进入失败回退路径。 - pgo_get_top_result 捕获 OSError,结果文件缺失时返回 (None, None, None)。 #### 3.4 Review 阻塞项修复 - test_vf_partition.cpp 显式包含 asc_graph_builder.h,消除传递 include 依赖。 - MergeTensorByGroupId 直接使用 int64_t map key,并用 const auto 保存 group_id;不改变分组逻辑,NBNC 从 51 降至 50。 ## 变更类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [ ] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的 Issue 无。 ## 如何测试 ### 一、本地验证 | 验证项 | 命令或范围 | 结果 | |--------|------------|------| | optimize UT 构建 | cmake --build build --target optimize_ut -j 8 | 通过,生成最新 optimize_ut | | 定向回归 | Buffer 分配 1 项、VF 分区 4 项 | 5/5 通过 | | Python UT | test_compile_adapter.py | 41 项通过 | | Codegen UT | PgoTilingKeyCountOverflowShouldFallbackTfAndPgoRunner | 1 项通过 | | 格式与补丁 | git diff --check、git clang-format --diff | 通过 | | 提交门禁 | pre-commit | clang-format、codespell、OAT 等全部通过 | | NBNC | MergeTensorByGroupId | 50 | 定向回归覆盖: - 临时 Buffer 按生命期稳定分配。 - VF 控制依赖保序。 - 重复节点名在改图前被拒绝。 - VF 输出和 tensor 顺序不受并行节点插入顺序影响。 ### 二、远端 compile - 流水线 #1004745,HEAD 1cac68b542f8:success。 - static-check、compile、llt 均完成;X86、ARM、Ubuntu 24 构建及 API_Check、PreSmoke 通过。 - ci-pipeline-passed label 已回写,结果对应最新提交。 ### 三、系统与上板验证 - Ascend 950 环境下,SR001、SR007、SR012 多进程重复生成的 cache hash 均唯一。 - NC018 静态 shape 场景中,baseline Top1 与 PGO Top3 的 prepare、profile 均通过,cache_reused=True。 - 验证时成套加载同一次构建的 Graph-autofusion 动态库,避免新旧组件混用。 ## 核对清单 - [x] 代码遵循项目代码风格 - [x] 已完成针对性自测 - [x] 本变更不涉及公开文档更新 - [x] PR 标题使用合适的类型标签 - [x] 已阅读并遵守 CONTRIBUTING.md ## 其他信息 ### 兼容性与影响 - 不修改公开 API/ABI、Python/C++ 绑定、构建打包或 runtime 接口。 - 图优化只固定同级节点和边界锚点顺序,并补全既有控制依赖,不引入新 pass。 - Buffer 变更只消除非确定性遍历顺序;PGO 返回码调整是既有失败语义修正。 - 未新增高频日志、额外 runtime 调用或显著复杂度,性能影响可忽略。 ### 提交记录 | Commit | 描述 | 修改文件数 | |--------|------|-----------| | b71a34a0 | ensure deterministic codegen across processes | 7 | | 58571b25 | preserve control dependencies in VF ordering | 2 | | 269b71d9 | fallback when TF PGO search is skipped | 5 | | 1cac68b5 | address review build and codecheck issues | 2 | ### 修改文件清单 | 文件路径 | 说明 | |----------|------| | autofuse/v35/optimize/partition/vector_func_partitioner.cpp | VF 拓扑与边界锚点稳定排序,纳入控制依赖 | | autofuse/v35/optimize/partition/vector_func_partitioner.h | 声明节点名唯一性校验 | | autofuse/optimize/buffer_allocate/buf_que_allocator.cpp | 记录临时 Buffer allocation_order | | autofuse/optimize/buffer_allocate/mem_reuse_manager.cpp | 稳定分配顺序并修复 NBNC 告警 | | autofuse/optimize/buffer_allocate/mem_reuse_manager.h | 声明单组临时 Buffer 分配函数 | | autofuse/optimize/buffer_allocate/tensor_mem_defs.h | 增加 allocation_order | | autofuse/codegen/codegen_tiling_pgo_runtime.cpp | 修正 PGO fallback 返回码 | | autofuse/compiler/python/compile_adapter.py | 处理 PGO 搜索文件缺失 | | autofuse/tests/v35/ut/optimize/test_vf_partition.cpp | VF 稳定性、控制依赖和重复名 UT;补直接 include | | autofuse/tests/ut/optimize/test_buf_que_allocator.cpp | Buffer 稳定分配 UT | | autofuse/tests/ut/python/test_compile_adapter.py | 搜索文件缺失 UT | | autofuse/tests/ut/codegen/test_codegen_tiling.cpp | 适配 PGO fallback 返回码 | | autofuse/tests/st/backend_e2e/pgo_add_abs_inductor_test/pgo_add_abs_inductor_backend_generate.cpp | 适配 fallback 生成代码 | See merge request: cann/graph-autofusion!1662 | 2 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 29 天前 | ||
| 3 个月前 | ||
| 2 个月前 | ||
| 2 个月前 | ||
| 2 个月前 |