Open
[feat][ops] norm_multiply_dropout反向算子op_kernel实现 #232
[feat][ops] norm_multiply_dropout反向算子op_kernel实现 #232
Open
penghuiyangAdd on 5 days ago
penghuiyangCollaborators
5 days ago

合入来源

问题/功能描述

norm_multiply_dropout 算子迁移(系列 PR 3/6):新增反向算子 norm_multiply_dropout_backward 的 op_kernel 实现。

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

修改方案描述

  • 新增 norm_multiply_dropout_backward/op_kernel/:AscendC 反向 kernel(d_x / d_u / d_weight / d_bias 四梯度计算)、tilingKey 分发与 kernel CMakeLists
  • kernel 内 dropout 反向梯度计算按 keepProb 边界分支:keepProb <= 0(dropout_ratio=1.0)时清零梯度,避免 DropOut API 除零产生 NaN/Inf,对齐 PyTorch 语义
  • 本 PR 不含构建接入,文件在 P5 合入前不参与编译

是否涉及UT/ST

开发自检

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

变更摘要

本 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 时,不调用 DropOut API,而是用 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>。
likedislike
Incorrect?
atomgit-bot
atomgit-bot
5 days ago Comments:

代码审查

审查结论

变更文件逐项确认

  • 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

⛔ 需要修改

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

💡 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
AtlasAccountAtlasAccountCollaborators
5 days ago Added label: ci-pipeline-running
74 messages are collapsed here。 See more
ascend-robotascend-robotCollaborators
4 days ago Removed label: docs-ci-pipeline-running
ascend-robotascend-robotCollaborators
4 days ago Added label: docs-ci-pipeline-success
AtlasAccountAtlasAccountCollaborators
4 days ago Removed label: ci-pipeline-running
AtlasAccountAtlasAccountCollaborators
4 days ago Added label: ci-pipeline-passed
AtlasAccount
AtlasAccountCollaborators
4 days ago Comments:
流水线 PR-pipeline_ops-rec#1109 [ commitID:e284b9f8 ] 已完成
>>>代码风格自动修复执行成功(无修复内容)
阶段 任务名 状态 详情
编译构建 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