已合并
[fix] A5 代际 Dropout 反向随机数算子数值对齐 PyTorch/GPU #5737
yucaopanmu创建于 8 天前
[fix] A5 代际 Dropout 反向随机数算子数值对齐 PyTorch/GPU #5737
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 yucaopanmu 的贡献)8 天前 创建了 pull request,commit 2681ec94
8 天前 关联了里程碑:TorchNPU-v26.2.0
Yyucaopanmu
8 天前 关联了issue:[RFC]: A5 代际 Dropout 反向算子数值对齐 PyTorch/GPU(aclnnDropoutV3Grad 接入 native_dropout_backward)
8 天前 关联了issue:[RFC]: A5 代际 Dropout 反向算子数值对齐 PyTorch/GPU(aclnnDropoutV3Grad 接入 native_dropout_backward)
atomgit-bot
8 天前 评论:
8 天前 评论:
变更摘要
本 PR 修复 A5(Ascend950)代际 native_dropout_backward 反向随机算子数值与 PyTorch/GPU(H20)不对齐的问题。核心改动是在 NativeDropoutKernelNpuOpApi.cpp 的 native_dropout_backward 中新增 A5 分支:当 c10_npu::GetSocVersion() >= c10_npu::SocVersion::Ascend950 时,将 PyTorch 语义的缩放因子 scale 直接透传给新 CANN 算子 aclnnDropoutV3Grad,由内核以纯乘法链 gradX = gradY * mask * scale 完成计算,消除旧链路中"宿主侧由 scale 换算 p(1 - 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 == 1(p == 0,无 dropout)时返回grad_output.clone(),scale == 0(p == 1,全丢弃)时返回at::zeros,其余情况才走EXEC_NPU_CMD(aclnnDropoutV3Grad, ...)内核路径 - 补充 A5 场景 UT 用例:在
test_native_dropout_backward.py中新增@SupportedDevices(['Ascend950'])用例,覆盖scale == 0、scale == 1、scale > 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供各用例复用


ascend-robot
8 天前 评论:
8 天前 评论:
此处折叠了70条消息 查看更多
梁松伟
2 天前 评论:
2 天前 评论:
/approve


2 天前 添加了label:approvedlgtm
2 天前 关闭了关联的issue
2 天前 合入了pull request
ascend-robot
2 天前 评论:
2 天前 评论:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


【合入来源】
【修改方案】
aclnnDropoutV3Grad接入 op-plugin 中native_dropout_backward的 A5(Ascend950)路径,使 A5 上 dropout 反向的数值结果对齐 PyTorch/GPU(H20)。scale直接透传给新算子,内核以纯乘法链gradX = gradY * mask * scale完成计算,消除旧链路中"宿主侧由 scale 换算 p(1 - 1/scale)、算子内部再由 p 还原缩放因子(1/(1-p))"两次浮点换算引入的精度误差。A2/A3 代际调用路径保持不变,对外 API 与语义不变。【资料变更】
不涉及
【接口变更】
native_dropout_backward跨代码仓调用 CANN 新增aclnnDropoutV3Grad算子接口native_dropout与A2/A3 代际调用路径保持不变【功能验证】
aclnnDropoutV3Grad算子接口)场景下进行 UT 测试和 ATK 泛化测试【CheckList】