Closed
[Documentation|文档反馈]: aclnnCos 资料把 FLOAT16 的精度保证范围写成 [-10^7,10^7](超出 fp16 上限 65504 达 152.7 倍) #4213
liuhanwen8Add on  12 days agoClosed at  1 day ago
liuhanwen8
liuhanwen8
12 days ago Create

现象

math/cos/docs/aclnnCos&aclnnInplaceCos.md:371 把 FLOAT16 的精度保证范围写成 [-10^7, 10^7],但 fp16 的最大有限值只有 65504。

原文:

- <term>Atlas训练系列产品</term>、<term>Atlas A2系列产品</term>、<term>Atlas A3系列产品</term>:FLOAT、FLOAT16、BFLOAT16数据类型的输入数据范围为[-10^7,10^7]时满足精度要求,超过数值范围无法保证,请使用CPU进行计算。

1e7 / 65504 = 152.7 倍。用户按字面构造 |x| ∈ (65504, 1e7] 的 FLOAT16 输入会先溢出成 inf,与「满足精度要求」直接冲突。

期望

按 dtype 拆开书写(参照同文档 :374 的 310P 段已正确写成 [-65504, 65504]):

  • FLOAT、BFLOAT16:[-10^7, 10^7]
  • FLOAT16:[-65504, 65504]

复现

# repro_fp16_range.py  ——  退出码 1 = 缺陷成立
import math, re, sys
DOC = "math/cos/docs/aclnnCos&aclnnInplaceCos.md"
text = open(DOC, encoding="utf-8").read()
pat = re.compile(r"FLOAT、FLOAT16、BFLOAT16数据类型的输入数据范围为\[?-?10\^7,?\s?10\^7\]?")
hits = [(i + 1, ln) for i, ln in enumerate(text.splitlines()) if pat.search(ln)]
assert hits, "未找到该声明"
lineno, line = hits[0]
print("[INFO] 命中 %s:%d" % (DOC, lineno))

import numpy as np
stored = float(np.float16(1.0e5))          # 声明区间内的一个值
print("[INFO] fp16(1e5) = %s" % stored)
if math.isinf(stored):
    print("[DEFECT] %s:%d 把 FLOAT16 精度上界写成 1e7,fp16 上限仅 65504"
          % (DOC, lineno))
    sys.exit(1)
sys.exit(0)

实测输出(CANN 9.2.0 / Atlas 910B2):

[INFO] 命中 aclnnCos&aclnnInplaceCos.md:371
[INFO] fp16(1e5) = inf
[DEFECT] aclnnCos&aclnnInplaceCos.md:371 把 FLOAT16 精度上界写成 1e7,fp16 上限仅 65504
rc=1

上板佐证(aclnnInplaceCos,inputRef 单形参):

输入 x (fp16) 输出 说明
65504 -0.2205810546875 正确,cos(65504) = -0.220548055
65505 -0.2205810546875 已不能分辨(应为 -0.939913318)
1e5 nan 输入已溢出为 inf,输出 cos(inf)=nan
1e6 / 1e7 nan 同上

环境

  • CANN 9.2.0(/usr/local/Ascend),Atlas 910B2,npu-smi 26.1.1
  • 仓:ops-math master,math/cos
likedislike
liuhanwen8liuhanwen8
12 days ago Added label: documentation
陈思
陈思Collaborators
11 days ago Comments:

您好,感谢反馈!核对 cann/ops-math@ae087b184,约束说明确实把多种 dtype 合并为 [-10^7,10^7],没有显式区分 FLOAT16 自身的有限表示范围;分类型说明会更清楚。

需要同时区分“构造张量前的实数”和“算子实际收到的值”:FLOAT16 最大有限值是 65504,65505 转成 FLOAT16 后会舍入到 65504,因此此时应比较 cos(65504);1e5 转换后若为 inf,算子实际收到的已不是原先有限的 1e5。您列出的这两类结果不能单独证明 Cos 对其实际有限输入计算错误,也不能把 cos(inf) 的 NaN 视为有限范围精度保证被违反。

一个可行的资料澄清方向是按 dtype 分开写,并将精度保证限定为“该类型可表示的有限输入与算法精度范围的交集”,说明输入转换的舍入/溢出与算子计算精度是两回事。FLOAT16 的有限表示上界可以明确为 65504,但是否对该整个有限区间满足特定误差标准,仍应依据对应产品实现和验证口径,不能仅由静态脚本重新作出保证。我们会继续评估这部分表述的一致性。

likedislike
陈思陈思Collaborators
11 days ago Assign chen_0715 as responsible person
陈思陈思Collaborators
11 days ago Added label: pending-confirmation
陈思陈思Collaborators
11 days ago Removed label: pending-confirmation
CchenyifengCollaborators
11 days ago Assign sakuraqqz as responsible person
CchenyifengCollaborators
11 days ago Removed responsible person chen_0715
SsakuraqqzCollaborators
6 days ago Associated pull request
CANN-robotCANN-robotCollaborators
1 day ago Close issue
CANN-robotCANN-robotCollaborators
1 day ago changed custom state from 进行中 to 已完成
CANN-robotCANN-robotCollaborators
1 day ago Added label: resolved