Closed
[Documentation|文档反馈]: aclnnUnfoldGrad 文档未列「gradOut 末维必须等于 size」约束,错误码表与约束说明均缺项 #3826
liuhanwen8Add on  21 days agoClosed at  16 days ago
liuhanwen8
liuhanwen8
21 days ago Create

问题描述

aclnnUnfoldGrad 的 tiling 侧存在「gradOut 末维必须等于 size」的校验,违反时 tiling 返回 ge::GRAPH_FAILED;但文档错误码表未列出该约束对应的条目,调用方拿到错误码后无法从错误码表反查是哪条约束被违反。

位置:

  • 校验实现:conversion/unfold_grad/op_host/unfold_grad_tiling.cpp:236-242(被检 commit 3e45432d)
  • 文档错误码表:conversion/unfold_grad/docs/aclnnUnfoldGrad.md:214-228(561002 共 5 条,无此项)

校验代码

// op_host/unfold_grad_tiling.cpp:236-242
OP_CHECK_IF(
    gradOutShape[gradOutShape.GetDimNum() - 1] != size,
    OP_LOGE(
        nodeName, "The last dimension of gradOut %ld must be size %ld.", gradOutShape[gradOutShape.GetDimNum() - 1],
        size),
    return ge::GRAPH_FAILED);

注意:该约束仅由 tiling 校验。aclnn 层 CheckShapeValid(op_api/aclnn_unfold_grad.cpp:71-98)逐项检查了最大/最小维数、inputSizes 长度、gradIn 与 inputSizes 形状一致,但未检查 gradOut 末维等于 size:

// op_api/aclnn_unfold_grad.cpp:71-98  CheckShapeValid 实际覆盖范围
OP_CHECK_MAX_DIM(gradOut, MAX_SUPPORT_DIMS_NUMS, return false);
OP_CHECK_MAX_DIM(gradIn, MAX_SUPPORT_DIMS_NUMS, return false);
OP_CHECK_MIN_DIM(gradOut, MIN_SUPPORT_DIMS_NUMS_FOR_UNFOLD_GRAD, return false);
OP_CHECK_MIN_DIM(gradIn, MIN_SUPPORT_DIMS_NUMS_FOR_UNFOLD_GRAD, return false);
OP_CHECK(inputSizes->Size() == gradOutDimNum - 1, ...);          // 长度约束
OP_CHECK_SHAPE_NOT_EQUAL_WITH_EXPECTED_SIZE(gradIn, expectShape, return false);  // gradIn 形状
// 没有任何针对 gradOut 末维 == size 的判断

因此「末维 ≠ size」能通过 aclnn 前置校验,进入 tiling 后被拦下。

文档现状:约束已隐含声明,但错误码表缺项

文档在参数表里其实已通过 shape 公式隐含了该约束:

docs/aclnnUnfoldGrad.md:107
shape为(..., (sizedim-size)/step+1, size),要求满足gradOut的第dim维等于...

shape 末尾的 size 即「末维大小等于 size」——参数表已声明。

但错误码表(:214-228)的 561002 下只列了 5 条,无「末维不等于 size」:

# 文档错误码表 561002 已列条目 对应 tiling 校验行
1 gradOut 的第 dim 维 ≠ (inputSizes[dim]-size)/step+1 :230-236
2 gradOut 的 size ≠ inputSizes 的 size+1 :223-229
3 size ≤ 0 或 size > inputSizes 第 dim 维 :211(仅 size ≤ 0 部分)
4 step ≤ 0 :212
5 dim ≠ len(inputSizes)-1 且 ≠ len(inputSizes)-2 :213-217
— (缺)gradOut 末维 ≠ size :236-242

即 tiling 实际有 6 项校验,错误码表只覆盖 5 项,漏掉的正是末维这一项。

影响

调用方构造 gradOut 时若只按错误码表核对约束(错误码表是排查依据的高频入口),会漏掉「末维必须等于 size」这一条:

  • gradOut 形状如 (2, 6, 3)、size=4 时,末维 3 ≠ 4,tiling 拒绝;
  • 调用方拿到的错误码在错误码表里找不到对应描述,只能看到形如 The last dimension of gradOut 3 must be size 4. 的内部日志;
  • 若该错误最终映射为 561002,则会与另外 5 类几何约束混在一起,无法区分。

补充:文档约束说明章节(:279-282)同样只列了 2 条 shape 约束,也没有末维这一条,缺项存在于错误码表与约束说明两处。

环境信息

  • 被检仓:cann/ops-math HEAD 3e45432d(2026-10-21)
  • 涉及算子:aclnnUnfoldGrad(conversion/unfold_grad)
  • 本项为文档缺项,静态核对即可确认校验存在与文档缺失,不需要设备实测

重现步骤

静态核对:

# 1. tiling 中存在末维校验
sed -n '236,242p' conversion/unfold_grad/op_host/unfold_grad_tiling.cpp

# 2. aclnn 层没有该判断(grep 无命中)
grep -n "GetDimNum() - 1\] != size\|last dimension" conversion/unfold_grad/op_api/aclnn_unfold_grad.cpp

# 3. 错误码表 5 条里无此项
sed -n '214,228p' conversion/unfold_grad/docs/aclnnUnfoldGrad.md

# 4. 约束说明章节也无此项
sed -n '279,284p' conversion/unfold_grad/docs/aclnnUnfoldGrad.md

