已合并
feat(autofuse): support effective-view NDDMA models #1792
zhang_shengjie创建于 4 天前
feat(autofuse): support effective-view NDDMA models #1792
已合并
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhang_shengjie 的贡献)4 天前 创建了 pull request,commit 368ddb9b
atomgit-bot
4 天前 评论:
4 天前 评论:
变更摘要
本 PR 为 NDDMA 实现基于 effective view 的 1D~5D 性能建模。核心思路是把 codegen 中 CalculateDmaParams 的合轴逻辑抽取为公共工具 CalculateDataCopyEffectiveView,使 codegen 与 ATT 性能建模共用同一套合轴规则(连续轴合并、双零 stride 轴忽略、tile inner 边界切分);ATT 侧 NddmaModel 据此从仅支持 effective rank=1 扩展为按 effective rank 注册 1D(NDDMA_1D_MULTICORE_V2)与 2D~5D(NDDMA_ND_MULTICORE_V1)模型,并同步更新验证用例与设计注释。
主要改动
- 新增公共合轴工具
CalculateDataCopyEffectiveView(common_utils.h/cpp):基于 nominal/actual repeats、GM/UB strides 与is_tile_inner计算有效 repeats、有效 stride 与代表轴;api_call_utils.cpp中CalculateDmaParams改为调用该工具,删除原内联合轴循环、UpdateCalculatedDmaStatus及api_call_utils.h中的AxisInfo结构。 - 重写
nddma_model.cpp的公式与评估流程:1D 参数表由合并后的多项式改为直接保存 T1/H1/T2/H2 及 a1~c4,新增BuildNddma1DResidual残差项;EvaluateNddmaModel支持 effective rank 1~5,按轴累加残差并在静态 cycles 非正时(IsStaticNonPositive)回退 legacy;NormalizeNddmaDescriptor将各向量反转为内→外顺序供公式消费,并移除NddmaNormalizedDesc::raw_rank。 - 扩展 descriptor 构建与调用方:
BuildNddmaDescriptor新增tile_inner参数,内部调用CalculateDataCopyEffectiveView,基于origin_repeats与shape_info.repeats构造 effective descriptor;ascir_api_perf_v2.cpp的TryNewNddmaModel增加 dtype size 一致性校验(kDataTypeSizeMap对照),从输出轴信息收集tile_inner,并保留 raw_rank 仅用于诊断日志。 - 更新模型注册与接口约定:
NddmaModelResult默认模型名改为NDDMA_1D_MULTICORE_V2,api_perf.h中NddmaDescriptorInfo注释改为描述 codegen 合轴后的 effective view 语义,并更新nddma_model.h的公式与处理阶段说明。 - 更新 UT 用例:2D~5D 用例由「回退 legacy」改为「命中
NDDMA_ND_MULTICORE_V1」,1D 用例改为校验NDDMA_1D_MULTICORE_V2,新增 dtype size 不匹配回退、两维内→外公式顺序及 effective view 连续/合轴/tile 边界计算等用例。


