| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
【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 | 1 个月前 | |
feat: support IndexExpr and Arange autofusion Co-authored-by: Jett_Woo<wujinteng1@huawei.com> # message auto-generated for no-merge-commit merge: !1961 merge index-expr-device-validation-pr into develop feat: support IndexExpr and Arange autofusion Created-by: Jett_Woo Commit-by: Jett_Woo Merged-by: cann-robot Description: # Pull Request ## 描述 支持 IndexExpr 和 Arange 自动融合,补充 ASCIR/Python 接口、调度与 codegen 支持,并完善设备验证、UT 和 Backend E2E 用例。Arange 仅保留连续物理布局,数学上的非单位 step 仍受支持。 ## 变更类型 请选择本次引入的变更类型: <!-- [x] 表示选中 --> - [x] Bug 修复 - [x] 新功能 - [ ] 代码风格更新(格式化,局部变量) - [ ] 重构(既不修复错误也不增加功能的代码变动) - [x] 构建过程或辅助工具的变动 - [ ] 文档内容更新 ## 关联的Issue 无 ## 如何测试 描述测试此变更的步骤和前提条件: 1. 已完成 IndexExpr/Arange 相关 C++ 定向 UT,12 passed。 2. 已完成 device-validation Python 定向测试,259 passed;Ascend950 fused 精度验证有效 133 个 cell,其中 131 个通过,reduce_mask 的两个既有通用 Reduce codegen 问题仍按实测结果保留。 3. 已完成相关构建目标编译验证,构建并行度限制为 -j 8。 ## 核对清单 <!-- [x] 表示选中 --> - [x] 我的代码遵循了项目的代码风格 - [x] 我已对代码进行了自测 - [ ] 我已更新了相关的文档 - [x] 我在标题中使用了合适的类型标签(如:feat:, fix:) - [x] 我已经详细阅读了贡献指南(CONTRIBUTING.md),并遵守了其中的所有规定,包括但不限于commit message的格式、无效commit的合并等 ## 其他信息 本 PR 基于远端 develop 分支新建。未包含 docs/、tool/、temp/、验证日志或生成产物。 See merge request: cann/graph-autofusion!1961 | 29 天前 | |
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 个月前 |
| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 1 个月前 | ||
| 29 天前 | ||
| 1 个月前 |