已关闭
[Bug-Report|缺陷反馈]: Ascend 950 AddRmsNorm trans 先乘 gamma 导致 FP32 中间结果提前溢出 #6679
liangyuhua创建于  17 天前关闭于  16 天前
liangyuhua
liangyuhua成员
17 天前 创建

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

Ascend 950 / regbase 的 AddRmsNorm trans 模板按照 (x1+x2) * gamma * rstd 计算输出。当输入与 gamma 都是有限值、归一化结果也应为有限值时,先乘 gamma 仍可能让 FP32 中间结果提前溢出,最终输出 Inf。InplaceAddRmsNorm 共用该模板,存在相同问题。

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

  • 昇腾硬件型号:Ascend 950PR_9579。
  • CANN 版本:9.2.0。
  • Python 版本:3.12.9。
  • 代码基线:cann/ops-nn master 6a974e237106d696582924758b0f16170a0a86b3。
  • 测试入口:TTK kernel,Promote,默认精度门限,单进程 --pc=1。

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

  1. 构建 Ascend 950 的 AddRmsNorm / InplaceAddRmsNorm 算子包并加载对应二进制。
  2. 使用 FP32 ND 输入:x1.shape=x2.shape=[28673,1],gamma.shape=[1],epsilon=1e-6。
  3. 固定 x1=4294967296 (2**32)、x2=0、gamma=1.2676506002282294e30 (2**100),命中 trans 模板 tilingKey=4000。
  4. 旧实现先计算 xSum * gamma = 2**132,超过 FP32 有限范围,输出 y 为 Inf。

关联 PR 已在两个算子的 arch35 ST CSV 中各添加一条上述固定输入的回归用例,Inplace 用例保持 (0, None, 1) 输出别名关系。

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

先以 FP32 计算 xSum * rstd,再乘 gamma;该输入的 y 应为有限值 2**100。两次乘法间不转回低精度。按规定精度容差验收,不要求逐位一致。

同输入、分别加载基线及修复后 vendor 二进制的上板冒烟结果:

用例 修复前 修复后
24 条 FP32/BF16 trans 溢出用例 24 FAIL 24 PASS
其余 30 条冒烟用例 28 PASS / 2 FAIL 28 PASS / 2 FAIL

剩余两条失败为未改动的 full-load / SplitD 路径的 FP16 近零精度问题,主线同样复现,未放宽门限。本地定向 CI 已通过。4,024 条完整测试、失败项基线复测和 CannbotHarness 静态审查仍在运行,当前未宣称全量通过。

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

修复范围仅为 arch35 / 950 trans 的两次乘法顺序,以及两条永久回归用例;golden 和其他芯片实现不变。

关联 PR:https://gitcode.com/cann/ops-nn/merge_requests/11953

likedislike
liangyuhualiangyuhua成员
17 天前 添加了label:bug-report
yuning_chenyuning_chen成员
17 天前 将 liangyuhua 设为负责人
CANN-robotCANN-robot成员
16 天前 关闭了 issue
CANN-robotCANN-robot成员
16 天前 添加了label:resolved