已合并
[fix] A5 代际 Dropout 反向随机数算子数值对齐 PyTorch/GPU #5737
[fix] A5 代际 Dropout 反向随机数算子数值对齐 PyTorch/GPU #5737
已合并
yucaopanmu创建于 8 天前
yucaopanmu成员
8 天前

【合入来源】

【修改方案】

  • 将新 CANN 算子 aclnnDropoutV3Grad 接入 op-plugin 中 native_dropout_backward 的 A5(Ascend950)路径,使 A5 上 dropout 反向的数值结果对齐 PyTorch/GPU(H20)。
  • 核心改动是:A5 上把 PyTorch 语义的缩放因子 scale 直接透传给新算子,内核以纯乘法链 gradX = gradY * mask * scale 完成计算,消除旧链路中"宿主侧由 scale 换算 p(1 - 1/scale)、算子内部再由 p 还原缩放因子(1/(1-p))"两次浮点换算引入的精度误差。A2/A3 代际调用路径保持不变,对外 API 与语义不变。

详细设计文档见合入来源中关联的RFC

【资料变更】

不涉及

【接口变更】

  • A5 反向场景 native_dropout_backward 跨代码仓调用 CANN 新增 aclnnDropoutV3Grad 算子接口
  • 其余 A5 前向场景 native_dropout 与A2/A3 代际调用路径保持不变
  • 不涉及客户面可见的接口变更

【功能验证】

  • 对修改后的代码在 A5 反向 + 新版本 CANN (支持aclnnDropoutV3Grad 算子接口)场景下进行 UT 测试和 ATK 泛化测试
  • 已添加对应 UT 测试用例,ATK泛化测试待验证

测试方法详见合入来源中关联的RFC

【CheckList】

likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 yucaopanmu 的贡献)
Yyucaopanmu成员
8 天前 创建了 pull request,commit 2681ec94
Yyucaopanmu成员
8 天前 关联了里程碑:TorchNPU-v26.2.0
Yyucaopanmu成员
8 天前 关联了issue:[RFC]: A5 代际 Dropout 反向算子数值对齐 PyTorch/GPU(aclnnDropoutV3Grad 接入 native_dropout_backward)
atomgit-bot
atomgit-bot
8 天前 评论:

变更摘要

本 PR 修复 A5(Ascend950)代际 native_dropout_backward 反向随机算子数值与 PyTorch/GPU(H20)不对齐的问题。核心改动是在 NativeDropoutKernelNpuOpApi.cppnative_dropout_backward 中新增 A5 分支:当 c10_npu::GetSocVersion() >= c10_npu::SocVersion::Ascend950 时,将 PyTorch 语义的缩放因子 scale 直接透传给新 CANN 算子 aclnnDropoutV3Grad,由内核以纯乘法链 gradX = gradY * mask * scale 完成计算,消除旧链路中"宿主侧由 scale 换算 p1 - 1/scale)、算子内部再由 p 还原缩放因子(1/(1-p))"两次浮点换算引入的精度误差;A2/A3 代际调用路径保持不变,对外 API 与语义不变。

主要改动

  • 新增 A5 代际算子接入分支:在 native_dropout_backward 中按 SoC 版本分流,A5 及以上直接调用 aclnnDropoutV3Grad 并透传原始 scale,跳过旧链路中 aclnnDropoutDoMask 的宿主侧/算子侧两次浮点换算,使数值对齐 PyTorch/GPU;A2/A3 路径与 DO_COMPATIBILITY(aclnnDropoutDoMask, ...) 逻辑保持不变
  • A5 分支的边界条件处理与参数校验:新增 TORCH_CHECK 校验 scale 必须为 0 或大于等于 1;空 mask 时直接返回按 mask.sizes() 形状创建的空张量;scale == 1p == 0,无 dropout)时返回 grad_output.clone()scale == 0p == 1,全丢弃)时返回 at::zeros,其余情况才走 EXEC_NPU_CMD(aclnnDropoutV3Grad, ...) 内核路径
  • 补充 A5 场景 UT 用例:在 test_native_dropout_backward.py 中新增 @SupportedDevices(['Ascend950']) 用例,覆盖 scale == 0scale == 1scale > 1 下的 fp32/fp16/bf16、空 mask 以及非法 scale(0.5)抛错场景,并新增 _packed_bit_mask/_expand_bit_mask 辅助方法构造按位打包的 UINT8 mask 与 CPU 侧 bool mask 展开逻辑
  • 原有用例调整:将原有 test_native_dropout_backward_fp32/test_native_dropout_backward_fp16 归入 SupportedDevices(['Ascend910A', 'Ascend910B']) 约束,并抽取公共测试方法 _test_native_dropout_backward 供各用例复用
likedislike
此处折叠了70条消息 查看更多
梁松伟
梁松伟成员
2 天前 评论:

/approve

likedislike
ascend-robotascend-robot成员
2 天前 添加了label:approvedlgtm
ascend-robotascend-robot成员
2 天前 关闭了关联的issue
ascend-robotascend-robot成员
2 天前 合入了pull request
ascend-robot
ascend-robot成员
2 天前 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike