已合并
feat: 新增acos_grad_v2算子A2(Ascend910B)适配实现 #4371
镜花水月1tachi创建于 7月31日
feat: 新增acos_grad_v2算子A2(Ascend910B)适配实现 #4371
已合并
镜花水月1tachi创建于 7月31日
镜花水月1tachi
7月31日

描述

新增AcosGrad反向梯度算子的A2(Ascend 910B / DAV_2201)适配版本AcosGradV2,实现以下功能:

  • 算子公式:z = -dy / sqrt(1 - y²)
  • 支持数据类型:FP16 / FP32 / BF16,ND格式
  • A2架构适配:仅注册ascend910b,tiling/kernel使用arch32
  • 标准ACLNN registry-invoke工程(op_host/op_kernel/op_api)
  • 补充UT:op_api参数校验 + op_host infershape/tiling,共12例全部通过
  • 补充ATK ST用例:tests/st/aclnnAcosGradV2/(300条,由 all_aclnn_acos_grad_v2.yaml + generator 自动生成)

关联的Issue

https://gitcode.com/cann/ops-math/issues/2499

测试

已完成以下验证:

套件 用例数 结果
ATK 精度测试(atk case 生成 300 条,NPU vs CPU golden) 300 Pass(300/300)

CI/工程验证:

项目 结果
编译验证 Pass
op_host UT Pass, 5 tests
op_api UT Pass, 7 tests
PreSmoke_ATK_Test_A2 Pass

精度测试详情(ATK,300条,high_performance 标准):

  • 覆盖 fp16/fp32/bf16 × 1-4D × 大 shape(最大 1M 元素)× 边界值(inf/-inf/nan)
  • 300/300 全部通过,acc_pass_result = Pass
  • 精度标杆:CPU torch 同公式参考实现(-dy / sqrt(1 - y²)),NPU 输出逐元素比对

性能测试详情(加速比,标杆 = torch_npu 的 torch.acos 反向多算子链):

  • CANN 当前未提供同名官方 aclnnAcosGrad 单算子,故以 torch_npu 的 torch.acos 反向路径为标杆;该路径在 NPU 上被拆分为多算子链 Acos(前向重算)+ Mul×2 + Neg×2 + Rsqrt + Adds,本算子将其融合为单个 kernel。
  • 加速比 = 标杆反向链 device 核时之和 / 本算子单 kernel device 核时(profiler 采集,shape [1024,1024],10 轮平均)
数据类型 标杆反向链 (us) 本算子 (us) 加速比
FP32 26.4 6.97 3.8x
FP16 22.6 7.90 2.9x
BF16 26.1 8.09 3.2x
  • 三种数据类型平均加速比约 3.3x;加速主要来自融合(减少反向链多次基础算子的 HBM 来回搬运与启动开销)。

文档更新

  • 新增算子README.md(含性能说明加速比章节)

类型标签

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 镜花水月1tachi 的贡献)
镜花水月1tachi镜花水月1tachi
7月31日 创建了 pull request,commit c8af1468
atomgit-bot
atomgit-bot
7月31日 评论:

变更摘要

本 PR 为 Atlas A2(Ascend910B / DAV_2201)平台新增 AcosGradV2 算子,实现前向 Acos 的反向梯度计算,公式为 z = -dy / sqrt(1 - y^2)。整个算子完全新增于 experimental/math/acos_grad_v2/ 目录下,包含标准的 ACLNN 注册-调用工程结构(op_host / op_kernel / op_api / aclnn),支持 FP32 / FP16 / BF16 三种数据类型和 ND 格式,仅注册 ascend910b 平台。Kernel 采用 Ascend C 向量 API 实现,FP16/BF16 路径先转为 FP32 计算再转回,FP32 路径直接计算。

