Open
[feat][ops] norm_multiply_dropout前向算子实现(op_host/op_kernel,含pre-commit配置) #230
[feat][ops] norm_multiply_dropout前向算子实现(op_host/op_kernel,含pre-commit配置) #230
Open
penghuiyangAdd on 5 days ago
penghuiyangCollaborators
5 days ago

合入来源

问题/功能描述

norm_multiply_dropout 算子迁移(系列 PR 1/6):新增 LayerNorm + Multiply + Dropout 融合前向算子核心实现。

计算公式:

ln_ret = LayerNorm(x) * weight + bias
ln_out = u * ln_ret
output = dropout(ln_out, p=dropout_ratio)

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

修改方案描述

  • 新增 norm_multiply_dropout_forward/op_host/:tiling 头文件、check_params 入参校验(dtype 白名单按 SUPPORT_950 条件编译剔除 fp32、eps/dropout_ratio 开闭区间校验)、tiling 实现与算子注册
  • 新增 norm_multiply_dropout_forward/op_kernel/:AscendC 前向 kernel(LayerNorm+Multiply+Dropout 融合)、tilingKey 分发;kernel 内 dropout 按 keepProb 边界分支,keepProb <= 0(dropout_ratio=1.0)时清零输出,对齐 PyTorch 语义
  • 同步调整 .pre-commit-config.yaml(codespell 忽略词补充 dOut/dout,消除梯度形参名误报)
  • 本 PR 不含目录 CMakeLists 与 SOC 白名单接入,文件在 P5/P6 合入前不参与编译

是否涉及UT/ST

开发自检

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

变更摘要

本 PR 是 norm_multiply_dropout 算子迁移系列(1/6)的前向实现,新增 norm_multiply_dropout_forward 的 op_host 与 op_kernel 目录,实现 LayerNorm + Multiply + Dropout 融合前向计算(ln_ret = LayerNorm(x) * weight + bias、ln_out = u * ln_ret、output = dropout(ln_out, dropout_ratio))。包含 tiling 数据结构、入参校验、tiling 计算与算子注册,以及基于 tilingKey 分发的 AscendC 向量 kernel;本 PR 不含构建接入,合入后暂不参与编译。

主要改动

  • 算子定义与注册:新增 op_host/norm_multiply_dropout.cpp,通过 OpDef 注册 NormMultiplyDropout,定义输入 x/u/weight/bias/mask、输出 output/mean/var 及属性 eps/dropout_ratio,并绑定 InferShape、InferDataType、TilingFunc,同时注册 ascend910b、ascend910_93 及条件编译下的 ascend950 配置。
  • 入参校验与 tiling 计算:在 TilingFunc 中完成 shape 维度与一致性校验(x 为 2 维且列数限定 512/1024、weight/bias 为 1 维且与 x 列对齐)、dtype 白名单校验(fp16/bf16/fp32,SUPPORT_950 下剔除 fp32)、mask 为 uint8 且元素数为 x 元素数的 1/8(无 dropout 时允许 {1} 占位)、eps 取值 [1e-10,1e-4] 与 dropout_ratio 取值 [0.0,1.0] 的范围校验;随后按 UB 容量与行内存系数计算 singleBlockRows、大小核行数分配,并写入 tiling 数据。
  • tiling 数据结构与 tilingKey 模板参数:新增 norm_multiply_dropout_tiling.h 定义 NormMultiplyDropoutTilingData(bigCoreNum/littleCoreNum/avgCoreCalcRows/xRowCount/xColCount/singleBlockRows/useCoreNum/dropTmpMem/eps/dropoutRatio),并通过 norm_multiply_dropout_tilingKey.h 以 ASCENDC_TPL_BOOL_DECL(isNeedDrop, 0, 1) 声明模板参数,供 host 侧 GET_TPL_TILING_KEY 与 kernel 侧分发使用。
  • AscendC 前向 kernel 实现:新增 op_kernel/norm_multiply_dropout.cpp,模板类 kernels::NormMultiplyDropout<T, isNeedDrop> 按核心偏移分行处理,非 fp32 输入经 Cast 升精度计算后回写原类型;实现均值/方差两次 WholeReduceSum 规约并输出 mean、var,再完成标准化、仿射变换、u 相乘与 DropOut 融合。
  • dropout 边界语义处理:kernel 内计算 probValue = 1 - dropoutRatio,当 probValue > 0 时调用 DropOut(mode 3),当 keepProb <= 0(即 dropout_ratio=1.0)时改用 Duplicate 将输出清零,对齐 PyTorch 语义并避免除零产生异常值;isNeedDrop 为编译期分支,无需 dropout 时不申请 mask 相关缓冲。
likedislike
Incorrect?
atomgit-bot
atomgit-bot
5 days ago Comments:

代码审查

审查结论

按文件逐一确认(7/7 均已审阅):

文件 结论
op_host/CMakeLists.txt 1 项(P3:file(GLOB) 收集源文件)
op_host/norm_multiply_dropout.cpp 4 项(P2:除零保护顺序;P3×3:singleBlockRows 下溢/缺下界校验、%d/size_t 格式不匹配、isNeedDrop 重复计算)
op_host/norm_multiply_dropout_tiling.h no issues(字段类型/顺序、REGISTER_TILING_DATA_CLASS 与 op 名一致)
op_kernel/CMakeLists.txt no issues
op_kernel/norm_multiply_dropout.cpp 2 项(P2:Vector 写 UB 后缺 V→S 同步即 GetValue;P3:lnOutBuf 等死代码白占 UB)
op_kernel/norm_multiply_dropout_tilingKey.h no issues(仅一个模板字段,无历史字段顺序变更)
gitleaks 1 项(P1:未说明的二进制被提交到仓库根目录)

优先级统计:P0 × 0,P1 × 1,P2 × 2,P3 × 5,共 8 项。

整体风险判断:算子主流程(LayerNorm + Multiply + Dropout 的 tiling 拆分、均值/方差规约、dropout=1.0 清零分支)结构清晰,host 侧入参/dtype/shape 校验较完整,未见越界、泄漏或 32 位乘法链溢出的可触发路径(行/列上界 1e6×1024 在 int32 范围内)。主要风险集中在两处:一是 kernel 内标量读取前缺少 V→S 同步,属于会偶现的精度/正确性问题(需在真机上用回归用例确认);二是仓库根目录被提交了不透明的 gitleaks 二进制,属供应链风险,建议在合入前删除。其余为可维护性/构建可靠性层面的建议级问题。

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

⛔ 需要修改

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: YYTYY_, alliswell1024, 汪泽南, CUIZIBO, ddsxfr) ❌ (0/1)(You can also ask: tqy1998, 蒋皓洋, yangzhen92a, 曾伟, 项攀霄)

💡 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
67 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#1124 [ commitID:b9625252 ] 已完成
>>>代码风格自动修复执行成功(无修复内容)
阶段 任务名 状态 详情
编译构建 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