已合并
SeluGrad算子对齐竞品实现,修复int类型结果溢出问题 #8771
yulianjie创建于 22 天前
SeluGrad算子对齐竞品实现,修复int类型结果溢出问题 #8771
已合并
Pull Request已成功合入, 合并人@CANN-robot
(感谢 yulianjie 的贡献)atomgit-bot
22 天前 评论:
22 天前 评论:
变更摘要
该 PR 主要对 selu_grad 算子进行「对齐竞品实现」的调整,核心是将负分支的判断边界从 <= 0 改为 < 0,并重构不同 dtype 的计算路径:float/half/bfloat16 改为在原 dtype 上直算,整数类型则按竞品(canndev TBE)的精度策略上浮到 FP16 或 FP32 计算后再回铸,同时简化了原有的中转 Cast 逻辑与缓冲区分配。
主要改动
- 负分支判断边界调整:
SeluGradSelectFp32中CompareScalar的CMPMODE::LE改为CMPMODE::LT,测试用例test_aclnn_selu_grad.cpp的判断逻辑也由out > 0分支改为out < 0分支,使零点归入SCALE * grad正分支。 - 新增原 dtype 直算路径: 新增
SeluGradSelectTfNative<T>,SeluGradDirectKit不再仅支持float,而是对float走原有SeluGradSelectFp32,对half/bfloat16直接使用输入 dtype 计算。 - 整数中转精度调整:
SeluGradTransitKit引入ComputeT(int32映射为float,int8/uint8映射为half),将原先「整型 → half → float」两步中转改为单次Cast上浮计算后,再以CAST_RINT回铸输出。 - 删除旧的 Cast 辅助函数并简化缓冲: 移除
SeluGradCastInToFp32与SeluGradCastFp32ToOut,将kNeedsHalfTransit重命名为kIntegerTransit,并简化SeluGradTransitKit的TBuf缓冲初始化。 - dtype 调度规则调整:
SeluGradOneDimOp与SeluGradBroadcastOp由「float走 Direct、其余走 Transit」改为「整数类型走 Transit、float/half/bfloat16走 Direct」。


不准确?
atomgit-bot
22 天前 评论:
22 天前 评论:
代码审查
审查总结
审查了全部 2 个变更文件:
activation/selu_grad/op_kernel/arch35/selu_grad.h:发现 1 个问题(P2)——SELU 梯度在outputs == 0边界处因CMPMODE::LE → LT选错分支,与 PyTorchselu_backward及 ST 参考torch.where(y > 0, ...)不一致。activation/selu_grad/examples/arch35/test_aclnn_selu_grad.cpp:发现 1 个问题(P3)——示例测试在outputs == 0处断言了与参考不一致的期望值,会掩盖上述边界回归。
按严重度统计:P0 0 个,P1 0 个,P2 1 个,P3 1 个。
总体风险判断:本次改动主体为"对齐竞品实现"的重构(half/bfloat16 原 dtype 直算、int8/uint8 走 FP16、int32 走 FP32),buffer 分配整体收敛、未引入新的 UB 溢出;唯一实质风险是负分支边界从 <= 0 收窄为 < 0,在 outputs == 0(即 x == 0)这一边界点上与声明的 PyTorch 兼容目标及 ST 参考产生约 40% 的相对偏差,建议将边界改回 LE 并同步修正示例测试的期望值。
| 类型 | 数量 |
|---|---|
| 🔴 阻塞 | 0 |
| 🟡 建议 | 1 |
💬 仅评论


不准确?
22 天前 添加了label:stat/needs-squash
22 天前 添加了label:cann-cla/yes
此处折叠了106条消息 查看更多
15 天前 删除了label:ci-pipeline-running
15 天前 添加了label:ci-pipeline-passed
15 天前 关闭了关联的issue
15 天前 合入了pull request
CANN-robot
15 天前 评论:
15 天前 评论:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


描述
本 PR 修复 Ascend950 arch35
SeluGrad与指定竞品 TensorFlowtf.raw_ops.SeluGrad实现不一致的问题。数学定义统一为:
主要改动:
outputs <= 0调整为outputs < 0,使零点进入scale * gradients分支。CAST_RINT直接回铸原 dtype,移除会导致 int32 精度损失的integer -> FP16 -> FP32旧中转路径。对标范围说明:本次产品契约明确以 TensorFlow
tf.raw_ops.SeluGrad为真值;outputs == 0的行为有意与 PyTorchelu_backward(is_result=True)的<= 0语义区分。关联的Issue
Fixes #4846
https://gitcode.com/cann/ops-nn/issues/4846
测试
bash build.sh --pkg --ops=selu_grad --soc=ascend950 --vendor_name=custom_nn -j840f91a7。tf.raw_ops.SeluGrad;整数按上述类型上浮和回铸规则处理。示例更新
activation/selu_grad/examples/arch35/test_aclnn_selu_grad.cpp中的输出说明与零点判断。类型标签
AI/Agent生成声明