Merge blocked
变更摘要
本 PR 为 norm_multiply_dropout 算子迁移系列的第 3 个 PR,新增了反向算子 norm_multiply_dropout_backward 的 AscendC op_kernel 实现。核心是模板类 NormMultiplyDropoutBackward<T, isNeedDrop>,它按核数切分行区间,完成 d_x / d_u / d_weight / d_bias 四路梯度的计算,并包含 dropout 反向、LayerNorm 反向公式推导、float 与非 float 类型的搬运/转换分支以及多核间梯度原子累加;同时新增 tilingKey 声明头文件,以支持是否启用 dropout 的模板分发。本 PR 不含构建接入,这些文件在系列最后一个 PR 合入前不参与编译。
主要改动
- 反向 kernel 主体实现:新增
norm_multiply_dropout_backward.cpp,其中的模板类NormMultiplyDropoutBackward通过init读取NormMultiplyDropoutBackwardTilingData(含bigCoreNum、littleCoreNum、avgCoreCalcRows、xRowCount、xColCount、singleBlockRows、eps、dropoutRatio等)完成大核/小核行区间分配与多缓冲区初始化,process按loop/tail分块依次执行搬运、计算、搬出。 - 四梯度计算流程:
Compute先做 dropout 反向,再计算x_hat = (x - mean) / sqrt(var + eps)、ln_out = x_hat * weight + bias,进而得到d_u = d_out * ln_out、d_ln_out = d_out * u,用逐元素累加得到d_bias与d_weight,并通过WholeReduceSum求行和后按 LayerNorm 反向公式得到d_x。 - keepProb 边界处理:当
probValue = 1 - dropoutRatio不大于 0 时,不调用DropOutAPI,而是用Duplicate将dOutLocal清零,对齐 PyTorch 在dropout_ratio=1.0时梯度为 0 的语义,并规避除零导致的 NaN/Inf。 - 数据类型与搬运分支:区分
T是否为float,分别走CopyInNoCast/CopyOutNoCast与CopyInWithCast/CopyOutWithCast,非 float 路径通过Cast在float计算域与原始类型间转换,mean/var 用DataCopyPad按行搬入。 - 多核梯度聚合与模板分发:
process末尾通过SetAtomicAdd<float>()将各核的dWeightLocal2/dBiasLocal2原子累加写回dWeightGM/dBiasGM;新增norm_multiply_dropout_backward_tilingKey.h,用ASCENDC_TPL_ARGS_DECL/ASCENDC_TPL_SEL为NormMultiplyDropoutBackward声明isNeedDrop布尔模板参数(0/1),对应 kernel 入口norm_multiply_dropout_backward<isNeedDrop>。


代码审查
审查结论
变更文件逐项确认
ascendc/activation/norm_multiply_dropout/norm_multiply_dropout_backward/op_kernel/CMakeLists.txt:no issues(与ln_mul、in_linear_silu_backward的 op_kernel CMake 完全同构,npu_op_kernel_options/sources/library+TILING_LIBRARY cust_optiling+npu_op_package_add用法一致,无硬编码路径与 GLOB)。ascendc/activation/norm_multiply_dropout/norm_multiply_dropout_backward/op_kernel/norm_multiply_dropout_backward_tilingKey.h:no issues(include guard、ASCENDC_TPL_ARGS_DECL/ASCENDC_TPL_SEL写法与in_linear_silu_backward_tilingKey.h一致,模板参数顺序与 kernel 入口template <bool isNeedDrop>匹配)。ascendc/activation/norm_multiply_dropout/norm_multiply_dropout_backward/op_kernel/norm_multiply_dropout_backward.cpp:发现 12 个问题(见下)。
问题统计
- P1:1 个(
ASSERT缺分号,若宏为do{}while(0)即为编译失败;本 PR 不接构建,缺陷会延迟到 P6 暴露) - P2:7 个(
useCoreNum未使用导致缺越界保护、TBuf 累加器原子搬出前缺 V→MTE3 同步、dWeight/dBias 依赖外部清零、reduce/mask 依赖 xColCount 对齐但无校验、GM 偏移 int32 乘法链溢出、GetValue前缺 V→S 同步、DropOut 原地 src==dst) - P3:5 个(
loop *= BUFFER_NUM空操作、未使用成员与被遮蔽的info、oneBLockElements拼写、reduceTemp复用 dropBuf 的容量上限、逐行小向量指令与 weight/bias 重复搬运的开销)
总体风险判断
该 kernel 数学公式(dU/dLnOut/dWeight/dBias/layer-norm 反向 dX 的推导与 keepProb<=0 清零分支)经逐行核对是对的,分核与尾块切分逻辑也自洽;但工程实现层面的隐患较多且集中在"时序同步"与"隐性前置约束"两类:V→MTE3 / V→S 同步缺失会使结果偶发错误(难定位),xColCount 对齐、useCoreNum 边界、GM 预清零三项完全依赖本 PR 之外的 tiling/host 契约而 kernel 侧没有任何兜底。由于本 PR 明确不参与编译、且不含 UT/ST,这些问题最早也会在 P6 构建接入与首个反向用例时才暴露,建议在 P6 之前修正(尤其 P1/P2 各条),风险等级评为中高。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 1 |
| 🟡 建议 | 7 |
⛔ 需要修改


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: tanfeng_cc, Fionazm, littleboyyoh, AICore, KingNineun) | ❌ (0/1)(You can also ask: FngSeven, tqy1998, hjj12345678_, 蒋皓洋, 张源川) |
💡 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. 👍


| 阶段 | 任务名 | 状态 | 详情 |
|---|---|---|---|
| 编译构建 | 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 : 停止流水线


合入来源
问题/功能描述
norm_multiply_dropout 算子迁移(系列 PR 3/6):新增反向算子
norm_multiply_dropout_backward的 op_kernel 实现。修改方案描述
norm_multiply_dropout_backward/op_kernel/:AscendC 反向 kernel(d_x / d_u / d_weight / d_bias 四梯度计算)、tilingKey 分发与 kernel CMakeListskeepProb <= 0(dropout_ratio=1.0)时清零梯度,避免 DropOut API 除零产生 NaN/Inf,对齐 PyTorch 语义是否涉及UT/ST
开发自检