| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
【fix】: PowScalar性能问题优化 Co-authored-by: 李玥玮<liyuewei1@huawei.com> # message auto-generated for no-merge-commit merge: !1795 merge 0_local into develop 【fix】: PowScalar性能问题优化 Created-by: liyuewei Commit-by: 李玥玮 Merged-by: cann-robot Description: # Pull Request ## 描述 PowScalar性能问题优化。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的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!1795 | 1 天前 | |
【质量加固】style: add const qualifiers in ascendc graph dumper Co-authored-by: mclll<2326512839@qq.com> # message auto-generated for no-merge-commit merge: !1810 merge codex/quality-hardening-ascendc-dumper into develop 【质量加固】style: add const qualifiers in ascendc graph dumper Created-by: mclll Commit-by: mclll Merged-by: cann-robot Description: # Pull Request ## 描述 本 PR 按 #238 质量加固要求,在 autofuse/ascir/meta/ascendc_graph_txt_dumper.cpp 中为 10 个初始化后不再修改的局部变量添加 const 修饰,减少误修改风险。 ## 变更类型 - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [x] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue #238 ## 如何测试 1. 本地执行 git diff --check,通过。 2. 通过网页复制提交后的源码,确认 10 处 const 修改均已生效。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于 commit message 的格式。 See merge request: cann/graph-autofusion!1810 | 1 天前 | |
fix: 修复 ATT 注册表并删除历史 pass Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1821 merge fix/att-registry-thread-safety into develop fix: 修复 ATT 注册表并删除历史 pass Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 描述 ### 一、主要解决的问题 1. ATT 性能函数注册表 EvalCosts 使用 unordered_map 保存 ASCIR/AscendC 函数。注册、查找和遍历操作缺少统一同步保护,存在并发读写及静态初始化阶段访问风险。 2. ApiPerfFactory 的全局注册点过早解析性能函数,可能在注册表尚未完成初始化时访问。 3. 历史 ATTPassMgr/pass_mgr.h/matmul_align_pass 已不在当前产品 CV 融合路径使用,相关实现和测试继续保留会增加维护与构建负担。 ### 二、修改方案 - 在 EvalCosts 内增加 std::mutex,统一保护 ASCIR/AscendC 注册表的注册、查找和列表遍历。 - ApiPerfFactory 查找时在锁内复制 creator,释放锁后创建对象,避免锁内执行创建逻辑。 - 全局注册点延迟保存和解析性能函数 key,规避静态初始化顺序问题。 - 保留 v1/v35 特殊 key 映射,包括 kUnitVector、select/where、true_div/div 和 V2 key。 - 删除历史 ATTPassMgr/pass_mgr.h/matmul_align_pass 实现,以及对应 ST/UT 测试和 ModelInfo 过时代码路径。 - 按 clang-format 18.1.8 规范化 ATT 注册相关源文件,修复 codecheck_precommit 检查失败。 ### 三、代码修改流程图 mermaid sequenceDiagram participant Register as 注册阶段 participant Registry as EvalCosts 注册表 participant Factory as ApiPerfFactory participant Worker as 线程执行阶段 Register->>Registry: 加锁写入 ASCIR/AscendC creator Worker->>Factory: 请求创建性能对象 Factory->>Registry: 加锁查找并复制 creator Registry-->>Factory: 返回 creator Factory-->>Worker: 解锁后创建对象 ## 变更类型 - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新 - [x] 重构 - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue - #283(fix: 修复 ATT 性能函数注册表并发安全并清理历史 pass) ## 如何测试 ### 一、测试用例说明 #### 1.1 单元测试 - ATT UT:1062/1062 通过。 - pre-commit:clang-format、pre-commit-hooks、codespell、OAT 全部通过。 #### 1.2 系统测试 - ATT ST:110/110 通过。 - ASCEND_HOME_PATH=$HOME/Ascend/cann cmake --build build --target aihac_codegen -j 8:通过。 - git diff --check upstream/develop...HEAD:通过。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签 - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 ### 验证方法 - 基线分支:upstream/develop。 - 远端流水线 1077921 使用 HEAD 35f01f80ba72 执行成功,并生成 ci-pipeline-passed 标签。 ### 注意事项 - 本 PR 不包含 docs 提交。 - 当前 CV 融合路径不使用历史 ATT matmul pass,删除范围仅覆盖确认无产品消费者的实现和测试。 ### 提交记录 | Commit | 描述 | 修改文件数 | 修改行数 | |--------|------|-----------:|-----------:| | 9d220d5c | 保护 ATT 性能注册表 | 1 | +10/-8 | | 3aee26c7 | 延迟 ATT 性能函数查找 | 4 | +243/-219 | | a9f9b37e | 删除历史 ATT pass manager | 5 | +0/-307 | | 83010056 | 保留最新 ATT 注册映射 | 1 | +1/-3 | | 35f01f80 | 修复 ATT 文件格式 | 2 | +267/-298 | ### 修改文件清单 | 文件路径 | 修改类型 | 说明 | |---------|---------|------| | autofuse/att/gen_model_info/api_perf_register/api_perf_factory.cpp | 修改 | creator 查找与对象创建同步策略 | | autofuse/att/gen_model_info/api_perf_register/api_perf_factory.h | 修改 | 注册工厂接口与延迟解析支持 | | autofuse/att/gen_model_info/api_perf_register/ascendc_api_perf.h | 修改 | EvalCosts 互斥保护 | | autofuse/att/gen_model_info/api_perf_register/v1/ascir_api_perf_v1.cpp | 修改 | v1 注册映射和格式化 | | autofuse/v35/att/api_perf_register/ascir_api_perf_v2.cpp | 修改 | v35/V2 注册映射和格式化 | | autofuse/att/gen_model_info/gen_model_info.cpp | 修改 | 移除历史 pass 使用链路 | | autofuse/att/gen_model_info/pass/pass_mgr.h | 删除 | 历史 pass manager | | autofuse/att/gen_model_info/pass/matmul_align_pass.cpp | 删除 | 历史 matmul pass | | autofuse/tests/ut/att/testcase/gen_model_info/pass/test_matmul_align_pass.cpp | 删除 | 对应 UT | | autofuse/tests/st/att/testcase/source_mirror/gen_model_info_content/test_att_config.cpp | 删除 | 对应 ST 配置镜像 | See merge request: cann/graph-autofusion!1821 | 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 | 2 个月前 | |
feat(autofuse): support effective-view NDDMA models Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1792 merge fix/frontend-shape-abi-sync into develop feat(autofuse): support effective-view NDDMA models Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 主要解决的问题 本 PR 将 ATT 的 NDDMA 描述和性能模型对齐到 codegen 实际发出的 DataCopy NDDMA 参数,并补齐 effective rank 1~5 的统一建模。 | 问题 | 原有行为 | 风险/影响 | 本 PR 目标 | |---|---|---|---| | 描述口径不一致 | ATT 使用 raw view,codegen 在发出 API 前还会忽略双零 stride 轴、合并连续轴并应用 tail actual size | ATT 可能按错误 rank、dim 或 stride 选模 | NddmaDescriptorInfo 固定表示 codegen-equivalent effective view | | 模型维度不完整 | 新模型只覆盖 1D | 2D~5D 只能进入 legacy 路径 | effective rank 1 使用 1D 模型,2~5 使用统一任意维模型 | | 合轴规则重复 | ATT 与 codegen 各自判断零 stride 和连续轴 | 两侧规则容易随迭代漂移 | 仅抽取两个无状态判定 helper,保留 CalculateDmaParams 原状态机和变量 | | dtype 口径不完整 | 维度/stride 以元素为单位,公式需要字节量 | B8/B16/B32/B64 预测可能量纲错误 | 总数据量和输入 stride 修正统一乘 dtype_size | | fallback 难定位 | 选模失败缺少稳定、统一的上下文 | 设备侧难区分 rank、dtype、schema 等原因 | DEBUG 日志输出模型、raw/effective rank 和 fallback reason | 同时修复远端 ST_Test_autofuse_ascendc_api 暴露的 Broadcast/IndirectLoad 图改写一致性问题,并将 EvaluateNddmaModel 拆分到单函数 50 行以内;这些修复不改变 NDDMA 公式和 codegen 搬运行为。 ## 修改方案 ### 1. effective view 与 codegen 对齐 NddmaDescriptorInfo 只保存最终用于建模的 effective view: | 字段 | 含义 | 单位/顺序 | |---|---|---| | output_dims | 合轴并应用 full/tail actual repeat 后的搬运维度 | 元素,外轴 → 内轴 | | input_strides | effective GM stride | 元素,外轴 → 内轴 | | output_strides | effective UB vectorized stride | 元素,外轴 → 内轴 | | vectorized_axis | 每个 effective 维度对应的代表轴 | 与上述向量一一对应 | 为了控制 codegen review 风险,CalculateDmaParams 的遍历方向、状态变量、合并顺序和 SetDataCopyParams 调用均保留,仅将以下已有判断抽到 common_utils 供 ATT/codegen 共用: - ShouldIgnoreDataCopyZeroAxis:双零 stride 轴忽略条件; - IsDataCopyAxisContinuous:GM/UB 两侧连续轴合并条件。 tile-inner 边界仍由调用侧已有元数据提供,不新增 descriptor 字段或新的中间实体。 ### 2. 支持 effective rank 1~5 | effective rank | 模型 | 行为 | |---:|---|---| | 1 | NDDMA_1D_MULTICORE_V2 | 使用统一公式的单层形式 | | 2~5 | NDDMA_ND_MULTICORE_V1 | 对每个 effective 层级累加 residual | | >5 | legacy GetDmaPerf | 保留现有 outer-loop fallback | | 非法 dtype/schema/stride/cycles | legacy GetDmaPerf | 输出稳定 fallback reason,不写入无效表达式 | 统一公式按 effective rank D 计算: text B = dtype_size × Π(d_j) B_j = dtype_size × Π(d_m), m=j...D-1 s_j = min(îs_j × dtype_size, 128) g_j = min(1, ôs_j - 1) N_j = NG_j + NGU_j (block_dim <= 2) (NG_j + NGU_j) × rho_j (block_dim > 2) cycles = N_base + Σ N_j, j=0...D-1 其中 îs_j/ôs_j 由当前层 stride 与更内层覆盖范围的差值计算;动态 dim/stride 保留符号表达式。BuildNddma1DResidual 的名字表示“单个层级的 residual”,多维模型逐层调用同一公式,不是把完整 1D 模型重复叠加;N_base 只计算一次。 ### 3. 校验、日志与 fallback | 检查点 | 处理 | |---|---| | ATT data_type_size 与 dtype 映射不一致 | kDtypeUnsupported fallback | | effective rank 不在 1~5 | kRankUnsupported fallback | | dim/stride/schema 非法 | 对应稳定 reason fallback | | 静态公式得到非正 cycles | kSchemaMismatch fallback | | CV-Fusion descriptor 与默认 codegen 语义不同 | 保持 legacy 路径 | 新增两类关键 DEBUG 日志用于两侧 golden 对照: - codegen:raw/effective rank、repeats、GM/UB strides、vectorized axis; - ATT:selected/fallback、模型名、raw/effective rank、reason。 ### 4. 远端 ST 与代码告警修复 | 位置 | 修改 | 原因 | |---|---|---| | broadcast_backward_pass.cpp | Broadcast 后移时同步 compute_node->attr.sched.axis | tensor axis 已更新但 node schedule axis 未同步,后续 zero-stride 轴识别失败 | | indirect_load_schedule_case_generator.cpp | Broadcast path 折叠后再次复用 RewriteInputPreNodes | Load -> Abs -> Broadcast -> IndirectLoad 折叠后重新暴露 Abs,需要再次搬移 | | nddma_model.cpp | 抽取 BuildNddmaCoreCycles 等已有逻辑 | EvaluateNddmaModel 由 67 NBNC 行降至 44 行,计算顺序与公式不变 | | optimize_st.cpp | 接受语义等价的 scalar broadcast chain | 避免对等价节点名称作不必要的唯一性假设 | ## 代码修改流程图 ### effective descriptor 构造 mermaid flowchart LR A[raw repeats / GM strides / UB strides] --> B[从内轴向外轴遍历] B --> C{双零 stride 轴可忽略?} C -->|是| B C -->|否| D{GM 与 UB 均连续<br/>且未跨 tile-inner?} D -->|是| E[合并到当前 effective 维] D -->|否| F[新建 effective 维] E --> B F --> B B -->|结束| G[反转为外轴到内轴] G --> H[ATT 替换 full/tail actual repeat] H --> I[NddmaDescriptorInfo effective view] ### 模型选择与 fallback mermaid flowchart TD A[NDDMA NodeInfo + effective descriptor] --> B{CV-Fusion / dtype / schema 合法?} B -->|否| L[记录 fallback reason] B -->|是| C{effective rank} C -->|1| D[NDDMA_1D_MULTICORE_V2] C -->|2~5| E[NDDMA_ND_MULTICORE_V1] C -->|大于 5| L D --> F[计算一次 N_base] E --> F F --> G[逐 effective 层构造 residual] G --> H{静态 cycles > 0?} H -->|是或动态| I[写入 AIV_MTE2] H -->|否| L L --> M[沿用 legacy GetDmaPerf] ### Broadcast/IndirectLoad 修复链路 mermaid sequenceDiagram participant P as RewriteInputPreNodes participant B as RewriteBroadcastPaths participant C as CollectRewrittenRegion P->>B: 先搬移当前可见前驱 B->>B: 折叠 Broadcast path B->>P: 再搬移新暴露的前驱 P->>C: 在最终图上收集边界和 region ## 测试用例说明 ### 1. 功能与回归验证 主要构建命令: bash cmake --build build --target \ att_ut optimize_ut \ indirect_load_broadcast_axis_simt_test_codegen_v2 \ -j 8 | 验证项 | 结果 | 覆盖内容 | |---|---:|---| | NDDMA 专项 UT | **32/32 PASS** | 1D~5D、dtype、动态表达式、tail/tile-inner、非法输入与 fallback | | Optimize 全量 UT | **636 PASS / 48 SKIP / 0 FAIL** | Broadcast、IndirectLoad 及既有 optimize 回归 | | IndirectLoad codegen 矩阵 | **53/53 PASS** | Broadcast axis、SIMT 与路径改写组合 | | 目标 AscendC ST | **1/1 PASS** | indirect_load_broadcast_axis_simt_test_codegen_v2 | | Round7 analyzer UT | **12/12 PASS**(含 6 个 subtests) | 4D/5D 配置解析、参数合并与结果分析 | | Round7 配置 dry-run | **14,313/14,313 校验通过** | 4D/5D、5 种 layout 组、4 种 dtype | | CANN 9.2 package | **构建及 run 包 --check PASS** | 打包交付链路 | | 静态检查 | **PASS** | git diff --check、clang-format、pre-commit、OAT | | PR 远端 compile | **success** | Pipeline #1067944,SHA e488e759671b | ### 2. BBIT 数值、模型证据与 task duration 环境:同一 CANN 9.2 环境,warmup=2、repeat=5。speedup = baseline_median / candidate_median,大于 1 表示 candidate 更快。 | Case | Baseline median (us) | Candidate median (us) | Speedup | 数值结果 | |---|---:|---:|---:|---| | NC018 | 495.935 | 485.037 | **1.022** | baseline/candidate PASS | | NC019 | 7400.639 | 7431.755 | **0.996** | baseline/candidate PASS | | NC020 | 2966.773 | 3022.778 | **0.981** | baseline/candidate PASS | | P0-RD-01 | 548.954 | 576.085 | **0.953** | baseline/candidate PASS | | P0-RD-02 | 793.541 | 789.034 | **1.006** | baseline/candidate PASS | | P0-RD-03 | 471.708 | 465.699 | **1.013** | baseline/candidate PASS | 验证结果: - 6/6 case 均有正的 profiler task duration,baseline/candidate 数值均 PASS; - baseline/candidate 各捕获 66 行 AIV_MTE2,candidate 捕获 30 行 NDDMA selected/model 日志; - compare_nddma_packages 在 min_speedup=0.9 下 PASS,无 regression 记录; - 严格 speedup >= 1.0 未全部满足,NC019、NC020、P0-RD-01 属于实测回退,本 PR 不修改参数掩盖该结果。 模型选择日志包含以下代表性路径: | Case/节点形态 | raw rank | effective rank | 选择结果 | |---|---:|---:|---| | NC018 transpose/load | 2 | 2 | NDDMA_ND_MULTICORE_V1 | | NC020 slice/load 合轴路径 | 2 | 1 | NDDMA_1D_MULTICORE_V2 | | P0-RD-02 多轴 reduce/load | 3 | 3 | NDDMA_ND_MULTICORE_V1 | ### 3. 5D/6D 泛化 BBIT | Case | Baseline median (us) | Candidate median (us) | Speedup | 数值结果 | |---|---:|---:|---:|---| | NDDMA-5D | 324.156 | 319.084 | **1.016** | PASS | | NDDMA-6D | 436.204 | 279.495 | **1.561** | PASS | 5D/6D 正式设备用例证明数值和 task-duration 链路有效;该次正式 package 日志没有 AIV_MTE2/model/effective-rank 字段,因此不将它作为 rank 选择或预测误差通过的证据。 ### 4. 构造/编译耗时 六个正式 case 的 comparison.json 已记录 compile time。按 baseline / candidate 统计: | 指标 | 结果 | |---|---:| | 最小比值 | 0.934 | | 中位比值 | 0.990 | | 最大比值 | 1.051 | | 算术平均 | 0.987 | 当前数据未显示数量级回退,但这不是隔离 BuildNddmaDescriptor/EvaluateNddmaModel 的微基准;独立构造耗时 benchmark 仍保留为未完成验收项。 ### 5. Round7 预测误差 完整设备采集共 14,313 条 4D/5D 配置。以下是**不修改模型参数**、仅按 codegen effective-view 口径离线重算的结果: | 数据组 | MAPE | |---|---:| | 总体 | **188.78%** | | continuous | **23.87%** | | transpose_dim1_dim4 | **342.56%** | | transpose_dim1_dim5 | **344.60%** | 该结果说明 effective-view 对齐改善了描述一致性,但预测误差仍未达到设计目标(continuous 仍高于 10%,两个 transpose 组误差约为实测时延的 3.4 倍)。本 PR 不调整公式参数,不能将“采集完成”表述为“预测精度验收通过”。 ### 6.Slice/Split泛化用例测试 | 指标 | 原始 | v1(小尾轴) | v2(尾轴对齐) | v3(关闭打分) | **v4(Nddma+关闭打分)** | |---|---|---|---|---|---| | Pass数 | 38 | 40 | 54 | 102 | **135** | | 净增Pass | - | +2 | +16 | +64 | **+97** | | Fail→Pass | - | ~2 | ~46 | 71 | **100** | | Pass→Fail | - | ~0 | ~30 | 7 | **3** | | 迭代加速比中位数 | 0.961 | 1.060 | 1.087 | 0.992 | **0.993** | | 加速比<1用例数 | 113 | 59 | 43 | 72 | **87** | v4(Nddma(建模优化)相比v3新增34个Fail→Pass,主要集中在: - **SliceSingleGraph系列**(26个):GESlice和GEStrideSlice的小算子场景,Nddma建模优化使模板选择更准确 - **SliceSplitToElemwise系列**(6个):GEIsFinite、GENeg、GEBitwiseAnd等,算子加速比1.47~1.72 - **SelectPostFuseGraph**(1个):ratio=1.05 ### 7.ATT.泛化用例 整体性能略有劣化: | 指标 | Round1 (默认cann) | Round2 (nddma_nd fix) | 差异 | |------|-------------------|-----------------------|------| | 统计用例数 | 128 | 128 | - | | 平均加速比 | 1.9288x | 1.8945x | -0.0343x | | 加速比提升的用例 | - | - | 54 | | 加速比下降的用例 | - | - | 74 | 劣化主要原因是下面3个用例,待进一步分析原因。 | 用例名 | R1 ratio | R2 ratio | delta | |--------|----------|----------|-------| | tc_af_tf_generalization_att_0086 | 3.6214 | 1.1535 | -2.4679 | | tc_af_tf_generalization_att_0003 | 2.1284 | 1.1911 | -0.9373 | | tc_af_tf_generalization_att_0023 | 2.4499 | 1.8956 | -0.5542 | 3个用例劣化较为明显,根因分析: | 用例 | 算子 | 切换的模板 | 变化原因 | AIV_MTE2 变化 | 估值方向 | 实际影响 | |------|------|-----------|----------|--------------|---------|----------| | att_0086 | Relu_Transpose | result0_g0: case1→case0 | case1 MTE2 **膨胀 +756%** | 6755→57917 | 过高估值使case1被弃 | af 5.95→18.48us | | att_0003 | ReduceMax_BroadcastTo_Add | result0_g0: case0→case1 | case1 MTE2 **下降 -53.4%** | 9144→4257 | 过低估值使case1被选 | af 2.77→5.05us | | att_0023 | Mul_ClipByValue_ReduceSum | result0_g0: case0→case1 | case1 MTE2 **下降 -51.6%** | 8988→4353 | 过低估值使case1被选 | af 3.66→4.74us | 其中att_0086模板切换的原因: transpose双切分的场景,新建模对nddma估值偏大 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 本次为内部行为调整,无需修改用户文档 - [x] 我在标题中使用了合适的类型标签(fix:) - [x] 我已经详细阅读并遵守 CONTRIBUTING.md ## 其他信息 - PR 目标分支为 cann/graph-autofusion:develop,当前 HEAD 为 e488e759671b。 - 未修改 NDDMA 模型参数或校准系数;性能与误差未通过项已明确保留。 - effective rank >5、CV-Fusion 和非法输入继续复用既有 legacy 路径。 - 工作区中的未跟踪 docs 和测试产物未纳入提交。 See merge request: cann/graph-autofusion!1792 | 1 天前 | |
feat(autofuse): support effective-view NDDMA models Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1792 merge fix/frontend-shape-abi-sync into develop feat(autofuse): support effective-view NDDMA models Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 主要解决的问题 本 PR 将 ATT 的 NDDMA 描述和性能模型对齐到 codegen 实际发出的 DataCopy NDDMA 参数,并补齐 effective rank 1~5 的统一建模。 | 问题 | 原有行为 | 风险/影响 | 本 PR 目标 | |---|---|---|---| | 描述口径不一致 | ATT 使用 raw view,codegen 在发出 API 前还会忽略双零 stride 轴、合并连续轴并应用 tail actual size | ATT 可能按错误 rank、dim 或 stride 选模 | NddmaDescriptorInfo 固定表示 codegen-equivalent effective view | | 模型维度不完整 | 新模型只覆盖 1D | 2D~5D 只能进入 legacy 路径 | effective rank 1 使用 1D 模型,2~5 使用统一任意维模型 | | 合轴规则重复 | ATT 与 codegen 各自判断零 stride 和连续轴 | 两侧规则容易随迭代漂移 | 仅抽取两个无状态判定 helper,保留 CalculateDmaParams 原状态机和变量 | | dtype 口径不完整 | 维度/stride 以元素为单位,公式需要字节量 | B8/B16/B32/B64 预测可能量纲错误 | 总数据量和输入 stride 修正统一乘 dtype_size | | fallback 难定位 | 选模失败缺少稳定、统一的上下文 | 设备侧难区分 rank、dtype、schema 等原因 | DEBUG 日志输出模型、raw/effective rank 和 fallback reason | 同时修复远端 ST_Test_autofuse_ascendc_api 暴露的 Broadcast/IndirectLoad 图改写一致性问题,并将 EvaluateNddmaModel 拆分到单函数 50 行以内;这些修复不改变 NDDMA 公式和 codegen 搬运行为。 ## 修改方案 ### 1. effective view 与 codegen 对齐 NddmaDescriptorInfo 只保存最终用于建模的 effective view: | 字段 | 含义 | 单位/顺序 | |---|---|---| | output_dims | 合轴并应用 full/tail actual repeat 后的搬运维度 | 元素,外轴 → 内轴 | | input_strides | effective GM stride | 元素,外轴 → 内轴 | | output_strides | effective UB vectorized stride | 元素,外轴 → 内轴 | | vectorized_axis | 每个 effective 维度对应的代表轴 | 与上述向量一一对应 | 为了控制 codegen review 风险,CalculateDmaParams 的遍历方向、状态变量、合并顺序和 SetDataCopyParams 调用均保留,仅将以下已有判断抽到 common_utils 供 ATT/codegen 共用: - ShouldIgnoreDataCopyZeroAxis:双零 stride 轴忽略条件; - IsDataCopyAxisContinuous:GM/UB 两侧连续轴合并条件。 tile-inner 边界仍由调用侧已有元数据提供,不新增 descriptor 字段或新的中间实体。 ### 2. 支持 effective rank 1~5 | effective rank | 模型 | 行为 | |---:|---|---| | 1 | NDDMA_1D_MULTICORE_V2 | 使用统一公式的单层形式 | | 2~5 | NDDMA_ND_MULTICORE_V1 | 对每个 effective 层级累加 residual | | >5 | legacy GetDmaPerf | 保留现有 outer-loop fallback | | 非法 dtype/schema/stride/cycles | legacy GetDmaPerf | 输出稳定 fallback reason,不写入无效表达式 | 统一公式按 effective rank D 计算: text B = dtype_size × Π(d_j) B_j = dtype_size × Π(d_m), m=j...D-1 s_j = min(îs_j × dtype_size, 128) g_j = min(1, ôs_j - 1) N_j = NG_j + NGU_j (block_dim <= 2) (NG_j + NGU_j) × rho_j (block_dim > 2) cycles = N_base + Σ N_j, j=0...D-1 其中 îs_j/ôs_j 由当前层 stride 与更内层覆盖范围的差值计算;动态 dim/stride 保留符号表达式。BuildNddma1DResidual 的名字表示“单个层级的 residual”,多维模型逐层调用同一公式,不是把完整 1D 模型重复叠加;N_base 只计算一次。 ### 3. 校验、日志与 fallback | 检查点 | 处理 | |---|---| | ATT data_type_size 与 dtype 映射不一致 | kDtypeUnsupported fallback | | effective rank 不在 1~5 | kRankUnsupported fallback | | dim/stride/schema 非法 | 对应稳定 reason fallback | | 静态公式得到非正 cycles | kSchemaMismatch fallback | | CV-Fusion descriptor 与默认 codegen 语义不同 | 保持 legacy 路径 | 新增两类关键 DEBUG 日志用于两侧 golden 对照: - codegen:raw/effective rank、repeats、GM/UB strides、vectorized axis; - ATT:selected/fallback、模型名、raw/effective rank、reason。 ### 4. 远端 ST 与代码告警修复 | 位置 | 修改 | 原因 | |---|---|---| | broadcast_backward_pass.cpp | Broadcast 后移时同步 compute_node->attr.sched.axis | tensor axis 已更新但 node schedule axis 未同步,后续 zero-stride 轴识别失败 | | indirect_load_schedule_case_generator.cpp | Broadcast path 折叠后再次复用 RewriteInputPreNodes | Load -> Abs -> Broadcast -> IndirectLoad 折叠后重新暴露 Abs,需要再次搬移 | | nddma_model.cpp | 抽取 BuildNddmaCoreCycles 等已有逻辑 | EvaluateNddmaModel 由 67 NBNC 行降至 44 行,计算顺序与公式不变 | | optimize_st.cpp | 接受语义等价的 scalar broadcast chain | 避免对等价节点名称作不必要的唯一性假设 | ## 代码修改流程图 ### effective descriptor 构造 mermaid flowchart LR A[raw repeats / GM strides / UB strides] --> B[从内轴向外轴遍历] B --> C{双零 stride 轴可忽略?} C -->|是| B C -->|否| D{GM 与 UB 均连续<br/>且未跨 tile-inner?} D -->|是| E[合并到当前 effective 维] D -->|否| F[新建 effective 维] E --> B F --> B B -->|结束| G[反转为外轴到内轴] G --> H[ATT 替换 full/tail actual repeat] H --> I[NddmaDescriptorInfo effective view] ### 模型选择与 fallback mermaid flowchart TD A[NDDMA NodeInfo + effective descriptor] --> B{CV-Fusion / dtype / schema 合法?} B -->|否| L[记录 fallback reason] B -->|是| C{effective rank} C -->|1| D[NDDMA_1D_MULTICORE_V2] C -->|2~5| E[NDDMA_ND_MULTICORE_V1] C -->|大于 5| L D --> F[计算一次 N_base] E --> F F --> G[逐 effective 层构造 residual] G --> H{静态 cycles > 0?} H -->|是或动态| I[写入 AIV_MTE2] H -->|否| L L --> M[沿用 legacy GetDmaPerf] ### Broadcast/IndirectLoad 修复链路 mermaid sequenceDiagram participant P as RewriteInputPreNodes participant B as RewriteBroadcastPaths participant C as CollectRewrittenRegion P->>B: 先搬移当前可见前驱 B->>B: 折叠 Broadcast path B->>P: 再搬移新暴露的前驱 P->>C: 在最终图上收集边界和 region ## 测试用例说明 ### 1. 功能与回归验证 主要构建命令: bash cmake --build build --target \ att_ut optimize_ut \ indirect_load_broadcast_axis_simt_test_codegen_v2 \ -j 8 | 验证项 | 结果 | 覆盖内容 | |---|---:|---| | NDDMA 专项 UT | **32/32 PASS** | 1D~5D、dtype、动态表达式、tail/tile-inner、非法输入与 fallback | | Optimize 全量 UT | **636 PASS / 48 SKIP / 0 FAIL** | Broadcast、IndirectLoad 及既有 optimize 回归 | | IndirectLoad codegen 矩阵 | **53/53 PASS** | Broadcast axis、SIMT 与路径改写组合 | | 目标 AscendC ST | **1/1 PASS** | indirect_load_broadcast_axis_simt_test_codegen_v2 | | Round7 analyzer UT | **12/12 PASS**(含 6 个 subtests) | 4D/5D 配置解析、参数合并与结果分析 | | Round7 配置 dry-run | **14,313/14,313 校验通过** | 4D/5D、5 种 layout 组、4 种 dtype | | CANN 9.2 package | **构建及 run 包 --check PASS** | 打包交付链路 | | 静态检查 | **PASS** | git diff --check、clang-format、pre-commit、OAT | | PR 远端 compile | **success** | Pipeline #1067944,SHA e488e759671b | ### 2. BBIT 数值、模型证据与 task duration 环境:同一 CANN 9.2 环境,warmup=2、repeat=5。speedup = baseline_median / candidate_median,大于 1 表示 candidate 更快。 | Case | Baseline median (us) | Candidate median (us) | Speedup | 数值结果 | |---|---:|---:|---:|---| | NC018 | 495.935 | 485.037 | **1.022** | baseline/candidate PASS | | NC019 | 7400.639 | 7431.755 | **0.996** | baseline/candidate PASS | | NC020 | 2966.773 | 3022.778 | **0.981** | baseline/candidate PASS | | P0-RD-01 | 548.954 | 576.085 | **0.953** | baseline/candidate PASS | | P0-RD-02 | 793.541 | 789.034 | **1.006** | baseline/candidate PASS | | P0-RD-03 | 471.708 | 465.699 | **1.013** | baseline/candidate PASS | 验证结果: - 6/6 case 均有正的 profiler task duration,baseline/candidate 数值均 PASS; - baseline/candidate 各捕获 66 行 AIV_MTE2,candidate 捕获 30 行 NDDMA selected/model 日志; - compare_nddma_packages 在 min_speedup=0.9 下 PASS,无 regression 记录; - 严格 speedup >= 1.0 未全部满足,NC019、NC020、P0-RD-01 属于实测回退,本 PR 不修改参数掩盖该结果。 模型选择日志包含以下代表性路径: | Case/节点形态 | raw rank | effective rank | 选择结果 | |---|---:|---:|---| | NC018 transpose/load | 2 | 2 | NDDMA_ND_MULTICORE_V1 | | NC020 slice/load 合轴路径 | 2 | 1 | NDDMA_1D_MULTICORE_V2 | | P0-RD-02 多轴 reduce/load | 3 | 3 | NDDMA_ND_MULTICORE_V1 | ### 3. 5D/6D 泛化 BBIT | Case | Baseline median (us) | Candidate median (us) | Speedup | 数值结果 | |---|---:|---:|---:|---| | NDDMA-5D | 324.156 | 319.084 | **1.016** | PASS | | NDDMA-6D | 436.204 | 279.495 | **1.561** | PASS | 5D/6D 正式设备用例证明数值和 task-duration 链路有效;该次正式 package 日志没有 AIV_MTE2/model/effective-rank 字段,因此不将它作为 rank 选择或预测误差通过的证据。 ### 4. 构造/编译耗时 六个正式 case 的 comparison.json 已记录 compile time。按 baseline / candidate 统计: | 指标 | 结果 | |---|---:| | 最小比值 | 0.934 | | 中位比值 | 0.990 | | 最大比值 | 1.051 | | 算术平均 | 0.987 | 当前数据未显示数量级回退,但这不是隔离 BuildNddmaDescriptor/EvaluateNddmaModel 的微基准;独立构造耗时 benchmark 仍保留为未完成验收项。 ### 5. Round7 预测误差 完整设备采集共 14,313 条 4D/5D 配置。以下是**不修改模型参数**、仅按 codegen effective-view 口径离线重算的结果: | 数据组 | MAPE | |---|---:| | 总体 | **188.78%** | | continuous | **23.87%** | | transpose_dim1_dim4 | **342.56%** | | transpose_dim1_dim5 | **344.60%** | 该结果说明 effective-view 对齐改善了描述一致性,但预测误差仍未达到设计目标(continuous 仍高于 10%,两个 transpose 组误差约为实测时延的 3.4 倍)。本 PR 不调整公式参数,不能将“采集完成”表述为“预测精度验收通过”。 ### 6.Slice/Split泛化用例测试 | 指标 | 原始 | v1(小尾轴) | v2(尾轴对齐) | v3(关闭打分) | **v4(Nddma+关闭打分)** | |---|---|---|---|---|---| | Pass数 | 38 | 40 | 54 | 102 | **135** | | 净增Pass | - | +2 | +16 | +64 | **+97** | | Fail→Pass | - | ~2 | ~46 | 71 | **100** | | Pass→Fail | - | ~0 | ~30 | 7 | **3** | | 迭代加速比中位数 | 0.961 | 1.060 | 1.087 | 0.992 | **0.993** | | 加速比<1用例数 | 113 | 59 | 43 | 72 | **87** | v4(Nddma(建模优化)相比v3新增34个Fail→Pass,主要集中在: - **SliceSingleGraph系列**(26个):GESlice和GEStrideSlice的小算子场景,Nddma建模优化使模板选择更准确 - **SliceSplitToElemwise系列**(6个):GEIsFinite、GENeg、GEBitwiseAnd等,算子加速比1.47~1.72 - **SelectPostFuseGraph**(1个):ratio=1.05 ### 7.ATT.泛化用例 整体性能略有劣化: | 指标 | Round1 (默认cann) | Round2 (nddma_nd fix) | 差异 | |------|-------------------|-----------------------|------| | 统计用例数 | 128 | 128 | - | | 平均加速比 | 1.9288x | 1.8945x | -0.0343x | | 加速比提升的用例 | - | - | 54 | | 加速比下降的用例 | - | - | 74 | 劣化主要原因是下面3个用例,待进一步分析原因。 | 用例名 | R1 ratio | R2 ratio | delta | |--------|----------|----------|-------| | tc_af_tf_generalization_att_0086 | 3.6214 | 1.1535 | -2.4679 | | tc_af_tf_generalization_att_0003 | 2.1284 | 1.1911 | -0.9373 | | tc_af_tf_generalization_att_0023 | 2.4499 | 1.8956 | -0.5542 | 3个用例劣化较为明显,根因分析: | 用例 | 算子 | 切换的模板 | 变化原因 | AIV_MTE2 变化 | 估值方向 | 实际影响 | |------|------|-----------|----------|--------------|---------|----------| | att_0086 | Relu_Transpose | result0_g0: case1→case0 | case1 MTE2 **膨胀 +756%** | 6755→57917 | 过高估值使case1被弃 | af 5.95→18.48us | | att_0003 | ReduceMax_BroadcastTo_Add | result0_g0: case0→case1 | case1 MTE2 **下降 -53.4%** | 9144→4257 | 过低估值使case1被选 | af 2.77→5.05us | | att_0023 | Mul_ClipByValue_ReduceSum | result0_g0: case0→case1 | case1 MTE2 **下降 -51.6%** | 8988→4353 | 过低估值使case1被选 | af 3.66→4.74us | 其中att_0086模板切换的原因: transpose双切分的场景,新建模对nddma估值偏大 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 本次为内部行为调整,无需修改用户文档 - [x] 我在标题中使用了合适的类型标签(fix:) - [x] 我已经详细阅读并遵守 CONTRIBUTING.md ## 其他信息 - PR 目标分支为 cann/graph-autofusion:develop,当前 HEAD 为 e488e759671b。 - 未修改 NDDMA 模型参数或校准系数;性能与误差未通过项已明确保留。 - effective rank >5、CV-Fusion 和非法输入继续复用既有 legacy 路径。 - 工作区中的未跟踪 docs 和测试产物未纳入提交。 See merge request: cann/graph-autofusion!1792 | 1 天前 | |
fix: 修复 Issue 261-276 安全加固缺陷 Co-authored-by: gcw_V3YyYBt1<gaoxin32@huawei.com> # message auto-generated for no-merge-commit merge: !1791 merge develop-issue into develop fix: 修复 Issue 261-276 安全加固缺陷 Created-by: gcw_V3YyYBt1 Commit-by: gcw_V3YyYBt1 Merged-by: cann-robot Description: # Pull Request ## 描述 本次 PR 修复了 public 仓库中 Issue #261-#276 共 15 个安全加固类缺陷,涉及容器越界、空指针解引用、内存泄漏、无上界内存分配四类问题。涵盖 14 个 C++ 源文件,均为防御性编程加固。 关联 Issues: #261, #262, #264, #265, #266, #267, #268, #269, #270, #271, #272, #273, #274, #275, #276 ## 背景 在代码静态分析与安全审计中,发现以下四类潜在风险: 1. **容器越界**:外部数据驱动的容器访问未做充分边界检查(#261 ONNX attribute(0)、#262 transpose vectorized_repeats 空容器)。 2. **空指针解引用**:内部 shared_ptr/bare pointer 在解引用前未校验非空(#264 Expression::Compare、#265 HcomTopoInfo、#266 reuse_schedule_group、#268 pyascir、#269 node.cc、#270 graph_utils_ex、#271 readable_dump、#272 NddmaApi、#273 vector_func_partitioner)。 3. **逻辑反转**: to_json 中三元运算符条件反转,IsValid() 时错误返回空串,实际应在 impl_==nullptr 时返回空串(#267)。 4. **内存泄漏与无上界分配**:PGO 生成代码中 malloc 未在 return 前 free(#274);反序列化路径中读取外部文件时仅做下界校验,无上界防护(#275 model_serialize、#276 graph_utils)。 ## 修改方案 按问题类型分组修复,每处均在调用点加最小防御性校验: **容器越界(2 项)** - ge_ir_utils.cc:1241:ONNX DecodeGraph 访问 attribute(0) 前增加 attribute_size() 非空检查,空时报错返回 false。 - transpose_v2.cpp:30:GetTensorVectorizedRepeats 成功后校验 vector 非空,并改用 back() 替代 size()-1。 **空指针解引用(9 项)** - expression.cc:181:Compare 同时校验 this->impl_ 和 e.impl_。 - hcom_topo_info.cc:32:函数入口增加 group != nullptr 检查。 - tiling_code_gen_impl.cpp:4969:解引用 reuse_schedule_group shared_ptr 前先做非空断言。 - pyascir.cpp:218:PyUnicode_AsUTF8 返回 nullptr 时抛 TypeError。 - node.cc:576:GetOwnerNodeBarePtr() 返回 nullptr 时 continue。 - graph_utils_ex.cc:146,150:拆分 GetComputeGraph 返回值,加 GE_CHECK_NOTNULL。 - readable_dump.h:78:GetOpDesc() 返回 nullptr 时 continue 跳过该节点。 - ascir_api_perf_v2.cpp:129:node_ptr->GetType() 加 nullptr 三元判断兜底 "Nddma"。 - vector_func_partitioner.cpp:697:GetNodeCluster 返回 nullptr 时 continue。 **逻辑反转(1 项)** - base_types_printer.cpp:14:修正三元顺序,IsValid() 时取 Str().get(),否则取 ""。 **内存泄漏与无上界分配(3 项)** - tiling_code_gen_impl.cpp:2833,2939:仅在 PGO/inductor 路径 return 前注入 free(memory),非 PGO 路径不注入,避免误伤。 - model_serialize.cc:1143:LoadWeightFromFile 分配前加 2GB 上界(kMaxWeightLength = 2GiB)。 - graph_utils.cc:1030:ConvertFileConstToConst 加相同 2GB 上界(kMaxFileLength = 2GiB)。 ## 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构 - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue #261 #262 #264 #265 #266 #267 #268 #269 #270 #271 #272 #273 #274 #275 #276 ## 如何测试 1. 编译 Autofuse 与 SuperKernel 模块无报错(sh build.sh -j 8)。 2. 人工走读每处加固点,确认与原 issue 分析一致,不破坏原正常逻辑分支。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我在标题中使用了合适的类型标签 - [x] 我已详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 See merge request: cann/graph-autofusion!1791 | 7 小时前 | |
【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 | 6 天前 | |
fix: 修复 Issue 261-276 安全加固缺陷 Co-authored-by: gcw_V3YyYBt1<gaoxin32@huawei.com> # message auto-generated for no-merge-commit merge: !1791 merge develop-issue into develop fix: 修复 Issue 261-276 安全加固缺陷 Created-by: gcw_V3YyYBt1 Commit-by: gcw_V3YyYBt1 Merged-by: cann-robot Description: # Pull Request ## 描述 本次 PR 修复了 public 仓库中 Issue #261-#276 共 15 个安全加固类缺陷,涉及容器越界、空指针解引用、内存泄漏、无上界内存分配四类问题。涵盖 14 个 C++ 源文件,均为防御性编程加固。 关联 Issues: #261, #262, #264, #265, #266, #267, #268, #269, #270, #271, #272, #273, #274, #275, #276 ## 背景 在代码静态分析与安全审计中,发现以下四类潜在风险: 1. **容器越界**:外部数据驱动的容器访问未做充分边界检查(#261 ONNX attribute(0)、#262 transpose vectorized_repeats 空容器)。 2. **空指针解引用**:内部 shared_ptr/bare pointer 在解引用前未校验非空(#264 Expression::Compare、#265 HcomTopoInfo、#266 reuse_schedule_group、#268 pyascir、#269 node.cc、#270 graph_utils_ex、#271 readable_dump、#272 NddmaApi、#273 vector_func_partitioner)。 3. **逻辑反转**: to_json 中三元运算符条件反转,IsValid() 时错误返回空串,实际应在 impl_==nullptr 时返回空串(#267)。 4. **内存泄漏与无上界分配**:PGO 生成代码中 malloc 未在 return 前 free(#274);反序列化路径中读取外部文件时仅做下界校验,无上界防护(#275 model_serialize、#276 graph_utils)。 ## 修改方案 按问题类型分组修复,每处均在调用点加最小防御性校验: **容器越界(2 项)** - ge_ir_utils.cc:1241:ONNX DecodeGraph 访问 attribute(0) 前增加 attribute_size() 非空检查,空时报错返回 false。 - transpose_v2.cpp:30:GetTensorVectorizedRepeats 成功后校验 vector 非空,并改用 back() 替代 size()-1。 **空指针解引用(9 项)** - expression.cc:181:Compare 同时校验 this->impl_ 和 e.impl_。 - hcom_topo_info.cc:32:函数入口增加 group != nullptr 检查。 - tiling_code_gen_impl.cpp:4969:解引用 reuse_schedule_group shared_ptr 前先做非空断言。 - pyascir.cpp:218:PyUnicode_AsUTF8 返回 nullptr 时抛 TypeError。 - node.cc:576:GetOwnerNodeBarePtr() 返回 nullptr 时 continue。 - graph_utils_ex.cc:146,150:拆分 GetComputeGraph 返回值,加 GE_CHECK_NOTNULL。 - readable_dump.h:78:GetOpDesc() 返回 nullptr 时 continue 跳过该节点。 - ascir_api_perf_v2.cpp:129:node_ptr->GetType() 加 nullptr 三元判断兜底 "Nddma"。 - vector_func_partitioner.cpp:697:GetNodeCluster 返回 nullptr 时 continue。 **逻辑反转(1 项)** - base_types_printer.cpp:14:修正三元顺序,IsValid() 时取 Str().get(),否则取 ""。 **内存泄漏与无上界分配(3 项)** - tiling_code_gen_impl.cpp:2833,2939:仅在 PGO/inductor 路径 return 前注入 free(memory),非 PGO 路径不注入,避免误伤。 - model_serialize.cc:1143:LoadWeightFromFile 分配前加 2GB 上界(kMaxWeightLength = 2GiB)。 - graph_utils.cc:1030:ConvertFileConstToConst 加相同 2GB 上界(kMaxFileLength = 2GiB)。 ## 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构 - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue #261 #262 #264 #265 #266 #267 #268 #269 #270 #271 #272 #273 #274 #275 #276 ## 如何测试 1. 编译 Autofuse 与 SuperKernel 模块无报错(sh build.sh -j 8)。 2. 人工走读每处加固点,确认与原 issue 分析一致,不破坏原正常逻辑分支。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我在标题中使用了合适的类型标签 - [x] 我已详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 See merge request: cann/graph-autofusion!1791 | 7 小时前 | |
fix: 修复 Issue 261-276 安全加固缺陷 Co-authored-by: gcw_V3YyYBt1<gaoxin32@huawei.com> # message auto-generated for no-merge-commit merge: !1791 merge develop-issue into develop fix: 修复 Issue 261-276 安全加固缺陷 Created-by: gcw_V3YyYBt1 Commit-by: gcw_V3YyYBt1 Merged-by: cann-robot Description: # Pull Request ## 描述 本次 PR 修复了 public 仓库中 Issue #261-#276 共 15 个安全加固类缺陷,涉及容器越界、空指针解引用、内存泄漏、无上界内存分配四类问题。涵盖 14 个 C++ 源文件,均为防御性编程加固。 关联 Issues: #261, #262, #264, #265, #266, #267, #268, #269, #270, #271, #272, #273, #274, #275, #276 ## 背景 在代码静态分析与安全审计中,发现以下四类潜在风险: 1. **容器越界**:外部数据驱动的容器访问未做充分边界检查(#261 ONNX attribute(0)、#262 transpose vectorized_repeats 空容器)。 2. **空指针解引用**:内部 shared_ptr/bare pointer 在解引用前未校验非空(#264 Expression::Compare、#265 HcomTopoInfo、#266 reuse_schedule_group、#268 pyascir、#269 node.cc、#270 graph_utils_ex、#271 readable_dump、#272 NddmaApi、#273 vector_func_partitioner)。 3. **逻辑反转**: to_json 中三元运算符条件反转,IsValid() 时错误返回空串,实际应在 impl_==nullptr 时返回空串(#267)。 4. **内存泄漏与无上界分配**:PGO 生成代码中 malloc 未在 return 前 free(#274);反序列化路径中读取外部文件时仅做下界校验,无上界防护(#275 model_serialize、#276 graph_utils)。 ## 修改方案 按问题类型分组修复,每处均在调用点加最小防御性校验: **容器越界(2 项)** - ge_ir_utils.cc:1241:ONNX DecodeGraph 访问 attribute(0) 前增加 attribute_size() 非空检查,空时报错返回 false。 - transpose_v2.cpp:30:GetTensorVectorizedRepeats 成功后校验 vector 非空,并改用 back() 替代 size()-1。 **空指针解引用(9 项)** - expression.cc:181:Compare 同时校验 this->impl_ 和 e.impl_。 - hcom_topo_info.cc:32:函数入口增加 group != nullptr 检查。 - tiling_code_gen_impl.cpp:4969:解引用 reuse_schedule_group shared_ptr 前先做非空断言。 - pyascir.cpp:218:PyUnicode_AsUTF8 返回 nullptr 时抛 TypeError。 - node.cc:576:GetOwnerNodeBarePtr() 返回 nullptr 时 continue。 - graph_utils_ex.cc:146,150:拆分 GetComputeGraph 返回值,加 GE_CHECK_NOTNULL。 - readable_dump.h:78:GetOpDesc() 返回 nullptr 时 continue 跳过该节点。 - ascir_api_perf_v2.cpp:129:node_ptr->GetType() 加 nullptr 三元判断兜底 "Nddma"。 - vector_func_partitioner.cpp:697:GetNodeCluster 返回 nullptr 时 continue。 **逻辑反转(1 项)** - base_types_printer.cpp:14:修正三元顺序,IsValid() 时取 Str().get(),否则取 ""。 **内存泄漏与无上界分配(3 项)** - tiling_code_gen_impl.cpp:2833,2939:仅在 PGO/inductor 路径 return 前注入 free(memory),非 PGO 路径不注入,避免误伤。 - model_serialize.cc:1143:LoadWeightFromFile 分配前加 2GB 上界(kMaxWeightLength = 2GiB)。 - graph_utils.cc:1030:ConvertFileConstToConst 加相同 2GB 上界(kMaxFileLength = 2GiB)。 ## 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构 - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue #261 #262 #264 #265 #266 #267 #268 #269 #270 #271 #272 #273 #274 #275 #276 ## 如何测试 1. 编译 Autofuse 与 SuperKernel 模块无报错(sh build.sh -j 8)。 2. 人工走读每处加固点,确认与原 issue 分析一致,不破坏原正常逻辑分支。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我在标题中使用了合适的类型标签 - [x] 我已详细阅读了贡献指南(CONTRIBUTING.md) ## 其他信息 See merge request: cann/graph-autofusion!1791 | 7 小时前 | |
feat(autofuse): support effective-view NDDMA models Co-authored-by: zhang_shengjie<804425610@qq.com> # message auto-generated for no-merge-commit merge: !1792 merge fix/frontend-shape-abi-sync into develop feat(autofuse): support effective-view NDDMA models Created-by: zhang_shengjie Commit-by: zhang_shengjie Merged-by: cann-robot Description: # Pull Request ## 主要解决的问题 本 PR 将 ATT 的 NDDMA 描述和性能模型对齐到 codegen 实际发出的 DataCopy NDDMA 参数,并补齐 effective rank 1~5 的统一建模。 | 问题 | 原有行为 | 风险/影响 | 本 PR 目标 | |---|---|---|---| | 描述口径不一致 | ATT 使用 raw view,codegen 在发出 API 前还会忽略双零 stride 轴、合并连续轴并应用 tail actual size | ATT 可能按错误 rank、dim 或 stride 选模 | NddmaDescriptorInfo 固定表示 codegen-equivalent effective view | | 模型维度不完整 | 新模型只覆盖 1D | 2D~5D 只能进入 legacy 路径 | effective rank 1 使用 1D 模型,2~5 使用统一任意维模型 | | 合轴规则重复 | ATT 与 codegen 各自判断零 stride 和连续轴 | 两侧规则容易随迭代漂移 | 仅抽取两个无状态判定 helper,保留 CalculateDmaParams 原状态机和变量 | | dtype 口径不完整 | 维度/stride 以元素为单位,公式需要字节量 | B8/B16/B32/B64 预测可能量纲错误 | 总数据量和输入 stride 修正统一乘 dtype_size | | fallback 难定位 | 选模失败缺少稳定、统一的上下文 | 设备侧难区分 rank、dtype、schema 等原因 | DEBUG 日志输出模型、raw/effective rank 和 fallback reason | 同时修复远端 ST_Test_autofuse_ascendc_api 暴露的 Broadcast/IndirectLoad 图改写一致性问题,并将 EvaluateNddmaModel 拆分到单函数 50 行以内;这些修复不改变 NDDMA 公式和 codegen 搬运行为。 ## 修改方案 ### 1. effective view 与 codegen 对齐 NddmaDescriptorInfo 只保存最终用于建模的 effective view: | 字段 | 含义 | 单位/顺序 | |---|---|---| | output_dims | 合轴并应用 full/tail actual repeat 后的搬运维度 | 元素,外轴 → 内轴 | | input_strides | effective GM stride | 元素,外轴 → 内轴 | | output_strides | effective UB vectorized stride | 元素,外轴 → 内轴 | | vectorized_axis | 每个 effective 维度对应的代表轴 | 与上述向量一一对应 | 为了控制 codegen review 风险,CalculateDmaParams 的遍历方向、状态变量、合并顺序和 SetDataCopyParams 调用均保留,仅将以下已有判断抽到 common_utils 供 ATT/codegen 共用: - ShouldIgnoreDataCopyZeroAxis:双零 stride 轴忽略条件; - IsDataCopyAxisContinuous:GM/UB 两侧连续轴合并条件。 tile-inner 边界仍由调用侧已有元数据提供,不新增 descriptor 字段或新的中间实体。 ### 2. 支持 effective rank 1~5 | effective rank | 模型 | 行为 | |---:|---|---| | 1 | NDDMA_1D_MULTICORE_V2 | 使用统一公式的单层形式 | | 2~5 | NDDMA_ND_MULTICORE_V1 | 对每个 effective 层级累加 residual | | >5 | legacy GetDmaPerf | 保留现有 outer-loop fallback | | 非法 dtype/schema/stride/cycles | legacy GetDmaPerf | 输出稳定 fallback reason,不写入无效表达式 | 统一公式按 effective rank D 计算: text B = dtype_size × Π(d_j) B_j = dtype_size × Π(d_m), m=j...D-1 s_j = min(îs_j × dtype_size, 128) g_j = min(1, ôs_j - 1) N_j = NG_j + NGU_j (block_dim <= 2) (NG_j + NGU_j) × rho_j (block_dim > 2) cycles = N_base + Σ N_j, j=0...D-1 其中 îs_j/ôs_j 由当前层 stride 与更内层覆盖范围的差值计算;动态 dim/stride 保留符号表达式。BuildNddma1DResidual 的名字表示“单个层级的 residual”,多维模型逐层调用同一公式,不是把完整 1D 模型重复叠加;N_base 只计算一次。 ### 3. 校验、日志与 fallback | 检查点 | 处理 | |---|---| | ATT data_type_size 与 dtype 映射不一致 | kDtypeUnsupported fallback | | effective rank 不在 1~5 | kRankUnsupported fallback | | dim/stride/schema 非法 | 对应稳定 reason fallback | | 静态公式得到非正 cycles | kSchemaMismatch fallback | | CV-Fusion descriptor 与默认 codegen 语义不同 | 保持 legacy 路径 | 新增两类关键 DEBUG 日志用于两侧 golden 对照: - codegen:raw/effective rank、repeats、GM/UB strides、vectorized axis; - ATT:selected/fallback、模型名、raw/effective rank、reason。 ### 4. 远端 ST 与代码告警修复 | 位置 | 修改 | 原因 | |---|---|---| | broadcast_backward_pass.cpp | Broadcast 后移时同步 compute_node->attr.sched.axis | tensor axis 已更新但 node schedule axis 未同步,后续 zero-stride 轴识别失败 | | indirect_load_schedule_case_generator.cpp | Broadcast path 折叠后再次复用 RewriteInputPreNodes | Load -> Abs -> Broadcast -> IndirectLoad 折叠后重新暴露 Abs,需要再次搬移 | | nddma_model.cpp | 抽取 BuildNddmaCoreCycles 等已有逻辑 | EvaluateNddmaModel 由 67 NBNC 行降至 44 行,计算顺序与公式不变 | | optimize_st.cpp | 接受语义等价的 scalar broadcast chain | 避免对等价节点名称作不必要的唯一性假设 | ## 代码修改流程图 ### effective descriptor 构造 mermaid flowchart LR A[raw repeats / GM strides / UB strides] --> B[从内轴向外轴遍历] B --> C{双零 stride 轴可忽略?} C -->|是| B C -->|否| D{GM 与 UB 均连续<br/>且未跨 tile-inner?} D -->|是| E[合并到当前 effective 维] D -->|否| F[新建 effective 维] E --> B F --> B B -->|结束| G[反转为外轴到内轴] G --> H[ATT 替换 full/tail actual repeat] H --> I[NddmaDescriptorInfo effective view] ### 模型选择与 fallback mermaid flowchart TD A[NDDMA NodeInfo + effective descriptor] --> B{CV-Fusion / dtype / schema 合法?} B -->|否| L[记录 fallback reason] B -->|是| C{effective rank} C -->|1| D[NDDMA_1D_MULTICORE_V2] C -->|2~5| E[NDDMA_ND_MULTICORE_V1] C -->|大于 5| L D --> F[计算一次 N_base] E --> F F --> G[逐 effective 层构造 residual] G --> H{静态 cycles > 0?} H -->|是或动态| I[写入 AIV_MTE2] H -->|否| L L --> M[沿用 legacy GetDmaPerf] ### Broadcast/IndirectLoad 修复链路 mermaid sequenceDiagram participant P as RewriteInputPreNodes participant B as RewriteBroadcastPaths participant C as CollectRewrittenRegion P->>B: 先搬移当前可见前驱 B->>B: 折叠 Broadcast path B->>P: 再搬移新暴露的前驱 P->>C: 在最终图上收集边界和 region ## 测试用例说明 ### 1. 功能与回归验证 主要构建命令: bash cmake --build build --target \ att_ut optimize_ut \ indirect_load_broadcast_axis_simt_test_codegen_v2 \ -j 8 | 验证项 | 结果 | 覆盖内容 | |---|---:|---| | NDDMA 专项 UT | **32/32 PASS** | 1D~5D、dtype、动态表达式、tail/tile-inner、非法输入与 fallback | | Optimize 全量 UT | **636 PASS / 48 SKIP / 0 FAIL** | Broadcast、IndirectLoad 及既有 optimize 回归 | | IndirectLoad codegen 矩阵 | **53/53 PASS** | Broadcast axis、SIMT 与路径改写组合 | | 目标 AscendC ST | **1/1 PASS** | indirect_load_broadcast_axis_simt_test_codegen_v2 | | Round7 analyzer UT | **12/12 PASS**(含 6 个 subtests) | 4D/5D 配置解析、参数合并与结果分析 | | Round7 配置 dry-run | **14,313/14,313 校验通过** | 4D/5D、5 种 layout 组、4 种 dtype | | CANN 9.2 package | **构建及 run 包 --check PASS** | 打包交付链路 | | 静态检查 | **PASS** | git diff --check、clang-format、pre-commit、OAT | | PR 远端 compile | **success** | Pipeline #1067944,SHA e488e759671b | ### 2. BBIT 数值、模型证据与 task duration 环境:同一 CANN 9.2 环境,warmup=2、repeat=5。speedup = baseline_median / candidate_median,大于 1 表示 candidate 更快。 | Case | Baseline median (us) | Candidate median (us) | Speedup | 数值结果 | |---|---:|---:|---:|---| | NC018 | 495.935 | 485.037 | **1.022** | baseline/candidate PASS | | NC019 | 7400.639 | 7431.755 | **0.996** | baseline/candidate PASS | | NC020 | 2966.773 | 3022.778 | **0.981** | baseline/candidate PASS | | P0-RD-01 | 548.954 | 576.085 | **0.953** | baseline/candidate PASS | | P0-RD-02 | 793.541 | 789.034 | **1.006** | baseline/candidate PASS | | P0-RD-03 | 471.708 | 465.699 | **1.013** | baseline/candidate PASS | 验证结果: - 6/6 case 均有正的 profiler task duration,baseline/candidate 数值均 PASS; - baseline/candidate 各捕获 66 行 AIV_MTE2,candidate 捕获 30 行 NDDMA selected/model 日志; - compare_nddma_packages 在 min_speedup=0.9 下 PASS,无 regression 记录; - 严格 speedup >= 1.0 未全部满足,NC019、NC020、P0-RD-01 属于实测回退,本 PR 不修改参数掩盖该结果。 模型选择日志包含以下代表性路径: | Case/节点形态 | raw rank | effective rank | 选择结果 | |---|---:|---:|---| | NC018 transpose/load | 2 | 2 | NDDMA_ND_MULTICORE_V1 | | NC020 slice/load 合轴路径 | 2 | 1 | NDDMA_1D_MULTICORE_V2 | | P0-RD-02 多轴 reduce/load | 3 | 3 | NDDMA_ND_MULTICORE_V1 | ### 3. 5D/6D 泛化 BBIT | Case | Baseline median (us) | Candidate median (us) | Speedup | 数值结果 | |---|---:|---:|---:|---| | NDDMA-5D | 324.156 | 319.084 | **1.016** | PASS | | NDDMA-6D | 436.204 | 279.495 | **1.561** | PASS | 5D/6D 正式设备用例证明数值和 task-duration 链路有效;该次正式 package 日志没有 AIV_MTE2/model/effective-rank 字段,因此不将它作为 rank 选择或预测误差通过的证据。 ### 4. 构造/编译耗时 六个正式 case 的 comparison.json 已记录 compile time。按 baseline / candidate 统计: | 指标 | 结果 | |---|---:| | 最小比值 | 0.934 | | 中位比值 | 0.990 | | 最大比值 | 1.051 | | 算术平均 | 0.987 | 当前数据未显示数量级回退,但这不是隔离 BuildNddmaDescriptor/EvaluateNddmaModel 的微基准;独立构造耗时 benchmark 仍保留为未完成验收项。 ### 5. Round7 预测误差 完整设备采集共 14,313 条 4D/5D 配置。以下是**不修改模型参数**、仅按 codegen effective-view 口径离线重算的结果: | 数据组 | MAPE | |---|---:| | 总体 | **188.78%** | | continuous | **23.87%** | | transpose_dim1_dim4 | **342.56%** | | transpose_dim1_dim5 | **344.60%** | 该结果说明 effective-view 对齐改善了描述一致性,但预测误差仍未达到设计目标(continuous 仍高于 10%,两个 transpose 组误差约为实测时延的 3.4 倍)。本 PR 不调整公式参数,不能将“采集完成”表述为“预测精度验收通过”。 ### 6.Slice/Split泛化用例测试 | 指标 | 原始 | v1(小尾轴) | v2(尾轴对齐) | v3(关闭打分) | **v4(Nddma+关闭打分)** | |---|---|---|---|---|---| | Pass数 | 38 | 40 | 54 | 102 | **135** | | 净增Pass | - | +2 | +16 | +64 | **+97** | | Fail→Pass | - | ~2 | ~46 | 71 | **100** | | Pass→Fail | - | ~0 | ~30 | 7 | **3** | | 迭代加速比中位数 | 0.961 | 1.060 | 1.087 | 0.992 | **0.993** | | 加速比<1用例数 | 113 | 59 | 43 | 72 | **87** | v4(Nddma(建模优化)相比v3新增34个Fail→Pass,主要集中在: - **SliceSingleGraph系列**(26个):GESlice和GEStrideSlice的小算子场景,Nddma建模优化使模板选择更准确 - **SliceSplitToElemwise系列**(6个):GEIsFinite、GENeg、GEBitwiseAnd等,算子加速比1.47~1.72 - **SelectPostFuseGraph**(1个):ratio=1.05 ### 7.ATT.泛化用例 整体性能略有劣化: | 指标 | Round1 (默认cann) | Round2 (nddma_nd fix) | 差异 | |------|-------------------|-----------------------|------| | 统计用例数 | 128 | 128 | - | | 平均加速比 | 1.9288x | 1.8945x | -0.0343x | | 加速比提升的用例 | - | - | 54 | | 加速比下降的用例 | - | - | 74 | 劣化主要原因是下面3个用例,待进一步分析原因。 | 用例名 | R1 ratio | R2 ratio | delta | |--------|----------|----------|-------| | tc_af_tf_generalization_att_0086 | 3.6214 | 1.1535 | -2.4679 | | tc_af_tf_generalization_att_0003 | 2.1284 | 1.1911 | -0.9373 | | tc_af_tf_generalization_att_0023 | 2.4499 | 1.8956 | -0.5542 | 3个用例劣化较为明显,根因分析: | 用例 | 算子 | 切换的模板 | 变化原因 | AIV_MTE2 变化 | 估值方向 | 实际影响 | |------|------|-----------|----------|--------------|---------|----------| | att_0086 | Relu_Transpose | result0_g0: case1→case0 | case1 MTE2 **膨胀 +756%** | 6755→57917 | 过高估值使case1被弃 | af 5.95→18.48us | | att_0003 | ReduceMax_BroadcastTo_Add | result0_g0: case0→case1 | case1 MTE2 **下降 -53.4%** | 9144→4257 | 过低估值使case1被选 | af 2.77→5.05us | | att_0023 | Mul_ClipByValue_ReduceSum | result0_g0: case0→case1 | case1 MTE2 **下降 -51.6%** | 8988→4353 | 过低估值使case1被选 | af 3.66→4.74us | 其中att_0086模板切换的原因: transpose双切分的场景,新建模对nddma估值偏大 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 本次为内部行为调整,无需修改用户文档 - [x] 我在标题中使用了合适的类型标签(fix:) - [x] 我已经详细阅读并遵守 CONTRIBUTING.md ## 其他信息 - PR 目标分支为 cann/graph-autofusion:develop,当前 HEAD 为 e488e759671b。 - 未修改 NDDMA 模型参数或校准系数;性能与误差未通过项已明确保留。 - effective rank >5、CV-Fusion 和非法输入继续复用既有 legacy 路径。 - 工作区中的未跟踪 docs 和测试产物未纳入提交。 See merge request: cann/graph-autofusion!1792 | 1 天前 | |
【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 | 3 个月前 | |
修复 Broadcast 后 Reduce source reuse 判断 Co-authored-by: weishitoken<huangqianqian15@huawei.com> # message auto-generated for no-merge-commit merge: !1819 merge fix/reduce-broadcast-reuse-guard into develop fix: 修复 Broadcast 后 Reduce source reuse 判断, 避免修改复用的broadcast数据导致精度失败 Created-by: wei_shi Commit-by: weishitoken Merged-by: cann-robot Description: # Pull Request ## 描述 修复 Reduce source reuse 判断遗漏上游 Broadcast 的问题。当 Broadcast 的 B 轴与 Reduce 的 R 轴具有相同 vectorized_axis 时,禁止复用输入 source,避免 Broadcast 与 Reduce 的轴语义冲突,错误复用,导致出现精度问题。 ## 变更类型 <!-- [x] 表示选中 --> - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新(格式化,局部变量) - [ ] 重构(既不修复错误也不增加功能的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无 ## 如何测试 1. 使用 CANN 9.2.0 配置并构建 aihac_codegen 和 test_main:均成功。 2. 针对本次 4 个变更文件执行 pre-commit run --files ...:基础检查、clang-format、codespell 和 OAT 检查均通过。 3. 执行 git diff --check:通过。 4. 目标测试运行受既有 liboptimize.so ABI/链接问题阻塞,未进入 gtest,错误为缺少 af::GraphUtils::RelinkGraphEdges 符号。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - 分支相对 develop 仅包含 4 个目标文件:1 个测试构建配置、1 个共享 helper 和 2 个生产路径修改。 - .gitignore 中的既有本地修改未纳入本分支提交。 See merge request: cann/graph-autofusion!1819 | 6 小时前 | |
【PR】:feature: add nwa tool Co-authored-by: jiangRun1_admin<jiangrun3@hisilicon.com> # message auto-generated for no-merge-commit merge: !1265 merge develop into develop 【PR】:feature: add nwa tool Created-by: j18351891940 Commit-by: jiangRun1_admin Merged-by: cann-robot Description: # Pull Request ## 描述 feature:add nwa tool。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [x] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 查看工具的README ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1265 | 1 个月前 | |
修复 Broadcast 后 Reduce source reuse 判断 Co-authored-by: weishitoken<huangqianqian15@huawei.com> # message auto-generated for no-merge-commit merge: !1819 merge fix/reduce-broadcast-reuse-guard into develop fix: 修复 Broadcast 后 Reduce source reuse 判断, 避免修改复用的broadcast数据导致精度失败 Created-by: wei_shi Commit-by: weishitoken Merged-by: cann-robot Description: # Pull Request ## 描述 修复 Reduce source reuse 判断遗漏上游 Broadcast 的问题。当 Broadcast 的 B 轴与 Reduce 的 R 轴具有相同 vectorized_axis 时,禁止复用输入 source,避免 Broadcast 与 Reduce 的轴语义冲突,错误复用,导致出现精度问题。 ## 变更类型 <!-- [x] 表示选中 --> - [x] Bug 修复 - [ ] 新功能 - [ ] 代码风格更新(格式化,局部变量) - [ ] 重构(既不修复错误也不增加功能的代码变动) - [ ] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无 ## 如何测试 1. 使用 CANN 9.2.0 配置并构建 aihac_codegen 和 test_main:均成功。 2. 针对本次 4 个变更文件执行 pre-commit run --files ...:基础检查、clang-format、codespell 和 OAT 检查均通过。 3. 执行 git diff --check:通过。 4. 目标测试运行受既有 liboptimize.so ABI/链接问题阻塞,未进入 gtest,错误为缺少 af::GraphUtils::RelinkGraphEdges 符号。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 - 分支相对 develop 仅包含 4 个目标文件:1 个测试构建配置、1 个共享 helper 和 2 个生产路径修改。 - .gitignore 中的既有本地修改未纳入本分支提交。 See merge request: cann/graph-autofusion!1819 | 6 小时前 | |
fix: replace deprecated Cube tiling SoC query (#251) Co-authored-by: ling-DT<lingxing@huawei.com> # message auto-generated for no-merge-commit merge: !1780 merge fix/cube-tiling-aclrt-socname-251 into develop fix: replace deprecated Cube tiling SoC query (#251) Created-by: ling-DT Commit-by: ling-DT Merged-by: cann-robot Description: # Pull Request ## 描述 将 autofuse/codegen/codegen_tiling_cube.cpp 中通过旧 runtime 头文件调用的 rtGetSocSpec("version", "SoC_version", ...),按 GE 仓正式先例替换为 acl/acl_rt.h 的 aclrtGetSocName()。同步补充 acl_rt 链接依赖、Runtime stub 和 Cube codegen UT,保留 SoC 查询失败后的平台架构 fallback。 ## 变更类型 - [x] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [x] 📦 构建过程或辅助工具的变动 - [ ] 📝 文档内容更新 ## 关联的Issue 关联 #251:Cube tiling 使用已日落的 rtGetSocSpec 查询 SoC 版本。 ## 如何测试 1. source /workspace/lingxing/0805/ascend-toolkit/set_env.sh && cmake --build build --target aihac_codegen pyautofuse -j8 2. cmake --build build --target test_main -j8,运行 Cube SoC 正常值和 nullptr fallback UT,2 tests passed。 3. TORCHINDUCTOR_COMPILE_THREADS=1 python3 /workspace/lingxing/tests/inductor-tests/test_network_fragments.py --shape-mode static --fragment 16_fp16_lhs_transpose_mm_mul,通过。 4. TORCHINDUCTOR_COMPILE_THREADS=1 python3 /workspace/lingxing/tests/inductor-tests/test_network_fragments.py --shape-mode dynamic --fragment 16_fp16_lhs_transpose_mm_mul,通过。 5. compare_inductor_matmul_fuse.py synthetic_fp32_mm_mul_1022x128 --profile --profile-warmup 5 --profile-iters 20,matmul_on 相比 matmul_off 为 -17.359%,判定 OK。 ## 核对清单 - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 仅迁移 Cube tiling 的 SoC 版本查询;platform_context.cpp 等其他规格查询路径未在本次范围内修改。 See merge request: cann/graph-autofusion!1780 | 6 天前 | |
【PR】: 【质量加固】修复完善readme一致性,主要包括tensorflow和superkernel Co-authored-by: loading-zzq<zhongqizhang2603@163.com> # message auto-generated for no-merge-commit merge: !1734 merge readme-fix-new into develop 【PR】: 【质量加固】修复完善readme一致性,主要包括tensorflow和superkernel Created-by: loading-zzq Commit-by: loading-zzq Merged-by: cann-robot Description: # Pull Request ## 描述 修复完善readme一致性,主要包括tensorflow和superkernel。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.文档修改与更新,不涉及测试 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1734 | 10 天前 | |
【PR】: 【质量加固】修复完善readme一致性,主要包括tensorflow和superkernel Co-authored-by: loading-zzq<zhongqizhang2603@163.com> # message auto-generated for no-merge-commit merge: !1734 merge readme-fix-new into develop 【PR】: 【质量加固】修复完善readme一致性,主要包括tensorflow和superkernel Created-by: loading-zzq Commit-by: loading-zzq Merged-by: cann-robot Description: # Pull Request ## 描述 修复完善readme一致性,主要包括tensorflow和superkernel。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [ ] 🐛 Bug 修复 - [ ] ✨ 新功能 - [ ] 💄 代码风格更新(格式化,局部变量) - [ ] ♻️ 重构(既不修复错误也不增加功能的代码变动) - [ ] 📦 构建过程或辅助工具的变动 - [x] 📝 文档内容更新 ## 关联的Issue <!-- 如果这个PR是为了解决特定的Issue,请在当前页面的右侧'关联Issue'部分添加相应Issue链接,并勾选'合并后关闭已关联的 Issue'选项。 --> ## 如何测试 描述测试此变更的步骤和前提条件: 1.文档修改与更新,不涉及测试 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [x] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如: feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 在此添加任何其他关于本次 PR 的说明。 See merge request: cann/graph-autofusion!1734 | 10 天前 | |
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
pip3 install torch_npu==2.10.0 # torch_npu版本应为 2.9.0 及以上。通过pip 安装 torch_npu 时,会自动安装依赖的torch 版本。
其他环境依赖
CMake >= 3.16.0
GCC >= 7.3.0
在 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"},
)