Closed
[Documentation|文档反馈]: aclnnVarMean 参数表两处自相矛盾:self 维度列 1-8 与同文三处 0 维声明互斥、出参行序与原型相反(中英两份同错) #4182
liuhanwen8Add on  11 days agoClosed at  8 days ago
liuhanwen8
liuhanwen8
11 days ago Create

[Documentation|文档反馈]: aclnnVarMean 参数表两处自相矛盾:self 维度列 1-8 与同文三处 0 维声明互斥、出参行序与原型相反(中英两份同错)

现象

math/reduce_var/docs/aclnnVarMean.md 与英文版 aclnnVarMean_en.md 的参数表有两处自相矛盾:

  1. self 行的「维度」列写 1-8,但同一份文档另有三处指向「0 维允许」:同行「使用说明」写
    「shape支持0到8维」、错误码表 161002 子项只写「self的shape超过8维」才拒、同表出参
    meanOut/varOut 两列都写 0-8。一处写 1、三处写 0,同一份文档对 rank=0 判定相反。
  2. 参数表 meanOut 行排在 varOut 行之前,原型却是 varOut 第 5、meanOut 第 6,行序与原型相反。

两处都是文档内部的不一致(问题 1 同行两列互斥、问题 2 表格与同页原型互斥),不需上板即可判定;纯文本断言可复现,4 处命中、rc=1。

文档链接

问题片段

问题 1,中文 L89-95(逐字,英文 L93-97 同构):

<td>shape支持0到8维。</td>
...
<td>1-8</td>

同文错误码表 L203(逐字):

<td>self的shape超过8维。</td>

问题 2,中文 L43-51 原型(逐字节选):

  aclTensor*         varOut,      // 第 5 个形参
  aclTensor*         meanOut,     // 第 6 个形参

参数表里 meanOut 在中文 L129、varOut 在 L139;英文 L131/L141。

期望

问题 1 的应得值来自文档内部三处对照(不依赖任何实测):同一张表里
self 的「使用说明」写「0 到 8 维」、meanOut 维度列写 0-8、varOut 维度列写 0-8,
三处下界都是 0,只有 self 的维度列写 1-8。少数服从多数,该格应为 0-8。

  1. 中文 L95、英文 L97 的 self 维度格由 1-8 改为 0-8。
  2. 中文 L129/L139、英文 L131/L141 行序改为 varOut 在前、meanOut 在后,与原型一致。

环境

  • 仓:cann/ops-math master,31d2963a888de951217b5299ad30eb49551d70df(git fetch 后核对)
  • 复现无需 NPU / CANN,纯文本断言,不涉及芯片能力判定

影响

  • 问题 1:读者按 1-8 会认为 0 维标量不支持,业务里多写一层 torch.atleast_1d,与实际支持面对不上,下游支持性判断会失真。
  • 问题 2:两个出参 dtype/shape 通常相同,按表格顺序传参不会报 161002,会把方差写进 meanOut、均值写进 varOut,后续读取全部错位且无提示。静默错误比报错更难查。

复现步骤

  1. 保存下面脚本为 check_varmean_doc.py。
  2. 在 ops-math 仓根执行 python3 check_varmean_doc.py --repo-root=.(纯本地读,不联网)。
  3. 观察到 4 行 [DEFECT],退出码 1。

复现脚本

判据:rc=1 且 stdout 含 [DEFECT]。

import os, re, sys
ROOT = next((a.split("=", 1)[1] for a in sys.argv if a.startswith("--repo-root=")), ".")
BASE = os.path.join(ROOT, "math", "reduce_var", "docs")
USAGE = re.compile(r"(?:shape\s*支持\s*|supports?\s+)(\d+)\s*(?:到|to)\s*(\d+)\s*(?:维|dimension)", re.I)
COL = re.compile(r"^\s*(\d+)\s*-\s*(\d+)\s*$")
bad = 0
for n in ("aclnnVarMean.md", "aclnnVarMean_en.md"):
    L = open(os.path.join(BASE, n), encoding="utf-8").read().splitlines()
    i = next((k for k, l in enumerate(L) if "self(aclTensor*)" in l or ">self<" in l), None)
    if i is not None:
        lo = col = None
        for l in L[i:i + 14]:
            m, c = USAGE.search(l), COL.match(re.sub(r"<[^>]+>", "", l))
            lo = lo if lo is not None else (int(m.group(1)) if m else None)
            col = col if col is not None else (int(c.group(1)) if c else None)
        if lo is not None and col is not None and lo != col:
            print("[DEFECT] %s: self 维度列下界 %d 与使用说明下界 %d 互斥(L%d)" % (n, col, lo, i + 1)); bad += 1
    mi = next((k for k, l in enumerate(L) if re.search(r"<td>\s*meanOut\s*[((]", l)), None)
    vi = next((k for k, l in enumerate(L) if re.search(r"<td>\s*varOut\s*[((]", l)), None)
    m = re.search(r"aclnnVarMeanGetWorkspaceSize\((.*?)\)", "\n".join(L), re.S)
    if m and mi is not None and vi is not None:
        ns = [p.split()[-1].lstrip("*") for p in m.group(1).split(",") if p.split()]
        if (mi < vi) != (ns.index("varOut") > ns.index("meanOut")):
            print("[DEFECT] %s: 表序 meanOut@L%d/varOut@L%d 与原型相反" % (n, mi + 1, vi + 1)); bad += 1
print("[RESULT] 命中 %d 处" % bad)
sys.exit(1 if bad else 0)

实测输出:

[DEFECT] aclnnVarMean.md: self 维度列下界 1 与使用说明下界 0 互斥(L89)
[DEFECT] aclnnVarMean.md: 表序 meanOut@L129/varOut@L139 与原型相反
[DEFECT] aclnnVarMean_en.md: self 维度列下界 1 与使用说明下界 0 互斥(L93)
[DEFECT] aclnnVarMean_en.md: 表序 meanOut@L131/varOut@L141 与原型相反
[RESULT] 命中 4 处

rc=1。

建议

两处均为文档内部一致性错误,只改文档即可。同类先例 #4019(aclnnLog2 参数表「维度 1-8」
与错误码表只拒「>8」互斥、rank=0 实际被接受),本 issue 是同一判据在 aclnnVarMean 上的复现。
同接口的 dtype 问题是 #4172(bf16 全量 161002),属实现缺陷,与本 issue 无关。

likedislike
liuhanwen8liuhanwen8
11 days ago Added label: documentation
陈思
陈思Collaborators
10 days ago Comments:

您好,感谢反馈!已核对固定提交 8c1f633e3679 的中文资料、英文资料及接口实现,两份参数表均存在您指出的文字不一致:self 使用说明写 0 到 8 维,而维度列写 1–8;参数表也都把 meanOut 放在 varOut 前面,与同页原型的顺序不同。

实现的 shape 检查限制的是最大维数,并未在该检查中将 0 维一概排除。一个可行的资料修订方向是核对标量调用的完整约束后统一维度描述,并将两个输出行按原型排列,保持中英文同步。参数说明表的展示顺序本身不会改变 C 接口的参数绑定;调用时仍需严格按原型先传 varOut、再传 meanOut,否则这两个通常类型相同的指针可能在调用侧被误置换。

该项属于资料一致性和易读性完善,不需要通过交换实现的参数顺序来匹配现有表格;标量支持及各平台类型范围也应分别核对。我们会继续跟踪这两处说明差异。

likedislike
陈思陈思Collaborators
10 days ago Assign chensi79 as responsible person
陈思陈思Collaborators
10 days ago Added label: pending-confirmation
陈思陈思Collaborators
10 days ago Removed responsible person chensi79
陈思陈思Collaborators
10 days ago Assign chen_0715 as responsible person
CchenyifengCollaborators
10 days ago Assign sakuraqqz as responsible person
CchenyifengCollaborators
10 days ago Removed responsible person chen_0715
SsakuraqqzCollaborators
10 days ago Associated pull request
sakuraqqzCollaborators
10 days ago Comments:

已修复,PR !6823 已提交。

修改内容(中英文两份文档):

  1. self 维度列由 1-8 改为 0-8,与同行使用说明、错误码表、meanOut/varOut 维度列 0-8 一致;
  2. 参数表 varOut 行调整到 meanOut 行之前,与函数原型第 5/6 形参顺序一致。

已用本 issue 提供的复现脚本验证:[RESULT] 命中 0 处,4 处缺陷全部消除。纯文档改动,无需上板。

likedislike
sakuraqqzCollaborators
10 days ago Comments:

补充:修复已并入 !6812(sakuraqqz/ops-math master),原 !6823 已关闭,请勿重复处理。

修改内容(中英文两份文档):

  1. self 维度列由 1-8 改为 0-8;
  2. 参数表 varOut 行调整到 meanOut 行之前,与函数原型顺序一致。

复现脚本验证 [RESULT] 命中 0 处,4 处缺陷全部消除。

likedislike
SsakuraqqzCollaborators
8 days ago changed custom state from 进行中 to 已完成
SsakuraqqzCollaborators
8 days ago Close issue