已合并
新增DropoutV3Grad算子以及对应Aclnn接口aclnn_drop_out_v3_grad #4034
huairuchen创建于 7月14日
新增DropoutV3Grad算子以及对应Aclnn接口aclnn_drop_out_v3_grad #4034
已合并
huairuchen创建于 7月14日
huairuchen
huairuchen成员
7月14日

描述

新增DropoutV3Grad算子以及对应Aclnn接口aclnn_drop_out_v3_grad。使上层PTA调用可以在特定芯片下调用此aclnn接口,进而调用此算子。使上层PTA调用精度可以达到预定目标。

关联的Issue

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

测试

进行了静态检查 二级冒烟 构建触发
UT测试
泛化ST测试千余条
充分验证其功能性。

文档更新

新增aclnn接口文档与算子readme文档

类型标签

  • Bug修复
  • 新特性
  • 性能优化
  • 文档更新
  • 其他,请描述:
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 huairuchen 的贡献)
huairuchenhuairuchen成员
7月14日 创建了 pull request,commit 75885190
atomgit-bot
atomgit-bot
7月14日 评论:

变更摘要

此 PR 为 CANN 算子库新增 DropoutV3Grad 算子,实现 dropout 反向传播计算。核心公式为 gradX_i = (mask_i == 1) ? scale * gradY_i : 0,其中 mask 为位掩码(bit-packed uint8),scale 来自前向的 1/(1-p)。该算子支持 Ascend910 和 Ascend910_95 两档架构,根据 gradY 数据类型自动选择 AICORE 或 AICPU 执行路径,并在 kernel 层对 scale==0(全丢弃)和 scale==1(全保留)场景做了快速分支优化。PR 包含完整的 API 接口层、L0 算子层、tiling 策略、kernel 实现、推理形状及配套的 L0/L2/推理形状/tiling/kernel 五层单元测试与示例代码。

主要改动

  • 新增公共 API aclnnDropoutV3GradGetWorkspaceSize / aclnnDropoutV3Grad:定义在 aclnn_dropout_v3_grad.h/.cpp 中,采用标准两段式调用,对外 scale 接受 double 类型,mask 仅接受 uint8gradY/gradX 支持 FLOAT/FLOAT16/BFLOAT16(BF16 仅限 DAV_3510 架构),内部将 scale 转为 float32 tensor 直传 kernel。

  • 新增 L0 算子 l0op::DropoutV3Grad:定义在 dropout_v3_grad.h/.cpp 中,通过 IsAiCoreSupportgradY 数据类型分发到 DropoutV3GradAiCore(AICORE 路径)或 DropoutV3GradAiCpu(AICPU 回退),并注册为 DropOutV3Grad 算子类型。

  • 新增 AscendC kernel 实现:位于 op_kernel/arch35/drop_out_v3_grad.h 中的 DropOutV3GradImpl<T> 模板类,采用双缓冲(DOUBLE_BUFFER=2)流水线,Process() 中根据 scale 与 0/1 的 epsilon 比较自动选择三条分支(全丢弃直接写零、全保留直接拷贝、正常路径按 32 位 mask 寄存器逐位解包执行 Select 操作),并对 floatfloat16/bf16(B16 路径需 Cast 到 fp32 计算后再转回)做了差异化处理。

  • 新增 tiling 策略DropOutV3GradTiling 类(drop_out_v3_grad_tiling_arch35.h/.cpp)计算 UB 分块因子(ubFactor)、多核分配(usedCoreNumnormBlockData/tailBlockData)、循环次数(normBlockLoop/tailBlockLoop)及尾块大小,将结果写入 DropOutV3GradForAscendCTilingData,并注册 tiling key=100,预留 16MB AscendC 工具 workspace。

  • 新增算子定义与推理形状drop_out_v3_grad_def.cpp 注册 DropOutV3Grad 算子定义,支持 DT_FLOAT/DT_FLOAT16/DT_BF16grad_yDT_UINT8/DT_UINT1mask 和固定 DT_FLOATscale,共 6 组 dtype 组合;drop_out_v3_grad_infershape.cpp 通过 CommonInferShapegrad_x 的形状推断为与 grad_y 一致。

  • 新增二进制配置与完整测试覆盖drop_out_v3_grad_binary.json 为 ascend950 平台定义了 6 组二进制文件映射(f32_uint8/f16_uint8/bf16_uint8/f32_uint1/f16_uint1/bf16_uint1);同时新增 L0 UT(验证三种 dtype 构图返回非空)、L2 UT(覆盖成功路径及空指针/dtype非法/shape不等/mask尺寸不符/超8维等 12 个用例)、推理形状 UT、tiling UT(成功及非法 dtype/scale 非标量共 11 个用例)和 kernel UT(覆盖三分支、mask 全0/全1/交替、尾块非对齐、极小规模、多核多循环、scale 接近 1 等 10 个 golden 校验用例)。

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

