Merge blocked
变更摘要
本 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 双接口文档。


代码审查
逐文件审查结论
| 文件 | 结论 |
|---|---|
.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 |
💬 仅评论


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


ascend docs pipeline is running...


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | 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 | >>> |
- compile : 运行流水线
- retry : 重试流水线所有失败子任务
- retry <任务名> : 仅重试指定失败子任务
- stop : 停止流水线


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。


合入来源
问题/功能描述
norm_multiply_dropout 算子迁移(系列 PR 4/7):新增 torch 适配层(torch.ops 注册与自动求导)及前向算子接口文档。
修改方案描述
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_dropoutpytorch_npu_helper.hpp:EXEC_NPU_CMD 宏浮点属性直接透传 double(修复引用绑定右值问题);算子符号查找失败后回退系统libopapi.so,兼容 CANN 内置算子是否涉及UT/ST
开发自检