Pull Request已成功合入, 合并人@CANN-robot
(感谢 huairuchen 的贡献)变更摘要
此 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仅接受uint8,gradY/gradX支持FLOAT/FLOAT16/BFLOAT16(BF16 仅限 DAV_3510 架构),内部将scale转为float32tensor 直传 kernel。 -
新增 L0 算子
l0op::DropoutV3Grad:定义在dropout_v3_grad.h/.cpp中,通过IsAiCoreSupport按gradY数据类型分发到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操作),并对float与float16/bf16(B16 路径需Cast到 fp32 计算后再转回)做了差异化处理。 -
新增 tiling 策略:
DropOutV3GradTiling类(drop_out_v3_grad_tiling_arch35.h/.cpp)计算 UB 分块因子(ubFactor)、多核分配(usedCoreNum、normBlockData/tailBlockData)、循环次数(normBlockLoop/tailBlockLoop)及尾块大小,将结果写入DropOutV3GradForAscendCTilingData,并注册 tiling key=100,预留 16MB AscendC 工具 workspace。 -
新增算子定义与推理形状:
drop_out_v3_grad_def.cpp注册DropOutV3Grad算子定义,支持DT_FLOAT/DT_FLOAT16/DT_BF16的grad_y、DT_UINT8/DT_UINT1的mask和固定DT_FLOAT的scale,共 6 组 dtype 组合;drop_out_v3_grad_infershape.cpp通过CommonInferShape将grad_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 校验用例)。


代码审查
审查总结
本次审查了 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 |
⛔ 需要修改


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
/approveor/lgtm- Commenting
/approveimplies 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. 👍


/approve


描述
新增DropoutV3Grad算子以及对应Aclnn接口aclnn_drop_out_v3_grad。使上层PTA调用可以在特定芯片下调用此aclnn接口,进而调用此算子。使上层PTA调用精度可以达到预定目标。
关联的Issue
https://gitcode.com/cann/ops-math/issues/2382
测试
进行了静态检查 二级冒烟 构建触发
UT测试
泛化ST测试千余条
充分验证其功能性。
文档更新
新增aclnn接口文档与算子readme文档
类型标签