代码审查

审查总结

本次审查了 DropoutV3Grad 反向算子新增的 24 个文件,共发现 7 个问题

优先级 数量 说明
P1 2 kernel Compute 函数中 mask UB buffer 越界读取(float32 和 float16/bf16 两个分支独立存在)
P2 1 tiling 中 ubFactor_ 可能 ≤ 0 未校验
P3 4 死代码字段、文档链接错误、参数名错误、文档示例代码残留变量

各文件审查结论

文件 结论
CMakeLists.txt 无问题
README.md 无问题
docs/aclnnDropoutV3Grad.md 3 个 P3 问题(链接错误、参数名错误、示例代码残留)
examples/test_aclnn_drop_out_v3_grad.cpp 无问题
op_api/aclnn_dropout_v3_grad.cpp 无问题
op_api/aclnn_dropout_v3_grad.h 无问题
op_api/dropout_v3_grad.cpp 无问题
op_api/dropout_v3_grad.h 无问题
op_host/arch35/drop_out_v3_grad_tiling.cpp 无问题
op_host/arch35/drop_out_v3_grad_tiling.h 1 个 P3 问题(死字段 ubEle
op_host/arch35/drop_out_v3_grad_tiling_arch35.cpp 1 个 P2 问题(ubFactor_ 未校验)
op_host/arch35/drop_out_v3_grad_tiling_arch35.h 无问题
op_host/config/ascend950/drop_out_v3_grad_binary.json 无问题
op_host/drop_out_v3_grad_def.cpp 无问题
op_host/drop_out_v3_grad_infershape.cpp 无问题
op_kernel/arch35/drop_out_v3_grad.h 2 个 P1 问题(mask buffer 越界读取)
op_kernel/drop_out_v3_grad.cpp 无问题
tests/ut/op_api/test_aclnn_dropout_v3_grad_l0.cpp 无问题
tests/ut/op_api/test_aclnn_dropout_v3_grad_l2.cpp 无问题
tests/ut/op_host/arch35/test_drop_out_v3_grad_infershape.cpp 无问题
tests/ut/op_host/arch35/test_drop_out_v3_grad_tiling.cpp 无问题
tests/ut/op_host/test_drop_out_v3_grad_infershape.cpp 无问题
tests/ut/op_kernel/CMakeLists.txt 无问题
tests/ut/op_kernel/test_drop_out_v3_grad.cpp 无问题

整体风险评估

中高风险。两个 P1 问题(kernel mask buffer 越界读取)在当前单测用例(count=256/1024,ubFactor=256)下因 CeilAlign 对齐特性侥幸未触发硬件异常,但在实际推理/训练场景中(更大的 ubFactor,如 bf16 下 ~30K 元素)将导致确定的 UB 越界读取,可能引发硬件异常或计算结果静默错误。建议在合入前修复 kernel 中 mask 循环迭代次数的计算逻辑。P2 的 ubFactor_ 校验缺失在正常平台配置下不会触发,但缺少防御性编程。文档问题(P3)不影响功能但会误导用户。

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

⛔ 需要修改

likedislike
CANN-robotCANN-robot成员
7月14日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
7月14日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here
You can get sig-info at here


PR Approval Progress

Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
*/*/README.md 陈娇, xuejinghui (2/2) 陈娇 (1/1)
*/*/docs/acl*.md 陈娇, xuejinghui (2/2) 陈娇 (1/1)
*/*/op_api/*.h 汤磊, xuejinghui (2/2) 汤磊 (1/1)
*/*/op_host/*_def.cpp 汤磊, xuejinghui (2/2) 汤磊 (1/1)
repo-cann/ops-math 宋恺, xuejinghui (2/2) 宋恺, xuejinghui (2/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

huairuchen, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
此处折叠了322条消息 查看更多
songkai111成员
15 天前 评论:

/approve

likedislike
chenjiao成员
15 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
15 天前 添加了label:lgtmapproved
CANN-robotCANN-robot成员
15 天前 关闭了关联的issue
CANN-robotCANN-robot成员
15 天前 合入了pull request