已关闭
[Bug-Report|缺陷反馈]: SeluGrad与TensorFlow/canndev竞品语义及整数精度不一致 #4846
yulianjie创建于  20 天前关闭于  13 天前
yulianjie成员
20 天前 创建

Describe the current behavior / 问题描述 (Mandatory / 必填)

Ascend950 arch35 的 SeluGrad 实现与本算子指定竞品 TensorFlow tf.raw_ops.SeluGrad 及 canndev TBE 实现存在语义和计算精度差异:

  1. 旧 Kernel 使用 outputs <= 0 选择负分支,导致 outputs == 0 时执行 gradients * (outputs + scale * alpha);TensorFlow/canndev 的定义是仅当 outputs < 0 时执行负分支,零点应执行 scale * gradients
  2. FP16/BF16 旧路径统一上浮 FP32 计算,与 TensorFlow 在输入 dtype 上计算常量和中间结果的行为不一致。
  3. int8、uint8、int32 旧路径均经过 integer -> FP16 -> FP32,其中 int32 会在 FP16 中转时丢失有效位;int8/uint8 也没有遵循 canndev 在 FP16 域计算的策略。
  4. 整数输出旧路径经 FP16 二次中转回铸,无法严格复现 canndev f1628IntegerFlag=True 的就近舍入回铸语义。

修复前 TTK 二进制精度对比中,确认存在 18 条整数确定性不一致用例和 2 条 FP16 不一致用例。

Environment / 环境信息 (Mandatory / 必填)

  • Hardware:Ascend950PR_9579 V100
  • CANN:9.2.0
  • Repository:cann/ops-nn
  • Operator/API:activation/selu_grad / aclnnSeluBackward
  • Architecture:arch35
  • TTK:3.0.0,revision 40f91a7
  • Golden:TensorFlow tf.raw_ops.SeluGrad

Steps to reproduce the issue / 重现步骤 (Mandatory / 必填)

  1. 基于 PR 修改前的 activation/selu_grad 构建 Ascend950 自定义算子包。
  2. 使用 tf.raw_ops.SeluGrad 作为竞品 Golden;整数输入按 canndev 规则处理:int8/uint8 上浮 FP16,int32 上浮 FP32,计算完成后以 RNE 和饱和语义回铸原 dtype。
  3. 使用 TTK kernel 模式运行覆盖 FP16、BF16、int8、uint8、int32 的 SeluGrad 用例,并启用 binary compare。
  4. 检查结果 CSV,可观察到零点边界、int32 大值以及整数回铸场景出现逐元素不一致。

Describe the expected behavior / 预期结果 (Mandatory / 必填)

实现应与 TensorFlow/canndev 契约一致:

outputs < 0  : y = gradients * (outputs + 1.7580993408473768...)
outputs >= 0 : y = 1.0507009873554805... * gradients
  • FP16/BF16 在输入 dtype 上完成计算。
  • int8/uint8 上浮 FP16,int32 上浮 FP32。
  • 整数结果使用就近舍入并回铸到原 dtype,输出 dtype 保持与输入一致。
  • 连续形状和广播形状均应与 Golden 二进制一致。

修复验证结果:

  • Ascend950 包构建成功,6/6 dtype 对象及运行时变体生成成功。
  • 原确定性整数失败集:18/18 PASS,binary 100%,内存检查 PASS。
  • 全部非资源型整数回归:34/34 PASS,其中 int8 10/10、uint8 10/10、int32 14/14。
  • FP16/BF16 防回归:17/17 PASS,其中 FP16 14/14、BF16 3/3。
  • 4 条超大资源用例未纳入完整整数回归;其输入张量本身占用 1.365-1.974 GiB,原结果为 Golden 资源失败或 profile crash,不属于确定性精度不一致。

Special notes for this issue/备注 (Optional / 选填)

  • 关联修复 PR:https://gitcode.com/cann/ops-nn/pull/8771
  • PR commits:08b4bfdee7fd7812c0085ea4b4f2f7bc0cc6b58b32dd425aa92f0b0a78a8c5507bcc431b6318e69f
  • 本问题的竞品真值明确为 TensorFlow tf.raw_ops.SeluGrad 与 canndev TBE;outputs == 0 的行为有意与 PyTorch elu_backward(is_result=True)<= 0 分支语义区分。
likedislike
Yyulianjie成员
20 天前 添加了label:bug-report
yuning_chenyuning_chen成员
20 天前 将 lianjieyu 设为负责人
Yyulianjie成员
20 天前 关联了pull request:SeluGrad算子对齐竞品实现
CANN-robotCANN-robot成员
13 天前 关闭了 issue
CANN-robotCANN-robot成员
13 天前 添加了label:resolved