Closed
[Bug] BNLL NumPy golden evaluates overflowing unselected branches #6373
tianjunAdd on  Oct 7Closed at  21 days ago
tianjun
Oct 7 Create

问题背景

BNLL 的 NumPy Kernel golden 声称使用稳定分段公式,但 np.where 会先
求值两个分支。合法FP16/FP32大输入(如±1000)即使最终结果可表示,
未选分支的exp仍溢出;-inf还触发未选分支中的inf-inf invalid。
默认策略下常能返回正确值,但产生无意义RuntimeWarning;在-w error
或np.errstate(over/invalid='raise')环境,golden生成直接中断。
本项没有声称默认值都错误、也没有声称NPU算子存在同样问题。

复现

master95b0d8c04245d7136125b7b4e9b2c1dc83c5b0e0,真实注册
activation/bnll/tests/assets/golden.py::bnll_golden:

import numpy as np
with np.errstate(over='raise', invalid='raise'):
    bnll_golden(np.array([1000, -1000], dtype=np.float32))
# FloatingPointError: overflow encountered in exp

README支持FP16/FP32、0-8维和空Tensor,无输入值限制。
仓内arch35 kernel采用exp(-abs(x)),不需要未选正指数分支。

方案与验证

改为max(x,0)+log1p(exp(-abs(x))),保持float64中间精度、输入dtype/
shape及特殊值传播。只变更golden result表达式和原因注释,原生Ruff
其他改动AST等价;不改kernel、tiling或门禁。

Host Python3.12.14/NumPy2.3.5/CPU Torch2.14.1:32次实际注册golden
调用,基线20异常/12控制,修复32通过/0skip。两种dtype、警告作为错误
及NumPy严格错误两策略;大正负标量、有限极值向量、矩阵、inf/-inf/
NaN、普通值及两个空shape。TorchDouble logaddexp为独立参考,检查
dtype/shape/精确结果/输入字节。测试不复制golden函数,无运行边界mock。

三文件全部适用原生基础/Ruff/codespell/OATwrapper通过,OAT0非法
类型/版权头,BSDsed warning保留。只验证Host golden,不表示完成
TTK设备执行、CANN构建、算子UT、NPU精度或性能验证。

查重6181唯一全状态Issue(65页历史快照+新首100)、332开放PR全部
4页。#5235是kernel小指数log1p补偿;#10934的24文件不修改该registered
golden,本修复不重复其设备精度/tiling/UT修改。
新测试真实Ethan2026CANN2署名,保留生产Huawei;同步README命令/
范围。AI辅助调查、修复和验证。

likedislike
Ttianjun
Oct 7 Added label: bug-report
tianjun
Oct 7 Comments:

/assign @Ethan_Zou

likedislike
CANN-robotCANN-robotCollaborators
Oct 7 Assign Ethan_Zou as responsible person
Ttianjun
Oct 7 Associated pull request
CANN-robotCANN-robotCollaborators
21 days ago Close issue
CANN-robotCANN-robotCollaborators
21 days ago Added label: resolved