atomgit-bot
4 天前 评论:
4 天前 评论:
4 天前 添加了label:stat/needs-squash
4 天前 添加了label:cann-cla/yes
此处折叠了158条消息 查看更多
1 天前 添加了label:approved
1 天前 合入了pull request
11 小时前 关联了issue:RFC:Nddma 性能建模统一方案
11 小时前 修改了pull request 的描述
Pull Request
主要解决的问题
本 PR 将 ATT 的 NDDMA 描述和性能模型对齐到 codegen 实际发出的 DataCopy NDDMA 参数,并补齐 effective rank 1~5 的统一建模。
NddmaDescriptorInfo固定表示 codegen-equivalent effective viewCalculateDmaParams原状态机和变量dtype_size同时修复远端
ST_Test_autofuse_ascendc_api暴露的 Broadcast/IndirectLoad 图改写一致性问题,并将EvaluateNddmaModel拆分到单函数 50 行以内;这些修复不改变 NDDMA 公式和 codegen 搬运行为。修改方案
1. effective view 与 codegen 对齐
NddmaDescriptorInfo只保存最终用于建模的 effective view:output_dimsinput_stridesoutput_stridesvectorized_axis为了控制 codegen review 风险,
CalculateDmaParams的遍历方向、状态变量、合并顺序和SetDataCopyParams调用均保留,仅将以下已有判断抽到common_utils供 ATT/codegen 共用:ShouldIgnoreDataCopyZeroAxis:双零 stride 轴忽略条件;IsDataCopyAxisContinuous:GM/UB 两侧连续轴合并条件。tile-inner 边界仍由调用侧已有元数据提供,不新增 descriptor 字段或新的中间实体。
2. 支持 effective rank 1~5
NDDMA_1D_MULTICORE_V2NDDMA_ND_MULTICORE_V1GetDmaPerfGetDmaPerf统一公式按 effective rank
D计算:其中
îs_j/ôs_j由当前层 stride 与更内层覆盖范围的差值计算;动态 dim/stride 保留符号表达式。BuildNddma1DResidual的名字表示“单个层级的 residual”,多维模型逐层调用同一公式,不是把完整 1D 模型重复叠加;N_base只计算一次。3. 校验、日志与 fallback
data_type_size与 dtype 映射不一致kDtypeUnsupportedfallbackkRankUnsupportedfallbackkSchemaMismatchfallback新增两类关键 DEBUG 日志用于两侧 golden 对照:
4. 远端 ST 与代码告警修复
broadcast_backward_pass.cppcompute_node->attr.sched.axisindirect_load_schedule_case_generator.cppRewriteInputPreNodesLoad -> Abs -> Broadcast -> IndirectLoad折叠后重新暴露Abs,需要再次搬移nddma_model.cppBuildNddmaCoreCycles等已有逻辑EvaluateNddmaModel由 67 NBNC 行降至 44 行,计算顺序与公式不变optimize_st.cpp代码修改流程图
effective descriptor 构造
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
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 修复链路
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. 功能与回归验证
主要构建命令:
indirect_load_broadcast_axis_simt_test_codegen_v2--checkPASSgit diff --check、clang-format、pre-commit、OAT#1067944,SHAe488e759671b2. BBIT 数值、模型证据与 task duration
环境:同一 CANN 9.2 环境,warmup=2、repeat=5。
speedup = baseline_median / candidate_median,大于 1 表示 candidate 更快。验证结果:
compare_nddma_packages在min_speedup=0.9下 PASS,无 regression 记录;speedup >= 1.0未全部满足,NC019、NC020、P0-RD-01 属于实测回退,本 PR 不修改参数掩盖该结果。模型选择日志包含以下代表性路径:
NDDMA_ND_MULTICORE_V1NDDMA_1D_MULTICORE_V2NDDMA_ND_MULTICORE_V13. 5D/6D 泛化 BBIT
5D/6D 正式设备用例证明数值和 task-duration 链路有效;该次正式 package 日志没有 AIV_MTE2/model/effective-rank 字段,因此不将它作为 rank 选择或预测误差通过的证据。
4. 构造/编译耗时
六个正式 case 的
comparison.json已记录 compile time。按baseline / candidate统计:当前数据未显示数量级回退,但这不是隔离
BuildNddmaDescriptor/EvaluateNddmaModel的微基准;独立构造耗时 benchmark 仍保留为未完成验收项。5. Round7 预测误差
完整设备采集共 14,313 条 4D/5D 配置。以下是不修改模型参数、仅按 codegen effective-view 口径离线重算的结果:
该结果说明 effective-view 对齐改善了描述一致性,但预测误差仍未达到设计目标(continuous 仍高于 10%,两个 transpose 组误差约为实测时延的 3.4 倍)。本 PR 不调整公式参数,不能将“采集完成”表述为“预测精度验收通过”。
6.Slice/Split泛化用例测试
v4(Nddma(建模优化)相比v3新增34个Fail→Pass,主要集中在:
7.ATT.泛化用例
整体性能略有劣化:
劣化主要原因是下面3个用例,待进一步分析原因。
3个用例劣化较为明显,根因分析:
其中att_0086模板切换的原因:
transpose双切分的场景,新建模对nddma估值偏大
关联的Issue
核对清单
其他信息
cann/graph-autofusion:develop,当前 HEAD 为e488e759671b。