已合并
feat: BatchNormGradV3 在 A5 上支持 output_mask #11948
feat: BatchNormGradV3 在 A5 上支持 output_mask #11948
已合并
qianzehong创建于 12 天前
qianzehong成员
12 天前

描述

BatchNormGradV3 在 A5 上支持按需输出 dx、dweight(dgamma)和 dbias(dbeta)。新增可选 ListBool 属性 output_mask,长度为 3,顺序为 [dx, dweight, dbias],默认全 true;例如 [true, false, false] 仅写出 dx。三个输出仍为必选输出,shape/dtype 保持原定义,关闭输出的内容无效。

  • ACLNN:aclnnBatchNormBackward 的 A5 分支通过新增 L0 重载透传已有 outputMask;GEIR:op proto 公开 output_mask 属性。
  • A5 tiling 将 mask 编码到 int64_t 字段的低 3 位。各 arch35 kernel 类读取标记,跳过关闭输出的最终写入;全 false 时直接返回。计算 dx 所需的参数梯度归约中间量仍保留。kernel 入口 batch_norm_grad_v3_apt.cpp 与基线一致,mask 位值使用具名常量。
  • 共用 OpDef 删除未参与计算的 version,属性顺序为 [is_training, epsilon, output_mask];五个平台的二进制配置同步调整。A2/A3 各 14 条配置将 version:int 替换为 output_mask:list_bool,保证编译参数与生成入口一致。

A2/A3 影响范围

A2/A3 的原有 kernel、tiling 模板及三个 tilingdata 结构与基线一致。普通 ACLNN 保留原有组合算子路径;Fast ACLNN 保留旧 L0 调用和 OP_ATTR(training, eps),继续由 L2 控制输出拷贝,不引入 kernel 按 mask 跳算的能力。

共用 OpDef/proto 和生成的编译接口存在属性变化,不能认定为接口完全无影响。直接使用旧编译入口并显式传入 version 的调用需要适配;Fast ACLNN 对外接口中的 version 参数保留。A2/A3 真机 ACLNN、精度、性能和 GEIR 尚未验证。

配套修复与主线同步

基线问题已分别通过以下 PR 合入 master,本 PR 已完成同步:

RASplitR 与 RARSplitCoreR1 的 UT 镜像已在末尾补齐 outputMask,序列化大小分别为 192 和 416 字节;后者的 outputMask 位于全部 binAdd 字段之后。已解决与主线的镜像布局冲突,保留融合键注册和错误码修复。

Golden 对 BF16 dtype 字符串先按 Torch dtype 解析,再回退到 NumPy,避免 Torch 通路依赖外部导入 ml_dtypes。已验证 4 个 BF16 CSV 用例的 CPU golden 调用、8 种 dtype 表示、非法 dtype 拒绝,以及 NumPy BF16 输出的按需导入。

主线新增 ascend960dt 配置中的 28 个第三属性同步为 output_mask:list_bool,与共享 OpDef 保持一致;五个平台的 JSON 属性一致性检查通过。

本轮追加验证

  • CANN 9.2、ascend950 构建配置:142 个 Host UT、97 个 API UT 全部通过。
  • Host SaveToBuffer → UT InitTilingData 往返校验:RASplitR 的 24 个标量字段、RARSplitCoreR1 展开嵌套结构后的 52 个字段,逐字段类型、偏移和值一致,大小分别为 192/416 字节。
  • SDK 注册查询:50000000/51000000/52000000 均返回 192 字节的 RASplitR 结构,1000 返回 416 字节的 RARSplitCoreR1 结构。
  • 完整 PR 的 35 个变更文件通过 pre-commit;OAT 实际扫描 34 个文件(CSV 按仓库配置排除),退出码 0。
  • 当前提交已完成下述 A5 真机精度回归;未启用原先注释的 Kernel 数值 UT,未进行 ascend960dt 真机验证,也未进行性能基线对比。

A6 范围核对

本算子当前主线注册的 A6 目标为 ascend960dt(DAV_9201)。OpDef 已将该目标指向 batch_norm_grad_v3_apt,ascendc_config.json 已包含其构建目标,ACLNN IsRegbase 与 Host IsRegbaseNpuArch 均已识别 DAV_9201;共享 Kernel 路径和 outputMask 序列化无需另加 A6 专属分支。本 PR 额外对齐 960DT binary.json 中的 output_mask:list_bool 属性,28 条配置与 ascend950 的配置语义一致。

使用仓库现有 Host/API UT 框架,在仓库外编译 DAV_9201 模拟探针:4 个测试通过,覆盖训练/推理全部 8 种 mask、非法 mask 长度、空指针及关闭输出。该验证检查 Host/API 路由,不包含 A6 Kernel 编译和设备执行。

ascend960pr(DAV_9202)尚无本算子的 OpDef/二进制配置,Host RegBase 识别也尚未覆盖该架构;本 PR 不新增这一平台,不能据此宣称 A6 全系列已适配。960DT 的设备精度/性能仍需目标环境验证。

当前提交的 A5 真机精度回归(2026-10-16)

验证提交:5c1864a56d2e413c99c22c6ffca7b39e9db166ae。设备为 Ascend950PR、0 号卡,CANN 9.3.0;TTK 版本为 eaa06de9ea65c5ffd0de5befd9e27483becc8976。

在独立目录同步并校验 23,535 个源码文件后,在目标机器完整编包并安装 bngv3v5c1864_nn。ACLNN 的头文件/动态库解析及 Kernel vendor 加载日志均确认使用该包;Kernel 全部结果为 BINARY_MATCH,直接执行本次构建的 release binary。

测试范围 实际执行 精度失败 实际输出比较
PR 内 ACLNN CSV 101 0 303
从 ACLNN CSV 派生的 Kernel mask 专项 76 0 142
仓内既有 Kernel CSV 80 0 178
合计 257 0 623
  • 覆盖 FP32/FP16/BF16、训练/推理,以及 ACLNN 全部 8 种 mask。19 个全 false ACLNN 用例通过;147 次禁用输出比较均为 100.0% close 一致,检查初始化哨兵值 13。
  • Kernel 专项实际命中全部 11 个 key:1000、900000、910000、10000000、20000000、31000000、32000000、40000000、50000000、51000000、52000000。所有 Kernel 结果的 tiling 尾部 mask 均与用例属性一致。
  • 156 个 Kernel 用例的越界检查全部 OK。比较器为 close,使用 CSV 的容差;最小逐输出元素一致率为 99.99866485595703%,所有用例达到既定容差要求。
  • Kernel 使用独立 FP64 数学参考,已与 PyTorch native backward 做 96 个 CPU 小例对照。原始 Kernel 的关闭输出,以及推理时不由该 Kernel 计算的参数梯度,不做数值比较;每个计入的 Kernel 用例均至少有一个有效输出实际比较。25 个无有效原始 Kernel 输出的派生用例未纳入 Kernel 套件,其接口语义由 ACLNN 用例覆盖。
  • 测试结束后已卸载本次 vendor 包并恢复原有注册状态。

安装包 SHA256:105a6d803e5a1392b3f2511257326a85d8ec40662ab7036745b7a2a5b3aa0811。本轮为精度验证,不据采集到的单次计时宣称性能改善或无回退。

关联的Issue

关联需求 Issue:6675

测试

范围 已完成的验证
A5 编包 当前提交在 Ascend950PR / CANN 9.3.0 完整编包通过,已核验 TTK 加载本次 bngv3v5c1864_nn 包
A5 ACLNN 精度 当前提交 101/101 通过,303 次实际输出比较;覆盖全部 8 种 mask,包含 19 个全 false 用例和禁用输出哨兵检查
A5 kernel 精度 当前提交 156/156 通过(80 个既有用例 + 76 个 mask 专项),320 次有效输出比较,实际覆盖 11 个 tiling key,越界检查全部 OK
A5 GEIR(此前记录,本轮未复跑) 9 个真机用例及 1 个旧 proto 默认属性用例通过,非法 mask 长度被拒绝
A2/A3 UT ascend910b、ascend910_93 两种构建配置下,各有 Host UT 142 个、API UT 94 个通过;其中 108 个模拟平台 tiling 用例检查缺省及全部 8 种 mask 的 tiling key 和完整序列化数据,32 个 A2/A3 workspace 用例覆盖普通/Fast ACLNN、训练/推理及 dweight/dbias 四种组合
A2/A3 编包 两种配置完整编包通过,各生成包含 14 个对应平台 kernel 二进制及 API、tiling、proto 库的 x86_64 .run 包;在远程 Ascend950 环境编译,尚未安装到 A2/A3 真机
标杆与静态检查 PyTorch 自动求导标杆与 aten.native_batch_norm_backward 的 384 组 CPU 对照通过;pre-commit 和 git diff --check 通过

