Open
[feat][ops] norm_multiply_dropout反向算子op_host实现与torch适配层 #233
[feat][ops] norm_multiply_dropout反向算子op_host实现与torch适配层 #233
Open
penghuiyangAdd on 5 days ago
penghuiyangCollaborators
5 days ago

合入来源

问题/功能描述

norm_multiply_dropout 算子迁移(系列 PR 4/7):新增 torch 适配层(torch.ops 注册与自动求导)及前向算子接口文档。

本系列 7 个 PR 基于同一基线独立拆分,每个 PR 的 diff 仅包含自身变更(均 <1000 行),建议按 P1→P7 顺序合入;构建接入(目录 CMakeLists)在 P6 生效,SOC 白名单与索引/README 文档在 P7 生效。

修改方案描述

  • 新增 torch_extension/ 适配套件:前向 norm_multiply_dropout_plugin.cpp、反向 norm_multiply_dropout_backward_plugin.cpp,注册 torch.ops.ops_rec.norm_multiply_dropout_forward / _backward;norm_multiply_dropout_autograd.py 实现自动求导并对外暴露统一接口 ops_rec.ascendc.activation.norm_multiply_dropout
  • 公共头文件 pytorch_npu_helper.hpp:EXEC_NPU_CMD 宏浮点属性直接透传 double(修复引用绑定右值问题);算子符号查找失败后回退系统 libopapi.so,兼容 CANN 内置算子
  • 新增前向算子 aclnn/torch 双接口文档
  • 适配层构建由公共 torch_plugin CMake 自动发现,无需额外接入

是否涉及UT/ST

开发自检

likedislike
Merge blocked
atomgit-bot
atomgit-bot
5 days ago Comments:

变更摘要

本 PR 是 norm_multiply_dropout 算子迁移系列的第四部分,主要新增 torch 适配层:在 torch_extension/ 下提供前向 norm_multiply_dropout_plugin.cpp 与反向 norm_multiply_dropout_backward_plugin.cpp,分别注册 torch.ops.ops_rec.norm_multiply_dropout_forward 与 norm_multiply_dropout_backward;并通过 norm_multiply_dropout_autograd.py 完成自动求导注册,对外暴露 ops_rec.ascendc.activation.norm_multiply_dropout 接口。同时修改公共头文件 pytorch_npu_helper.hpp 的符号查找逻辑,使 CANN 内置算子可以回退到系统 libopapi.so;此外补充前向算子文档,并调整 codespell 忽略词,使适配层可以在 torch.compile(inductor) 与 loss.backward() 场景下工作。

主要改动

  • 新增 torch 前向算子注册:norm_multiply_dropout_plugin.cpp 定义 norm_multiply_dropout_forward(入参 x/u/weight/bias/eps/dropout_ratio,返回 (output, mean, var, mask)),在 PrivateUse1 与 Meta 两个后端分别实现,Meta 实现用于 inductor trace 阶段的 shape/dtype 推断。
  • 新增加 torch 反向算子注册:norm_multiply_dropout_backward_plugin.cpp 定义 norm_multiply_dropout_backward,接收上游梯度 d_out 与前向保存的 mean/var/mask,输出 (d_x, d_u, d_weight, d_bias);其中 d_weight/d_bias 初始化为全 0,供后续按行累加。
  • 自动求导与统一接口:norm_multiply_dropout_autograd.py 通过 torch.library.register_autograd 注册 _setup_context/_backward,将 mean/var/mask 保存在上下文供反向使用,并把 activation.norm_multiply_dropout 覆盖为仅返回 output 的 norm_multiply_dropout_wrapper,同时做重复注册的幂等保护。
  • dropout 掩码在 plugin 层内部生成:新增 DropoutGenMask 调用 aclnnDropoutGenMaskV2 生成按 128 位对齐的 uint8 位掩码,将掩码通过第 4 个输出返回供反向使用;当 dropout_ratio 小于 NO_DROP_THRESHOLD 时跳过 dropout,返回只有 1 个元素的占位 mask。
  • 公共头文件符号查找回退:pytorch_npu_helper.hpp 中 GetOpApiFuncAddrForVendorList 在 vendor 库查找失败后,改为回退查询系统 libopapi.so,以兼容 aclnnDropoutGenMaskV2 等 CANN 内置算子;同时 .pre-commit-config.yaml 的 codespell 忽略词补充 dOut/dout,并随本 PR 提交前向 README 与 aclnn/torch 双接口文档。
likedislike
Incorrect?
atomgit-bot
atomgit-bot
5 days ago Comments:

代码审查

逐文件审查结论

文件 结论
.pre-commit-config.yaml 无问题(仅向 codespell -L 列表追加 dOut,dout,YAML 结构合法)
ascendc/activation/norm_multiply_dropout/torch_extension/norm_multiply_dropout_autograd.py 无问题(register_autograd/setup_context/_backward 的输入输出与算子 schema 一致;inputs 6 元解包与 wrapper 位置传参匹配;except RuntimeError 幂等判断只吞“已注册”类错误,其余 raise;与 in_linear_silu/_autograd.py 写法一致)
.../norm_multiply_dropout_backward_plugin.cpp 2 项:dWeight/dBias dtype 未回转(P2)、Meta 的 dU shape 分叉(P3)
.../norm_multiply_dropout_plugin.cpp 2 项:缺少维度校验(P3)、mask 随机源不可复现/热路径构造 random_device(P3)
ascendc/common/torch_plugin/pytorch_npu_helper.hpp 1 项:回退 libopapi.so 后报错文案未同步(P3,可选改进)

发现汇总:P0 × 0,P1 × 0,P2 × 1,P3 × 4。

整体风险判断:改动主体是新增适配层 + 一处公共符号查找回退。回退逻辑本身(vendor 优先、系统库兜底、缓存 handler)语义正确,前向 aclnn 参数顺序与文档原型(x,u,weight,bias,mask,eps,dropoutRatio,output,mean,var)一致,float 属性以 double 透传符合 aclnn 生成接口约定,Meta 实现与真实实现的输出 shape 基本对齐。主要风险集中在反向输出的 dtype 契约(半精度训练时 d_weight/d_bias 恒为 float32),建议合入前修正;其余为维度校验、随机可复现性与报错可维护性方面的低优先级改进。

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

💬 仅评论

likedislike
Incorrect?
ascend-robotascend-robotCollaborators
5 days ago Added label: ascend-cla/no
ascend-robot
ascend-robotCollaborators
5 days ago Comments:

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.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.


PR Approval Progress

⚠️ This PR does not yet meet the following requirements:lgtm (requires ≥ 2 person(s) per module)、approve (requires ≥ 1 person(s) per module)

Module Approval Details

module lgtm status approve status
repo-Ascend/ops-rec ❌ (0/2)(You can also ask: beau1, dknightmare, yz53665, wljss, qq_51779706) ❌ (0/1)(You can also ask: yangzhen92a, tqy1998, 蒋皓洋, 龙万彬, 李雄)

💡 Tip:

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

CLA Signature Pass

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

likedislike
ascend-robot
ascend-robotCollaborators
5 days ago Comments:

ascend docs pipeline is running...

likedislike
62 messages are collapsed here。 See more
AtlasAccountAtlasAccountCollaborators
4 days ago Added label: ci-pipeline-passed
AtlasAccount
AtlasAccountCollaborators
4 days ago Comments:
流水线 PR-pipeline_ops-rec#1097 [ commitID:bcee5ccb ] 已完成
>>>代码风格自动修复执行成功(无修复内容)
阶段 任务名 状态 详情
编译构建 PR-build-SAST-check ✅ COMPLETED >>>
Build-2.7.1_arm ✅ COMPLETED >>>
Build-2.10.0_arm ✅ COMPLETED >>>
Build-2.7.1_X86 ✅ COMPLETED >>>
Build-2.10.0_X86 ✅ COMPLETED >>>
恶意代码检查 Antipoison ✅ COMPLETED >>>
编码安全与规范检查 pre-commit ✅ COMPLETED >>>
clang-tidy ✅ COMPLETED >>>
开源片段检查 SCA ✅ COMPLETED >>>
开发者测试 presmoke ✅ COMPLETED >>>
流水线 PR-pipeline_ops-rec ✅ COMPLETED >>>
此流水线已支持下列评论快捷指令,仅PR创建者和白名单成员评论有效
  • compile : 运行流水线
  • retry : 重试流水线所有失败子任务
  • retry <任务名> : 仅重试指定失败子任务
  • stop : 停止流水线
likedislike
alliswell1024Collaborators4 days agoStart code review2
ascendc/activation/norm_multiply_dropout/norm_multiply_dropout_backward/op_host/norm_multiply_dropout_backward.cpp
@@ -0,0 +231,4 @@
231+ gert::Shape* outputShape = context->GetOutputShape(0);
232+ OPS_LOG_E_IF_NULL("xShape", xShape, return ge::GRAPH_FAILED);
233+ OPS_LOG_E_IF_NULL("outputShape", outputShape, return ge::GRAPH_FAILED);
234+ *outputShape = *xShape;
alliswell10244 days agoComments:

InferShape/InferDataType 只处理了第 0 个输出,图模式下 d_u/d_weight/d_bias 的形状和 dtype 都是空的

问题描述:OpDef 注册了 4 个输出 d_x/d_u/d_weight/d_bias(L291-L310),但 InferShape 只取了 GetOutputShape(0) 并赋值(本行),InferDataType 只执行了 SetOutputDataType(0, inputDataType)(L241)。d_u 应该和 x 同 shape,d_weight/d_bias 应该是 [C] 且固定 FP32,现在这三路既没有 shape 也没有 dtype。aclnn 单算子路径不受影响,因为输出 tensor 是 plugin 自己按正确 shape/dtype 创建后传进去的;但走 GE/ACL 图模式时,图编译器拿不到 d_u/d_weight/d_bias 的形状和类型——d_weight/d_bias 在 OpDef 里是 DT_FLOAT,而 InferDataType 只把 output 0 设成输入 dtype,另外三路可能被当成 fp16/bf16,kernel 却按 float* 写,结果是类型对不上或编译期直接报「输出类型未推断」。PR 描述里写的是「inductor 兼容」,而 torch.compile 走的是 Meta 实现,所以现有 graph 用例发现不了这个问题。

建议:InferShape 里补 *context->GetOutputShape(1) = *xShape(d_u 与 u 同 shape),GetOutputShape(2)/[3] 设为 1 维长度 xShape->GetDim(1);InferDataType 里把 output 1 设成输入 dtype、output 2/3 设成 DT_FLOAT。

likedislike
penghuiyangCollaborators
4 days ago Comments:

非问题,mean var输出只有一个类型,无虚InferShape指定

PpenghuiyangCollaborators
4 days ago Modify description of pull request
PpenghuiyangCollaborators
4 days ago Modify description of pull request