主要改动

  • 算子定义与注册:在 op_host/acos_grad_v2_def.cpp 中定义 AcosGradV2 OpDef,声明 y(前向输入)、dy(上游梯度)、z(输出梯度)三个张量的数据类型(FP16/FP32/BF16)、格式(ND)及 AiCore 配置,仅通过 AddConfig("ascend910b", ...) 注册 A2 平台。

  • 形状与类型推导op_host/acos_grad_v2_infershape.cpp 实现 InferShape4AcosGradV2,将输出 z 的 shape 直接设为输入 y 的 shape,确保三者 shape 一致。

  • Tiling 切分逻辑op_host/arch32/acos_grad_v2_tiling.cpp 实现 AcosGradV2TilingFunc,根据 UB 大小(184KB)、元素对齐(512)、数据类型等信息计算 block 数量、UB 分块大小等参数,写入 AcosGradV2TilingData 结构体并通过 ASCENDC_TPL_SEL_PARAM 按 dtype 选择模板实例。

  • Ascend C Kernel 实现op_kernel/arch32/acos_grad_v2.h 提供泛型模板 KernelAcosGradV2<T>(FP16/BF16:Cast→FP32 计算→Cast 回原类型)和 float 全特化版本(直接 FP32 计算,省去 Cast),核心计算流程为 Mul→Muls(-1)→Adds(1)→Sqrt→Muls(dy, -1)→Div,通过双缓冲 TQuePipeBarrier 实现流水线并行。

  • ACLNN L0/L2 APIop_api/acos_grad_v2.cpp 实现 l0op::AcosGradV2()(形状推导→平台/dtype 校验→AiCore 调度),op_api/aclnn_acos_grad_v2.cpp 实现 aclnnAcosGradV2GetWorkspaceSizeaclnnAcosGradV2(参数校验→Contiguous→ViewCopy→计算执行),对外暴露标准 ACLNN 接口。

likedislike
atomgit-bot
atomgit-bot
7月31日 评论:

代码审查

审查总结

优先级 数量
P0 0
P1 0
P2 3
P3 1

各文件审查结果:

文件 结论
CMakeLists.txt 无问题
README.md 无问题
docs/design.md 无问题
examples/test_aclnn_acos_grad_v2.cpp P2: 资源泄漏(多条错误返回路径未释放已分配资源)
op_api/aclnn_acos_grad_v2.cpp 无问题
op_api/aclnn_acos_grad_v2.h 无问题
op_api/acos_grad_v2.cpp P2: AllocTensor 返回值缺少空指针检查
op_api/acos_grad_v2.h 无问题
op_host/acos_grad_v2_def.cpp 无问题
op_host/acos_grad_v2_infershape.cpp 无问题
op_host/arch32/acos_grad_v2_tiling.cpp 无问题
op_kernel/arch32/acos_grad_v2.cpp 无问题
op_kernel/arch32/acos_grad_v2.h P2: FP32 特化 Compute 中 Div 后缺少 PipeBarrier
op_kernel/arch32/acos_grad_v2_tiling_data.h 无问题
op_kernel/arch32/acos_grad_v2_tiling_key.h 无问题
tests/reports/performance_report.md P3: 顶部残留文本 "zui"
tests/reports/precision_report.md 无问题
tests/st/design/03_参数定义.yaml 无问题
tests/st/design/04_测试因子.yaml 无问题
tests/st/design/05_约束定义.yaml 无问题
tests/st/design/06_求解配置.yaml 无问题
tests/st/design/07_因子值.csv 无问题(空占位文件)
tests/st/testcases/aclnnAcosGradV2_l0_coverage_report.yaml 无问题
tests/st/testcases/aclnnAcosGradV2_l0_test_cases.csv 无问题
tests/st/testcases/aclnnAcosGradV2_l1_test_cases.csv 无问题

整体风险评估:中低风险。 三个 P2 问题均不会在正常执行路径上触发(AllocTensor 失败极为罕见、示例代码的错误路径在实际运行中不会走到、缺少 PipeBarrier 的 FP32 路径当前精度测试全通过),但建议修复以提升代码健壮性和一致性。算子核心计算逻辑(tiling 切分、kernel 公式实现)正确,精度与性能验证均达标。

类型 数量
🔴 阻塞 0
🟡 建议 3

💬 仅评论

likedislike
CANN-robotCANN-robot成员
7月31日 添加了label:cann-cla/no
CANN-robotCANN-robot成员
7月31日 添加了label:stat/needs-squash
此处折叠了227条消息 查看更多
chenxingyu18成员
8月4日 评论:

/check-pr

likedislike
CANN-robot
CANN-robot成员
8月4日 评论:

The MR can not be merged, because of CodeReview discussion not resolved

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

likedislike
Cchenxingyu18成员
8月4日 解决了最后一个问题
CANN-robotCANN-robot成员
8月4日 关闭了关联的issue
CANN-robotCANN-robot成员
8月4日 合入了pull request