已合并
feat(autofuse): support effective-view NDDMA models #1792
feat(autofuse): support effective-view NDDMA models #1792
已合并
zhang_shengjie创建于 4 天前
zhang_shengjie成员
4 天前

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 计算:

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 构造

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. 功能与回归验证

主要构建命令:

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_packagesmin_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估值偏大

关联的Issue

  • #285(RFC:Nddma 性能建模统一方案)

核对清单

其他信息

  • PR 目标分支为 cann/graph-autofusion:develop,当前 HEAD 为 e488e759671b
  • 未修改 NDDMA 模型参数或校准系数;性能与误差未通过项已明确保留。
  • effective rank >5、CV-Fusion 和非法输入继续复用既有 legacy 路径。
  • 工作区中的未跟踪 docs 和测试产物未纳入提交。
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 zhang_shengjie 的贡献)
Zzhang_shengjie成员
4 天前 创建了 pull request,commit 368ddb9b
atomgit-bot
atomgit-bot
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)模型,并同步更新验证用例与设计注释。

主要改动

  • 新增公共合轴工具 CalculateDataCopyEffectiveViewcommon_utils.h/cpp):基于 nominal/actual repeats、GM/UB strides 与 is_tile_inner 计算有效 repeats、有效 stride 与代表轴;api_call_utils.cppCalculateDmaParams 改为调用该工具,删除原内联合轴循环、UpdateCalculatedDmaStatusapi_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_repeatsshape_info.repeats 构造 effective descriptor;ascir_api_perf_v2.cppTryNewNddmaModel 增加 dtype size 一致性校验(kDataTypeSizeMap 对照),从输出轴信息收集 tile_inner,并保留 raw_rank 仅用于诊断日志。
  • 更新模型注册与接口约定NddmaModelResult 默认模型名改为 NDDMA_1D_MULTICORE_V2api_perf.hNddmaDescriptorInfo 注释改为描述 codegen 合轴后的 effective view 语义,并更新 nddma_model.h 的公式与处理阶段说明。
  • 更新 UT 用例:2D~5D 用例由「回退 legacy」改为「命中 NDDMA_ND_MULTICORE_V1」,1D 用例改为校验 NDDMA_1D_MULTICORE_V2,新增 dtype size 不匹配回退、两维内→外公式顺序及 effective view 连续/合轴/tile 边界计算等用例。
likedislike
atomgit-bot
atomgit-bot
4 天前 评论:

代码审查

✅ 未发现问题

likedislike
CANN-robotCANN-robot成员
4 天前 添加了label:stat/needs-squash
CANN-robotCANN-robot成员
4 天前 添加了label:cann-cla/yes
此处折叠了158条消息 查看更多
张德鹏成员
1 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
1 天前 添加了label:approved
CANN-robotCANN-robot成员
1 天前 合入了pull request
Zzhang_shengjie成员
11 小时前 关联了issue:RFC:Nddma 性能建模统一方案
Zzhang_shengjie成员
11 小时前 修改了pull request 的描述