真机验证(可选,用于确认实际公开返回码):

// 构造 gradOut 末维 != size,其余全部合法
// 例:inputSizes = {8, 2}, size = 4, step = 1, dim = 1
//     gradOut 末维传 3(应为 4),第 dim 维按下式构造使其通过前置校验:
//     dim1 = (inputSizes[1] - size)/step + 1 = (2-4)/1+1 = -1 -> 需换用合法组合,见下
// 推荐合法组合:inputSizes = {8, 10}, size = 4, step = 1, dim = 1
//     dim1 = (10-4)/1+1 = 7,gradOut shape = {8, 7, 4};造错为 {8, 7, 3}
aclnnStatus ret = aclnnUnfoldGradGetWorkspaceSize(gradOut, inputSizes, dim, size, step, gradIn, ...);
// 记录 ret,确认其对应的公开错误码

预期结果

  1. 在 docs/aclnnUnfoldGrad.md 错误码表补一条:「gradOut 的末维不等于 size。」,归入实际对应的错误码(若与其余几何约束一致则为 561002;若实测为其他码则按实测填写);
  2. 在 ## 约束说明 的「gradOut的shape满足约束」下补一条:「gradOut 的末维等于 size。」;
  3. 若维护者认为参数表 :107 的 shape 公式已足够表达该约束,则至少在错误码表补齐对应条目,使错误码可反查。

备注

与 #3797 的关系

本单拆自 #3797。按维护者分类口径,本项对应「末维约束说明」,单独跟踪。

与 #3795 的边界

#3795 覆盖 dim 的双轴校验缺失(len(inputSizes)=3 时 dim=0 被放行,属校验未实现的行为缺陷)。本单只涉及「末维 = size」这条已实现但文档未列的约束,两者约束对象不同,不重叠。

对原汇总单表述的修正

原 #3797 第 2 项写「实现中违反时返回 161002,文档错误码表与参数约束两处均未声明」,经复核有两处需修正:

  1. 返回码:该约束只在 tiling 校验,CheckShapeValid 不含此判断,故不可能在 aclnn 层返回 161002;实际应走 tiling 的 GRAPH_FAILED,最终公开错误码需按实测确认,本单不断言。
  2. 参数约束是否声明:参数表 :107 的 shape 公式 (..., (sizedim-size)/step+1, size) 已隐含末维 = size,并非「两处均未声明」;准确说法是「参数表已隐含,错误码表与约束说明缺项」。

涉及文件

  • conversion/unfold_grad/docs/aclnnUnfoldGrad.md(错误码表 :214-228、约束说明 :279-284)
  • conversion/unfold_grad/op_host/unfold_grad_tiling.cpp(:236-241)
  • conversion/unfold_grad/op_api/aclnn_unfold_grad.cpp(CheckShapeValid :71-98,用于证明 aclnn 层无此校验)
likedislike
liuhanwen8liuhanwen8
21 days ago Added label: documentation
liuhanwen8
liuhanwen8
21 days ago Comments:

拆自 #3797(原 4 项汇总单已关闭)。本单为其拆分项之一,详见 #3797 的拆分说明。

likedislike
陈思
陈思Collaborators
20 days ago Comments:

您好,感谢反馈!

问题分析

核对 cann/ops-math 固定提交 b19eaee4f58e5e1e3cb3b2ecbfed2d02c11c820a 后,确认 tiling 实现 在 gradOut 最后一维不等于 size 时返回 ge::GRAPH_FAILED;aclnn 层的形状校验 没有这项判断,因此不能把它归入已在 API 前置校验中返回 161002 的约束。

接口文档 的参数 shape 公式末尾已写出 size,但错误码表和“约束说明”没有明确列出这条校验,确实缺少便于排查的对应说明。GRAPH_FAILED 是 tiling 层返回值,最终公开错误码还需核对框架映射,不能直接据此确定为 561002。

处理方向

一个可行的调整是在约束章节明确写出“gradOut 的末维必须等于 size”,并在核实公开返回码后补上对应的错误码条目。例如 inputSizes={8,10}、dim=1、size=4、step=1 时,正常 gradOut shape 为 {8,7,4},{8,7,3} 可用于单独检查末维违规路径。该说明与 #3795 的 dim 校验问题分别跟踪。我们会继续确认返回码与文档修订口径。

likedislike
陈思陈思Collaborators
20 days ago Assign chensi79 as responsible person
陈思陈思Collaborators
20 days ago Added label: pending-confirmation
陈思陈思Collaborators
20 days ago Removed label: pending-confirmation
陈思陈思Collaborators
20 days ago Assign yue-ma as responsible person, remove original responsible person: chensi79
陈思陈思Collaborators
20 days ago Added label: pending-confirmation
陈思陈思Collaborators
17 days ago Removed label: pending-confirmation
Yyue-maCollaborators
17 days ago Removed responsible person yue-ma
Yyue-maCollaborators
17 days ago Assign L_Euler as responsible person
TtangkaidiCollaborators
16 days ago Assign tangkaidi as responsible person
tangkaidiCollaborators
16 days ago Comments:

你好,感谢你的关注和反馈。
当前issue内提及的问题已经确认,将会尽快合入代码。
修复PR:https://gitcode.com/cann/ops-math/pull/6716

likedislike
CANN-robotCANN-robotCollaborators
16 days ago Close issue
CANN-robotCANN-robotCollaborators
16 days ago Added label: resolved