Open
[Documentation|文档反馈]: aclnnGer 资料自相矛盾::86/:96/:106 三行 dtype 均列 BFLOAT16,:135 设备注却写 A2 不支持;且 out 行 BF16 无法靠输入侧推出来,该列实际不可用 #4311
liuhanwen8Add on  11 days ago
liuhanwen8
liuhanwen8
11 days ago Create

涉及条目

math/ger/docs/aclnnGer.md / 接口 aclnnGer / dtype 声明面(三处列表 + 一处设备注)

原文片段

参数表 self(第 86 行)、vec2(第 96 行)、out(第 106 行)的「数据类型」列逐字相同:

FLOAT、FLOAT16、DOUBLE、BFLOAT16、INT8、INT16、INT32、INT64、UINT8、BOOL、COMPLEX64、COMPLEX128

参数表之后的设备注(第 135 行):

<!-- npu="A3,910b,910" id7 -->
- Atlas A3系列产品、Atlas A2系列产品、Atlas训练系列产品:不支持BFLOAT16。
<!-- end id7 -->

out 行的「使用说明」列(第 105 行)写的是:

数据类型是self与vec2推导之后可转换的数据类型。shape为{self.shape[0], vec2.shape[0]}。

问题

两处自相矛盾,且其中一处导致 out 列的 BFLOAT16 在 A2 上根本不可能被用到:

  1. 第 86/96/106 行 vs 第 135 行:三行 dtype 列表都写了 BFLOAT16,但同一页的设备注说
    A2 / A3 / Atlas训练 都不支持 BFLOAT16。设备注只在 A2 上生效(950 走 regbase 分支),
    等于「列表说支持、注脚说不支持」,读者无法判断该信哪个。

  2. out 行的 BFLOAT16 是死条目:资料自己规定 out 必须是「self 与 vec2 推导后可转换」的类型。
    A2 上 self/vec2 都不能是 BF16(实测 161002),而 promot 结果也不可能是 BF16
    (fp16+fp16=fp16、fp32+fp32=fp32,没有产生 bf16 的组合),因此 CanCast(任意promote, BF16)
    虽然放行,但 BF16 作为 out 值在语义上永远「推不出来」。列表却把它写成可选项之一。

实测取证

设备:Atlas A2(Ascend910B3)/ CANN 9.2.0 / cann/ops-math @ 9a37afeb6。

A. out 全 11 项按「输入侧同族 dtype 配合」扫描 —— 全部可跑(证明列表本身没错)

out dtype    rc1      rc2     判定
FLOAT        0        0       OK
FLOAT16      0        0       OK
DOUBLE       0        0       OK
INT8         0        0       OK
UINT8        0        0       OK
INT16        0        0       OK
INT32        0        0       OK
INT64        0        0       OK
BOOL         0        0       OK
COMPLEX64    0        0       OK
COMPLEX128   0        0       OK

B. BF16 在三个位置:输入侧被拒(与设备注一致),out 侧被接受(与设备注不一致)

case                     rc1      rc2
in=fp32 out=fp32 (基线)  0        0
in=bf16 out=fp32         161002   -1
in=fp32 out=bf16         0        0

C. A2 平台对 bf16 本身是支持的(排除「平台无能」):同机 torch.neg / exp / mul / outer 四个 bf16 路径全部正常,fp32->bf16 cast 正常。所以 A2 上 Ger 拒 BF16
是算子能力边界,不是硬件边界,更说明设备注(第 135 行)的适用范围写得不够准。

建议改法

  1. 把三行 dtype 列表里的 BFLOAT16 改成按平台分列,或移到设备注里写明「仅 950PR/950DT 支持」;
  2. 第 135 行设备注改为「self/vec2/out 在 A2/A3/Atlas训练 均不支持 BFLOAT16」,
    并说明 out 侧实际不拦(或修实现拦上,二者取一);
  3. out 行使用说明补一句「BFLOAT16 仅在 self/vec2 可取 BF16 的平台上有意义」。

为什么不是实现 bug

out=BF16 被接受并不产生错误结果:本次实测 bf16 0x4040 = 3.0000,与 fp32 真值逐位一致。
且 A2 的 legacy 实现 ops_legacy/ger.py 在 docstring 里就写明
only support float16, float32(第 70/72 行),接口层又已把 bf16 输入拦住,
所以真正缺的是资料把设备注的适用范围与 out 列的死条目说清楚,不是去补一道 out 白名单。

likedislike
liuhanwen8liuhanwen8
11 days ago Change title to "[Documentation|文档反馈]: aclnnGer 资料自相矛盾::86/:96/:106 三行 dtype 均列 BFLOAT16,:135 设备注却写 A2 不支持;且 out 行 BF16 无法靠输入侧推出来,该列实际不可用", originally titled "[Bug-Report|缺陷反馈]: aclnnGer out 为 BF16 时在 Atlas A2 被接受(资料声明 A2 不支持 BF16),而 BF16 作输入被正确拒绝".
liuhanwen8liuhanwen8
11 days ago Modify description of issue
陈思
陈思Collaborators
10 days ago Comments:

您好,感谢反馈!这页的设备注确实没有清楚区分输入类型限制与输出转换范围;您给出的 BF16 输入被拒、FP32 输入配 BF16 输出成功这两组结果,需要分别说明。

问题分析

我们核对了 cann/ops-math 提交 212ce9d5460b1be26cfbee481aff1acbf5cc5c62,其中该接口实现和文档与您报告的 9a37afeb6 一致。输入检查在非 RegBase 分支仅对 self、vec2 使用不含 BFLOAT16 的白名单,因此 A2 的 BF16 输入被拒符合这段实现;out 则检查推导计算类型能否转换到指定输出类型。

out 无须等于输入推导得到的类型。执行流程会先按推导类型计算外积,再将结果 Cast 到 out 类型。例如两个 FP32 输入可以先得到 FP32 结果,再转成 BF16 输出,无需先推导出 BF16。文档链接的互转换规则也允许浮点类型之间转换。这解释了您报告的 in=fp32 out=bf16 成功,因此 out 列的 BF16 有实际转换用途。

调整方向

一个可行的修订方向是分别写明 self/vec2 的平台输入限制,以及 out 从计算结果转换得到的范围,并将设备注的作用对象标清。将三个参数一律写成不支持 BF16,或限定只有输入可用 BF16 时才能选择 BF16 输出,会与现有输出转换路径产生新的不一致。

输出转换还需保留数据类型转换规则和精度边界:您验证的 3.0 可被 BF16 精确表示,一般 FP32 结果转 BF16 会涉及舍入。我们会继续确认各产品版本的输出支持口径,评估如何消除该页的范围歧义。

likedislike
陈思陈思Collaborators
10 days ago Assign chen_0715 as responsible person
陈思陈思Collaborators
10 days ago Added label: pending-confirmation
陈思陈思Collaborators
8 days ago Removed label: pending-confirmation
CchenyifengCollaborators
7 days ago Assign m0_55003149 as responsible person
CchenyifengCollaborators
7 days ago Removed responsible person chen_0715
weikeweikeCollaborators
7 days ago Associated pull request