已关闭
[Bug-Report|缺陷反馈]: InplaceApplyAdagradDA在FP16场景存在舍入边界精度误差 #4692
zhongheng创建于  8月11日关闭于  8月12日
zhongheng
8月11日 创建

Thanks for sending an issue! Please fill in the following template to help quickly solve your problem.

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

InplaceApplyAdagradDA 在 Ascend950 FP16 场景下存在舍入边界精度误差。测试侧报告 22 个用例的 output0(var_out)MARE 超限;本地对已捕获输入的 L1_010、L1_128、L1_570 三例进行逐元素分析后确认:

  • output0 的所有数值差异均为相邻的 ±1 FP16 ULP;
  • 三例均只有 1 个近零 lane 实际触发 MARE 超限;
  • output1、output2 与 golden bitwise 一致;
  • FP32 路径未发现该问题。

问题由三层舍入误差叠加产生:

  1. 原 FP32→FP16 使用 CAST_ROUND,midpoint tie 结果与 golden 的 round-to-nearest-even 不一致;
  2. 改为 CAST_RINT 后,默认 FP32 Sqrt 的数 ULP 误差仍可能将结果推过 FP16 舍入边界;
  3. Sqrt 切换为 0-ULP 后,默认 FP32 Div 在部分 midpoint 附近仍有残留。

以 L1_010 最差点为例,正确 FP32 商为 -5.3942203521728516e-06,恰好位于 FP16 0x805a 和 0x805b 的 midpoint;约 1 个 FP32 ULP 的上游误差即可改变最终 FP16 舍入结果。

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

  • 昇腾硬件型号:Ascend 950DT_9582 V120
  • CANN 版本:9.2.0
  • 操作系统:Ubuntu 20.04.6 LTS x86_64
  • Python:3.11.9(ttk_venv)
  • TTK:3.0.0,revision c210daaf
  • 验证通路:TTK kernel 精度/内存回归、捕获输入严格回放、Ascend950 package build、Host UT、固定输入性能 ABBA

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

  1. 基于修复前的 ops-nn master 构建 Ascend950 InplaceApplyAdagradDA 自定义算子包。
  2. 使用测试侧报告用例的 shape、dtype、range、use_locking 和标量约束构造 FP16 输入;固定 PYTHONHASHSEED=0、seed=42、单设备单进程运行。
  3. 对 L1_010、L1_128、L1_570 使用已捕获的 8 个输入二进制进行逐输入严格回放。
  4. 以 TensorFlow ApplyAdagradDA 语义生成 golden,按 stat_rel_err 比较三个输出。
  5. 检查 output0 的不等元素、FP16 bit pattern、ULP 距离和触发最大相对误差的 lane。

修复前可观察到 output0 在 midpoint 邻域出现相邻 1 FP16 ULP 差异,近零 lane 的 MARE 超过阈值;output1、output2 不受影响。

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

  • FP16 路径应遵循 round-to-nearest、ties-to-even 语义,避免上游 Sqrt/Div 误差将结果推入相邻 FP16 舍入区间。
  • 已报告同规格用例的 output0、output1、output2 均应通过精度校验和内存检查。
  • FP32 路径和 FP32 kernel 产物不应发生变化。
  • 修复应使用 CANN 正式支持的通用精度模式,不得针对 testcase、shape、元素数或 scalar 值增加特判。
  • 性能代价应被独立测量并作为合入决策项明确披露。

修复前定位结果:

  • CAST_RINT-only 固定流:17/20 PASS,残留 L1_010、L1_128、L1_570;
  • 三份残留输入的 output0 差异均为相邻 ±1 FP16 ULP,output1、output2 bitwise 一致;
  • L1_010 / L1_128 / L1_570 的 output0 MARE 分别为 0.0109078、0.0159546、0.0201297。

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

likedislike
zhongheng
8月11日 评论:

/assign

likedislike
CANN-robotCANN-robot成员
8月11日 将 zhongheng 设为负责人
Zzhongheng
8月11日 修改了issue 的描述
Zzhongheng
8月11日 关联了pull request:fix(inplace_apply_adagrad_da): 修复 FP16 舍入边界精度问题
CANN-robotCANN-robot成员
8月12日 关闭了 issue
CANN-robotCANN-robot成员
8月12日 添加了label:resolved