| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix: 支持Nddma Brc缓存建模和多Group无依赖场景Group间建模 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1960 merge fix/att-cache-guard-final into develop fix: 支持Nddma Brc缓存建模和多Group无依赖场景Group间建模 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 主要解决的问题 修复 ATT 在 cache guard、NDDMA 计数及多 group 串行依赖建模上的不一致,避免缓存命中路径执行次数被低估,以及存在真实跨 group 依赖时 objective 偏小导致候选模板排序错误。 同时完善 schedule-result 性能日志:最终 The value of graph*_result* 日志包含 group_sum、edge_model、edge base、penalty 公式及对应数值,并保留数值紧跟在 is 后,兼容现有 att_analyze 结果性能解析。 ## 修改方案 1. 增加统一的 cache guard 计数逻辑,按符号 guard 范围和 block 维度计算实际执行次数,并对空/非法元数据安全回退。 2. 修正 parser 对共享 cache guard parent、block 外层 guard 和非连续轴的识别,保持 NDDMA 执行计数与 codegen 一致。 3. 在 codegen 中生成确定性的跨 group 串行 edge relation;对有效且非并行的 group 边增加可控惩罚,空 relation、单 group、并行 group 保持原逻辑。 4. 将 edge penalty 参数集中到 att_group_perf_config.h,当前参数为 ratio=0.10、cap=8000,便于后续基于 profiling 校准。 5. 在最终 schedule-result 日志中输出: - group_sum 汇总值; - edge_model 版本; - edge base 公式及计算值; - penalty 的 min(cap, ratio * base) 公式及计算值; - 最终 objective 值。 6. 保持原日志解析契约:最终结果格式为 The value of graph*_result* is <numeric> objective(...),不改变 objective 计算和模板选择逻辑。 7. 补充 cache guard、parser、生成器及 codegen 的 UT,并新增 ATT ST 回归用例。 ## 代码修改流程图 mermaid flowchart TD A["解析 ASCIR cache guard 与 group relation"] --> B{"元数据有效吗"} B -->|否| C["安全回退原有估值"] B -->|是| D["按符号范围计算 guard/NDDMA 次数"] D --> E["确定性生成跨 group edge"] E --> F{"存在串行依赖吗"} F -->|否| G["保持原 objective"] F -->|是| H["加入 edge penalty"] G --> I["生成数值前缀日志"] H --> I I --> J["追加 group_sum 与 edge_model 公式"] J --> K["进行模板比较与 PGO 候选排序"] ## 测试用例说明 本地 ATT Generator UT: text GeneratorUT.GenUpdatePerf*: 11/11 passed 本地 att_analyze 日志解析测试: text python3 -m pytest -q autofuse/tools/att_analyze/tests/unit/test_summary_templates.py autofuse/tools/att_analyze/tests/unit/test_log_parser.py 27 passed 新增公式日志兼容性验证: text The value of graph0_result0 is 85205.982063 objective(...) result_performance=85205.982063 ATT LLT(CANN 9.2.0,/workspace/third_party): text att_ut_aggregate: Passed 100% tests passed, 0 tests failed 新增 ATT ST 回归: text CacheGuardRegression.*: 6/6 passed ATT ST 全量入口受既有环境问题影响(缺失 ReduceSplitPenalty 生成可执行文件,以及 GCC 9.4/13.3 gcov 版本不匹配),不归因于本 patch。 NPU 端使用 Ascend950PR_9579(硬件 block_dim=56)和当前源码 host/device 产物,在统一 DSO、独立 TorchInductor/NPU cache 后验证通过: | PGO topn | 首次编译耗时 (ms) | eager (ms) | autofusion (ms) | speedup | 最大误差 | |---|---:|---:|---:|---:|---:| | 1 | 24332.7870 | 0.36129 | 0.33658 | 1.073x | 4.768e-07 | | 10 | 51401.0540 | 0.06997 | 0.06719 | 1.041x | 4.768e-07 | 首次混用旧 CANN 动态库或旧 kernel cache 时曾出现 kernel init failed;清理并隔离运行时后可复现成功,说明该现象是环境/产物版本组合问题。 ## 核对清单 - [x] 代码遵循项目现有风格 - [x] 已完成 ATT UT/LLT 及新增 ST 回归验证 - [x] 已完成 Ascend950PR NPU 基本功能验证 - [x] 已验证最终 objective 日志与现有 att_analyze 解析兼容 - [x] 参数集中管理,未引入与本 patch 无关的源码修改 - [x] 未跟踪用户已有临时文件和示例文件 - [x] 提交信息符合项目规范 ## 其他信息 源分支:fix/att-cache-guard-final;目标分支:develop。 最新提交:f9926331 fix: preserve numeric tiling objective log prefix。 See merge request: cann/graph-autofusion!1960 | 3 天前 | |
【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 个月前 | |
perf: 限制V2 stride计算上限 Co-authored-by: gcw_V3YyYBt1<gaoxin32@huawei.com> # message auto-generated for no-merge-commit merge: !1955 merge develop-mte3 into develop perf: 限制V2 stride计算上限 Created-by: gcw_V3YyYBt1 Commit-by: gcw_V3YyYBt1 Merged-by: cann-robot Description: # Pull Request ## 描述 为 V2 LoadStoreStride 性能模型中的 stride_used 增加 4096 的常量上限,避免 stride 成本计算超出模型适用范围。 ## 变更类型 <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 无 ## 如何测试 描述测试此变更的步骤和前提条件: 1. source $ASCEND_HOME_PATH/set_env.sh 2. cmake --build build --target aihac_codegen -j 8 3. 构建目标未完成,命令执行期间被用户中止;已完成 git diff --check 和 clang-format 检查。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 See merge request: cann/graph-autofusion!1955 | 1 天前 | |
fix: 支持Nddma Brc缓存建模和多Group无依赖场景Group间建模 Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1960 merge fix/att-cache-guard-final into develop fix: 支持Nddma Brc缓存建模和多Group无依赖场景Group间建模 Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 主要解决的问题 修复 ATT 在 cache guard、NDDMA 计数及多 group 串行依赖建模上的不一致,避免缓存命中路径执行次数被低估,以及存在真实跨 group 依赖时 objective 偏小导致候选模板排序错误。 同时完善 schedule-result 性能日志:最终 The value of graph*_result* 日志包含 group_sum、edge_model、edge base、penalty 公式及对应数值,并保留数值紧跟在 is 后,兼容现有 att_analyze 结果性能解析。 ## 修改方案 1. 增加统一的 cache guard 计数逻辑,按符号 guard 范围和 block 维度计算实际执行次数,并对空/非法元数据安全回退。 2. 修正 parser 对共享 cache guard parent、block 外层 guard 和非连续轴的识别,保持 NDDMA 执行计数与 codegen 一致。 3. 在 codegen 中生成确定性的跨 group 串行 edge relation;对有效且非并行的 group 边增加可控惩罚,空 relation、单 group、并行 group 保持原逻辑。 4. 将 edge penalty 参数集中到 att_group_perf_config.h,当前参数为 ratio=0.10、cap=8000,便于后续基于 profiling 校准。 5. 在最终 schedule-result 日志中输出: - group_sum 汇总值; - edge_model 版本; - edge base 公式及计算值; - penalty 的 min(cap, ratio * base) 公式及计算值; - 最终 objective 值。 6. 保持原日志解析契约:最终结果格式为 The value of graph*_result* is <numeric> objective(...),不改变 objective 计算和模板选择逻辑。 7. 补充 cache guard、parser、生成器及 codegen 的 UT,并新增 ATT ST 回归用例。 ## 代码修改流程图 mermaid flowchart TD A["解析 ASCIR cache guard 与 group relation"] --> B{"元数据有效吗"} B -->|否| C["安全回退原有估值"] B -->|是| D["按符号范围计算 guard/NDDMA 次数"] D --> E["确定性生成跨 group edge"] E --> F{"存在串行依赖吗"} F -->|否| G["保持原 objective"] F -->|是| H["加入 edge penalty"] G --> I["生成数值前缀日志"] H --> I I --> J["追加 group_sum 与 edge_model 公式"] J --> K["进行模板比较与 PGO 候选排序"] ## 测试用例说明 本地 ATT Generator UT: text GeneratorUT.GenUpdatePerf*: 11/11 passed 本地 att_analyze 日志解析测试: text python3 -m pytest -q autofuse/tools/att_analyze/tests/unit/test_summary_templates.py autofuse/tools/att_analyze/tests/unit/test_log_parser.py 27 passed 新增公式日志兼容性验证: text The value of graph0_result0 is 85205.982063 objective(...) result_performance=85205.982063 ATT LLT(CANN 9.2.0,/workspace/third_party): text att_ut_aggregate: Passed 100% tests passed, 0 tests failed 新增 ATT ST 回归: text CacheGuardRegression.*: 6/6 passed ATT ST 全量入口受既有环境问题影响(缺失 ReduceSplitPenalty 生成可执行文件,以及 GCC 9.4/13.3 gcov 版本不匹配),不归因于本 patch。 NPU 端使用 Ascend950PR_9579(硬件 block_dim=56)和当前源码 host/device 产物,在统一 DSO、独立 TorchInductor/NPU cache 后验证通过: | PGO topn | 首次编译耗时 (ms) | eager (ms) | autofusion (ms) | speedup | 最大误差 | |---|---:|---:|---:|---:|---:| | 1 | 24332.7870 | 0.36129 | 0.33658 | 1.073x | 4.768e-07 | | 10 | 51401.0540 | 0.06997 | 0.06719 | 1.041x | 4.768e-07 | 首次混用旧 CANN 动态库或旧 kernel cache 时曾出现 kernel init failed;清理并隔离运行时后可复现成功,说明该现象是环境/产物版本组合问题。 ## 核对清单 - [x] 代码遵循项目现有风格 - [x] 已完成 ATT UT/LLT 及新增 ST 回归验证 - [x] 已完成 Ascend950PR NPU 基本功能验证 - [x] 已验证最终 objective 日志与现有 att_analyze 解析兼容 - [x] 参数集中管理,未引入与本 patch 无关的源码修改 - [x] 未跟踪用户已有临时文件和示例文件 - [x] 提交信息符合项目规范 ## 其他信息 源分支:fix/att-cache-guard-final;目标分支:develop。 最新提交:f9926331 fix: preserve numeric tiling objective log prefix。 See merge request: cann/graph-autofusion!1960 | 3 天前 | |
【PR】: AF日志易用性整改 Co-authored-by: s00357600sgd<shenguodong1@huawei.com> # message auto-generated for no-merge-commit merge: !1864 merge autofusion_log_daily_develop into develop 【PR】: AF日志易用性整改 Created-by: s003576sgd Commit-by: s00357600sgd Merged-by: cann-robot Description: # Pull Request ## 描述 整改工具扫描的日志中存在的拼写错误、中文、缺少度量单位等低级问题,并排查类似问题统一修改 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [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!1864 | 10 天前 | |
【PR】: [feat] [autofuse] joint debug with ge. Co-authored-by: xingzhixiong<xingzhixiong@huawei.com> # message auto-generated for no-merge-commit merge: !349 merge master_joint_debug_with_ge into master 【PR】: [feat] [autofuse] joint debug with ge. Created-by: xingzhixiong Commit-by: xingzhixiong Merged-by: cann-robot Description: # Pull Request ## 描述 1、修改autofuse后端代码,与ge仓的autofuse前端代码进行联调 2、修复硬编码以及非root用户卸载残留问题 3、适配工程禁用ASCEND_INSTALL_PATH的需求 4、新增cann包安装控制项,用于控制是否安装autofuse后端的编译产物(libaihac_codegen.so/libaihac_ir_register.so/libaihac_ir.so/pyautofuse.so等库) ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [x] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1. graph-autofusion仓编译构建成功,出包验证安装卸载正常 2. 装包后autofuse红线用例验证通过 说明:此pr上库后装graph-autofusion的cann包默认是不会装autofuse产物的,故不会对现有的ge流程有影响,只有显示指定--autofuse安装选项才会安装autofuse产物,后续等ge仓代码要上库时此开关会同步放开。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!349 | 3 个月前 | |
feat: Inductor支持PGO(复用TF流程) Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1541 merge feature/inductor-mspti-pgo-a into develop feat: Inductor支持PGO(复用TF流程) Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 本 PR 使 Inductor 静态 shape 场景的 GenerateTopnSolutions 可在开启 Autofuse PGO 时,复用 TF PGO 的候选生成、全核遍历、solver、完整 tiling data 归一和 MSPTI 实测统计能力,返回实测 TopN。不修改 TorchAir/TorcHair 调用流程和 GenerateTopnSolutions 接口。 PGO 关闭时,Inductor 仍使用原有性能公式 TopN,不启动子进程,不执行全核 PGO 遍历。 ## 一、主要解决的问题 1. Inductor 已默认使用 GenerateTopnSolutions,但原实现只按性能公式排序,--autofuse_enable_pgo=true 不会触发实际采样。 2. TF PGO 已具备 tiling key、核数、多 Group 和 Reduce RCore 多阶段候选实测能力,Inductor 需要复用该能力,不另起一套候选算法。 3. MSPTI Activity 与前端 profiling 可能存在同进程资源冲突,需在独立 runner 子进程内执行采样。 4. PGO sidecar 缺失、损坏、runner 失败或候选无效时,不应导致 Inductor 编译中断,需要保持原 TopN 能力作为回退。 ## 二、修改内容 ### 2.1 候选生成与选解 - PGO 开启时,Inductor 使用 TF PGO 同源的 tiling key/核数遍历、阈值、solver 和 MSPTI 采样逻辑。 - 支持多 Group、Reduce RCore phase1/phase2 多阶段和完整 tiling data 返回。 - 候选归一化、去重和排序时强制保留默认解;实测候选均不优于默认解时,最终保留默认解。 - PGO 关闭时保持原性能公式 TopN 行为。 ### 2.2 独立 PGO runner - host compile 产生 tiling.so、PGO runner 可执行文件、device kernel binary 和 manifest。 - GenerateTopnSolutions 的 proxy 校验 sidecar 协议、ABI、generation 和 SHA256,然后使用 posix_spawn 启动子进程。 - runner 独立初始化 ACL/MSPTI,加载 host tiling 与 device binary,执行 GenerateMeasuredTopnSolutions,通过有界二进制文件返回 TopN。 - 父进程校验返回数量、字段长度和结果完整性,临时结果文件在解析后删除。 ### 2.3 编译产物与回退 - PGO sidecar 按 generation 原子发布,保留当前和上一代。 - manifest 记录 protocol/version/ABI、产物文件名、SHA256 和 MSPTI preload 路径。 - MSPTI 自动从当前 CANN 根目录的 tools/mspti 发现;不需要 AUTOFUSE_MSPTI_PATH,不需要用户手工设置 LD_PRELOAD。proxy 创建 runner 时自动将 libmspti.so 及可用的 libprof_common.so 合入子进程 LD_PRELOAD。 - MSPTI 不可用时跳过 sidecar 生成;sidecar 缺失/损坏、runner 异常或结果解析失败时,按请求数量回退到原性能公式 TopN。 ### 2.4 采集语义对齐 - Inductor 与 TF 一致接收所有 MSPTI_ACTIVITY_KIND_KERNEL 记录。 - 删除 Inductor 专属的 kernel name/type/correlationId/timestamp 过滤,避免合法 Reduce 候选被误判为无采样数据。 - 保留空指针、内存分配、MSPTI 状态、重复时间 key 和预期 record 数的完整性校验。TF legacy callback 不修改。 ## 三、调用流程 mermaid sequenceDiagram participant Frontend as TorchAir/Inductor participant Proxy as tiling.so proxy participant Runner as PGO runner process participant Host as measured tiling host participant Device as PGO device kernel participant MSPTI as MSPTI Activity Frontend->>Proxy: GenerateTopnSolutions(input_configs, topn, res_limit) Proxy->>Proxy: validate manifest, ABI and SHA256 Proxy->>Runner: posix_spawn with automatic LD_PRELOAD Runner->>Runner: aclInit, set device, create stream Runner->>Host: GenerateMeasuredTopnSolutions Host->>Device: launch every measured candidate MSPTI-->>Host: kernel activity duration Host-->>Runner: measured and protected TopN Runner-->>Proxy: bounded binary result Proxy-->>Frontend: tiling data, workspace and block dimensions 任意 sidecar/runner/MSPTI/IPC 基础设施失败,proxy 都转入原性能公式 TopN,不要求前端增加 PGO 分支。 ## 四、使能方式 ### 4.1 环境准备 仅加载当前要验证的 CANN 包,例如: bash source "${CANN_ROOT}/bin/setenv.bash" CANN 包内需包含: text tools/mspti/include/mspti.h tools/mspti/lib64/libmspti.so ### 4.2 开启 Inductor PGO Top3 bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=true" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=3 python <inductor_case.py> TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN 由现有前端流程决定传入 GenerateTopnSolutions 的 TopN,本 PR 不新增前后端接口。 不需要配置: text AUTOFUSE_MSPTI_PATH LD_PRELOAD ### 4.3 关闭 PGO bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=false" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=1 python <inductor_case.py> 关闭后 GenerateTopnSolutions 按原性能公式返回 TopN,不遍历 PGO 全核候选。 ### 4.4 当前支持边界 - 支持 Inductor 静态 shape、非 Cube 融合 kernel。 - 支持多 Group 和 Reduce RCore phase1/phase2 多阶段候选。 - 动态 shape 或 Cube 融合不进入当前 Inductor PGO 路径。 ## 五、维测信息 ### 5.1 关键日志 | 日志 | 含义 | |------|------| | GenerateTopnSolutions enter: topn=... | Inductor TopN 入口及请求数量 | | [PGO] MSPTI is unavailable, skip Inductor PGO sidecars | 当前 CANN 根目录下未找到完整 MSPTI 头文件/动态库 | | GenerateMeasuredTopnSolutions failed | runner 内实测选解失败 | | Inductor PGO failed, fallback to modeled TopN | PGO 基础设施失败,已转入原性能公式 TopN | | Inductor PGO runner or result parsing failed | 子进程退出或 IPC 结果校验失败 | ### 5.2 sidecar 产物 tiling.so 同级目录下生成: text tiling.so tiling.so.pgo.<generation>/ ├── manifest.json ├── tiling.so.pgo_runner └── tiling.so.pgo_kernel.aicore_binary_elf_v1 manifest 可用于检查: - protocol/version/generation - runner_abi/proxy_abi/device_source_abi - runner、kernel 和 tiling.so 的 SHA256 - 子进程自动使用的 MSPTI preload 路径 ### 5.3 建议排查顺序 1. 确认 AUTOFUSE_FLAGS 和前端传入 TopN。 2. 确认当前 CANN 根目录及 tools/mspti 内容,避免混用多套 CANN lib。 3. 检查 sidecar generation 与 manifest SHA256/ABI。 4. 检查 runner 退出码、GenerateMeasuredTopnSolutions 和 MSPTI record 数。 5. 如已回退,确认返回的候选数是否与请求 TopN 一致。 ## 六、文件结构与职责 | 模块 | 文件 | 职责 | |------|------|------| | Inductor TopN | autofuse/codegen/codegen_tiling_inductor_topn.cpp | 生成模型 TopN/实测 TopN、默认解保护及回退入口 | | PGO 共用层 | codegen_tiling_pgo_common.cpp | TF/Inductor 共用 wrapper、MSPTI Activity 采集与重复测量 | | PGO 内存 | codegen_tiling_pgo_memory.cpp | tensor/workspace/launch params 设备内存准备与回收 | | PGO 搜索 | codegen_tiling_pgo_search.cpp | 候选归一、实测结果聚合、核数搜索和排序 | | PGO runtime | codegen_tiling_pgo_runtime.cpp | runner 入口翻译单元组装 | | 父进程 proxy | codegen_tiling_inductor_pgo_proxy.cpp | sidecar/manifest 校验、环境组装、子进程创建、IPC 解析和回退 | | 子进程 runner | codegen_tiling_inductor_pgo_runner.cpp | 参数校验、ACL 初始化、加载 host/device 产物、调用实测入口和结果写回 | | Python compile | autofuse/compiler/python/compile_adapter.py | 拆分 PGO host/runner/device 源码,从当前 CANN 根自动发现 MSPTI | | Python publish | autofuse/compiler/python/ascendc_compile.py | 编译 runner/device binary,生成 manifest,原子发布并清理历史 generation | ## 七、测试与实测结果 ### 7.1 回归 | 范围 | 结果 | |------|------| | PGO 定向 C++ UT | 35/35 PASS | | TestCodegenTiling 定向回归 | 113/113 PASS | | Python compile flow | 106/106 PASS | | ARM PGO UT | 31/31 PASS | | 历史 13 个编译失败用例 | baseline 13/13 PASS,PGO Top3 13/13 PASS | ### 7.2 A5收益实测 环境:Python 3.12.9、torch 2.12.0+cu130、torch_npu 2.12.0。  ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [x] 重构 - [x] 测试相关 - [x] 构建过程或辅助工具变动 - [ ] 文档内容更新 ## 变更统计 - 相对 develop:39 个文件,+5268/-517。 - PR 不包含 docs/ 目录修改。 ## 提交记录 | Commit | 描述 | |--------|------| | 994c971c | 支持 Inductor MSPTI PGO TopN | | 4e698e4a | 修复 Reduce PGO 候选内存大小解析 | | e84c8f6c | 修复 Inductor PGO ST 预期 | | 6ec8156f | 拆分模块并解决代码检查告警 | | d0af8bdc | 修复 compile adapter 导入顺序告警 | | e723220a | 对齐 Inductor 与 TF PGO Activity 采集语义 | ## 核对清单 - [x] 未修改 TorchAir/TorcHair 前后端接口 - [x] PGO 关闭路径保持原性能公式 TopN - [x] TF legacy PGO callback 未修改 - [x] PGO 失败按请求 TopN 回退 - [x] 默认解参与实测并受保护 - [x] 不需要额外 MSPTI 路径或手工 LD_PRELOAD 配置 See merge request: cann/graph-autofusion!1541 | 1 个月前 | |
feat: Inductor支持PGO(复用TF流程) Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1541 merge feature/inductor-mspti-pgo-a into develop feat: Inductor支持PGO(复用TF流程) Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: ## 描述 本 PR 使 Inductor 静态 shape 场景的 GenerateTopnSolutions 可在开启 Autofuse PGO 时,复用 TF PGO 的候选生成、全核遍历、solver、完整 tiling data 归一和 MSPTI 实测统计能力,返回实测 TopN。不修改 TorchAir/TorcHair 调用流程和 GenerateTopnSolutions 接口。 PGO 关闭时,Inductor 仍使用原有性能公式 TopN,不启动子进程,不执行全核 PGO 遍历。 ## 一、主要解决的问题 1. Inductor 已默认使用 GenerateTopnSolutions,但原实现只按性能公式排序,--autofuse_enable_pgo=true 不会触发实际采样。 2. TF PGO 已具备 tiling key、核数、多 Group 和 Reduce RCore 多阶段候选实测能力,Inductor 需要复用该能力,不另起一套候选算法。 3. MSPTI Activity 与前端 profiling 可能存在同进程资源冲突,需在独立 runner 子进程内执行采样。 4. PGO sidecar 缺失、损坏、runner 失败或候选无效时,不应导致 Inductor 编译中断,需要保持原 TopN 能力作为回退。 ## 二、修改内容 ### 2.1 候选生成与选解 - PGO 开启时,Inductor 使用 TF PGO 同源的 tiling key/核数遍历、阈值、solver 和 MSPTI 采样逻辑。 - 支持多 Group、Reduce RCore phase1/phase2 多阶段和完整 tiling data 返回。 - 候选归一化、去重和排序时强制保留默认解;实测候选均不优于默认解时,最终保留默认解。 - PGO 关闭时保持原性能公式 TopN 行为。 ### 2.2 独立 PGO runner - host compile 产生 tiling.so、PGO runner 可执行文件、device kernel binary 和 manifest。 - GenerateTopnSolutions 的 proxy 校验 sidecar 协议、ABI、generation 和 SHA256,然后使用 posix_spawn 启动子进程。 - runner 独立初始化 ACL/MSPTI,加载 host tiling 与 device binary,执行 GenerateMeasuredTopnSolutions,通过有界二进制文件返回 TopN。 - 父进程校验返回数量、字段长度和结果完整性,临时结果文件在解析后删除。 ### 2.3 编译产物与回退 - PGO sidecar 按 generation 原子发布,保留当前和上一代。 - manifest 记录 protocol/version/ABI、产物文件名、SHA256 和 MSPTI preload 路径。 - MSPTI 自动从当前 CANN 根目录的 tools/mspti 发现;不需要 AUTOFUSE_MSPTI_PATH,不需要用户手工设置 LD_PRELOAD。proxy 创建 runner 时自动将 libmspti.so 及可用的 libprof_common.so 合入子进程 LD_PRELOAD。 - MSPTI 不可用时跳过 sidecar 生成;sidecar 缺失/损坏、runner 异常或结果解析失败时,按请求数量回退到原性能公式 TopN。 ### 2.4 采集语义对齐 - Inductor 与 TF 一致接收所有 MSPTI_ACTIVITY_KIND_KERNEL 记录。 - 删除 Inductor 专属的 kernel name/type/correlationId/timestamp 过滤,避免合法 Reduce 候选被误判为无采样数据。 - 保留空指针、内存分配、MSPTI 状态、重复时间 key 和预期 record 数的完整性校验。TF legacy callback 不修改。 ## 三、调用流程 mermaid sequenceDiagram participant Frontend as TorchAir/Inductor participant Proxy as tiling.so proxy participant Runner as PGO runner process participant Host as measured tiling host participant Device as PGO device kernel participant MSPTI as MSPTI Activity Frontend->>Proxy: GenerateTopnSolutions(input_configs, topn, res_limit) Proxy->>Proxy: validate manifest, ABI and SHA256 Proxy->>Runner: posix_spawn with automatic LD_PRELOAD Runner->>Runner: aclInit, set device, create stream Runner->>Host: GenerateMeasuredTopnSolutions Host->>Device: launch every measured candidate MSPTI-->>Host: kernel activity duration Host-->>Runner: measured and protected TopN Runner-->>Proxy: bounded binary result Proxy-->>Frontend: tiling data, workspace and block dimensions 任意 sidecar/runner/MSPTI/IPC 基础设施失败,proxy 都转入原性能公式 TopN,不要求前端增加 PGO 分支。 ## 四、使能方式 ### 4.1 环境准备 仅加载当前要验证的 CANN 包,例如: bash source "${CANN_ROOT}/bin/setenv.bash" CANN 包内需包含: text tools/mspti/include/mspti.h tools/mspti/lib64/libmspti.so ### 4.2 开启 Inductor PGO Top3 bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=true" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=3 python <inductor_case.py> TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN 由现有前端流程决定传入 GenerateTopnSolutions 的 TopN,本 PR 不新增前后端接口。 不需要配置: text AUTOFUSE_MSPTI_PATH LD_PRELOAD ### 4.3 关闭 PGO bash export AUTOFUSE_FLAGS="--autofuse_enable_pgo=false" export TORCHINDUCTOR_NPU_EXT_AUTOTUNE_TOPN=1 python <inductor_case.py> 关闭后 GenerateTopnSolutions 按原性能公式返回 TopN,不遍历 PGO 全核候选。 ### 4.4 当前支持边界 - 支持 Inductor 静态 shape、非 Cube 融合 kernel。 - 支持多 Group 和 Reduce RCore phase1/phase2 多阶段候选。 - 动态 shape 或 Cube 融合不进入当前 Inductor PGO 路径。 ## 五、维测信息 ### 5.1 关键日志 | 日志 | 含义 | |------|------| | GenerateTopnSolutions enter: topn=... | Inductor TopN 入口及请求数量 | | [PGO] MSPTI is unavailable, skip Inductor PGO sidecars | 当前 CANN 根目录下未找到完整 MSPTI 头文件/动态库 | | GenerateMeasuredTopnSolutions failed | runner 内实测选解失败 | | Inductor PGO failed, fallback to modeled TopN | PGO 基础设施失败,已转入原性能公式 TopN | | Inductor PGO runner or result parsing failed | 子进程退出或 IPC 结果校验失败 | ### 5.2 sidecar 产物 tiling.so 同级目录下生成: text tiling.so tiling.so.pgo.<generation>/ ├── manifest.json ├── tiling.so.pgo_runner └── tiling.so.pgo_kernel.aicore_binary_elf_v1 manifest 可用于检查: - protocol/version/generation - runner_abi/proxy_abi/device_source_abi - runner、kernel 和 tiling.so 的 SHA256 - 子进程自动使用的 MSPTI preload 路径 ### 5.3 建议排查顺序 1. 确认 AUTOFUSE_FLAGS 和前端传入 TopN。 2. 确认当前 CANN 根目录及 tools/mspti 内容,避免混用多套 CANN lib。 3. 检查 sidecar generation 与 manifest SHA256/ABI。 4. 检查 runner 退出码、GenerateMeasuredTopnSolutions 和 MSPTI record 数。 5. 如已回退,确认返回的候选数是否与请求 TopN 一致。 ## 六、文件结构与职责 | 模块 | 文件 | 职责 | |------|------|------| | Inductor TopN | autofuse/codegen/codegen_tiling_inductor_topn.cpp | 生成模型 TopN/实测 TopN、默认解保护及回退入口 | | PGO 共用层 | codegen_tiling_pgo_common.cpp | TF/Inductor 共用 wrapper、MSPTI Activity 采集与重复测量 | | PGO 内存 | codegen_tiling_pgo_memory.cpp | tensor/workspace/launch params 设备内存准备与回收 | | PGO 搜索 | codegen_tiling_pgo_search.cpp | 候选归一、实测结果聚合、核数搜索和排序 | | PGO runtime | codegen_tiling_pgo_runtime.cpp | runner 入口翻译单元组装 | | 父进程 proxy | codegen_tiling_inductor_pgo_proxy.cpp | sidecar/manifest 校验、环境组装、子进程创建、IPC 解析和回退 | | 子进程 runner | codegen_tiling_inductor_pgo_runner.cpp | 参数校验、ACL 初始化、加载 host/device 产物、调用实测入口和结果写回 | | Python compile | autofuse/compiler/python/compile_adapter.py | 拆分 PGO host/runner/device 源码,从当前 CANN 根自动发现 MSPTI | | Python publish | autofuse/compiler/python/ascendc_compile.py | 编译 runner/device binary,生成 manifest,原子发布并清理历史 generation | ## 七、测试与实测结果 ### 7.1 回归 | 范围 | 结果 | |------|------| | PGO 定向 C++ UT | 35/35 PASS | | TestCodegenTiling 定向回归 | 113/113 PASS | | Python compile flow | 106/106 PASS | | ARM PGO UT | 31/31 PASS | | 历史 13 个编译失败用例 | baseline 13/13 PASS,PGO Top3 13/13 PASS | ### 7.2 A5收益实测 环境:Python 3.12.9、torch 2.12.0+cu130、torch_npu 2.12.0。  ## 变更类型 - [ ] Bug 修复 - [x] 新功能 - [x] 重构 - [x] 测试相关 - [x] 构建过程或辅助工具变动 - [ ] 文档内容更新 ## 变更统计 - 相对 develop:39 个文件,+5268/-517。 - PR 不包含 docs/ 目录修改。 ## 提交记录 | Commit | 描述 | |--------|------| | 994c971c | 支持 Inductor MSPTI PGO TopN | | 4e698e4a | 修复 Reduce PGO 候选内存大小解析 | | e84c8f6c | 修复 Inductor PGO ST 预期 | | 6ec8156f | 拆分模块并解决代码检查告警 | | d0af8bdc | 修复 compile adapter 导入顺序告警 | | e723220a | 对齐 Inductor 与 TF PGO Activity 采集语义 | ## 核对清单 - [x] 未修改 TorchAir/TorcHair 前后端接口 - [x] PGO 关闭路径保持原性能公式 TopN - [x] TF legacy PGO callback 未修改 - [x] PGO 失败按请求 TopN 回退 - [x] 默认解参与实测并受保护 - [x] 不需要额外 MSPTI 路径或手工 LD_PRELOAD 配置 See merge request: cann/graph-autofusion!1541 | 1 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 天前 | ||
| 4 个月前 | ||
| 1 天前 | ||
| 3 天前 | ||
| 10 天前 | ||
| 3 个月前 | ||
| 1 个月前 | ||
| 1 个月前 |