文档更新

补充 proto 的 output_mask 属性说明。新增 tests/st/arch35/ttk_aclnn_batch_norm_grad_v3_st.csv 和 tests/assets/golden.py;golden 直接使用 CPU torch.nn.functional.batch_norm 前向及 torch.autograd.grad,采用 FP64 标杆。训练输入的保存统计量来自匹配的 torch.native_batch_norm 前向,并写回声明的 dtype。CSV 命名与接入方式参照 UndGenQkvRmsNormRopeCache;原有 kernel CSV 和 README 保持原版。

类型标签

AI/Agent生成声明

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 qianzehong 的贡献)
Qqianzehong成员
12 天前 创建了 pull request,commit 9f1eea25
Qqianzehong成员
12 天前 关联了issue:[Requirement|需求建议]: BatchNormGradV3 在 A5 上支持输出 mask
atomgit-bot
atomgit-bot
12 天前 评论:

变更摘要

本次变更在 A5(Ascend950/Ascend350)上为 BatchNormGradV3 新增 output_mask 属性,按 [dx, dweight, dbias] 顺序控制三个必选输出是否需要写入,默认全 true,仅当全 false 时 kernel 直接返回。改动贯穿 OpDef/proto 属性定义、tiling 属性解析与 tilingdata 透传、A5 各 tiling 模板与 kernel 的输出拷贝判断、二进制属性匹配配置,以及 ACLNN L2 接口,并补充了文档、UT 与 golden。A2/A3 的 kernel、tilingdata 布局、二进制配置与 Fast ACLNN/L0 launcher 参数保持原版。

主要改动

  • 新增 output_mask 算子属性与解析逻辑: 在 batch_norm_grad_v3_proto.h 与 batch_norm_grad_v3_def.cpp 中新增可选 ListBool 属性 output_mask,并新增 batch_norm_grad_v3_output_mask.h 的 ParseBatchNormGradV3OutputMask,将长度必须为 3 的布尔列表按位组装为 uint64_t(dx、dweight、dbias 分别对应 bit 0/1/2),长度非法时返回失败。
  • tilingdata 透传 mask: 在 batch_norm_grad_v3_tiling.h 的各 TilingData 结构新增 outputMask 字段、在基类新增 outputMask_{7} 成员,并在各 PostTiling 中调用 set_outputMask(outputMask_),同时 GetShapeAttrsInfo 中接入属性解析,使各 tiling 分支都能把 mask 下发到 kernel。
  • A5 kernel 按掩码跳过输出拷贝: 在 arch35 各 kernel 模板(如 BatchNormGradV3RARFullLoad、BatchNormGradV3RARecompute、BatchNormGradV3RASplitR、BatchNormGradV3Infer 等)新增 SetOutputMask 与 outputMask_,对 dx、dgamma、dbeta 的写出分别以 bit 0/1/2 判断;batch_norm_grad_v3_apt.cpp 在构造算子后判断 outputMask == 0 直接返回,否则设置掩码。
  • ACLNN L2 入口区分 A5 与 A2/A3: 新增带 outputMask 的 BatchNormGradV3 重载(batch_norm_backward.h/.cpp),以保留 A2/A3 原有 launcher 参数,A5 路径 aclnn_batch_norm_backward.cpp 传入 outputMask。
  • 二进制属性匹配与测试/文档配套更新: ascend350、ascend950 的 batch_norm_grad_v3_binary.json 为各配置项追加 output_mask(list_bool);新增 mask 回归 golden、ACLNN UT,并在 host/kernel UT 中断言 tilingdata 末尾 outputMask 为 7、覆盖全部 8 种 mask 组合与非法长度。

🧩 本次 Review 已使用自定义 Skill:

likedislike
不准确?
atomgit-bot
atomgit-bot
12 天前 评论:

代码审查

✅ 未发现问题


🧩 本次 Review 已使用自定义 Skill:

likedislike
不准确?
CANN-robotCANN-robot成员
12 天前 添加了label:cann-cla/yes
此处折叠了121条消息 查看更多
RuiWang_成员
9 天前 评论:

/lgtm
/approve

likedislike
CANN-robotCANN-robot成员
9 天前 添加了label:lgtm
CANN-robotCANN-robot成员
9 天前 关闭了关联的issue
CANN-robotCANN-robot成员
9 天前 合入了pull request
CANN-robot
CANN-robot成员
9 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike