已关闭
[Bug-Report|缺陷反馈]: Softsign FP16/BF16 与 tf.nn.softsign 精度不一致且空 Tensor Kernel 直调挂起 #4673
yulianjie创建于  8月10日关闭于  29 天前
yulianjie成员
8月10日 创建

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

Ascend950 上 Softsign 的 AscendC 实现存在以下两个问题:

  1. FP16/BF16 计算路径先将输入提升到 FP32,并在 FP32 中完成 abs(x) + 1,直到最终输出才回落到原 dtype。TensorFlow tf.nn.softsign 会在低精度路径中保留原 dtype 的中间舍入,因此部分边界数据与 TensorFlow 结果不一致。
  2. 输入为真正的空 Tensor(例如 shape 为 (0,))时,Host 侧设置 blockDim=1 后返回,Kernel 仍进入 ElementwiseSch 调度,kernel 直调会停留在 OnDynProfiling,无法正常结束。

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

  • Hardware: Ascend950
  • Repository/branch: cann/ops-nn master,activation/softsign
  • Execution mode: ops-test-kit TTK kernel 直调
  • Reference: TensorFlow 2.16.1 tf.nn.softsign
  • Dtypes: FP32、FP16、BF16

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

  1. 使用 tf.nn.softsign 作为 Golden;BF16 输入直接构造为 tf.bfloat16,不升精度计算。
  2. 使用 TTK kernel 模式运行 Softsign FP16/BF16 用例,并采用严格 close 比较,可观察到低精度边界数据不一致。
  3. 构造 FP32、FP16、BF16 的 (0,) 输入并进行 kernel 直调,可观察到任务停留在 OnDynProfiling
  4. 对照计算公式:y = x / (1 + abs(x))。低精度路径需要在 abs(x) + 1 后先舍入回输入 dtype,再继续后续计算。

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

  • FP32、FP16、BF16 的计算顺序及低精度舍入行为与 tf.nn.softsign 一致。
  • 空 Tensor 直接返回空输出,输出 shape/dtype 与输入一致。
  • 空 Tensor kernel 直调能够正常结束,不进入无有效任务的 Elementwise 调度。
  • 修复前:空 Tensor 用例停留在 OnDynProfiling,AIC 占用持续为 100%,plog 中没有额外硬件异常或错误码。
  • 修复后:Softsign 正式 500 条 kernel 直调用例严格 --compare close 为 500/500 PASS;FP32/FP16/BF16 空 Tensor 专项为 3/3 PASS;标量专项为 3/3 PASS。

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

likedislike
Yyulianjie成员
8月10日 添加了label:bug-report
yuning_chenyuning_chen成员
8月10日 将 lianjieyu 设为负责人
CANN-robotCANN-robot成员
29 天前 关闭了 issue
CANN-robotCANN-robot成员
29 天前 添加了label:resolved