Closed
[Documentation|文档反馈]: aclnnUnfoldGrad 文档未列「gradOut 末维必须等于 size」约束,错误码表与约束说明均缺项 #3826
liuhanwen8Add on 21 days agoClosed at 16 days ago
21 days ago Added label: documentation
liuhanwen8
21 days ago Comments:
21 days ago Comments:
拆自 #3797(原 4 项汇总单已关闭)。本单为其拆分项之一,详见 #3797 的拆分说明。


陈思
20 days ago Comments:
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 校验问题分别跟踪。我们会继续确认返回码与文档修订口径。


20 days ago Assign chensi79 as responsible person
20 days ago Added label: pending-confirmation
20 days ago Removed label: pending-confirmation
20 days ago Assign yue-ma as responsible person, remove original responsible person: chensi79
20 days ago Added label: pending-confirmation
17 days ago Removed label: pending-confirmation
tangkaidi
16 days ago Comments:
16 days ago Comments:
你好,感谢你的关注和反馈。
当前issue内提及的问题已经确认,将会尽快合入代码。
修复PR:https://gitcode.com/cann/ops-math/pull/6716


16 days ago Close issue
16 days ago Added label: resolved
问题描述
aclnnUnfoldGrad的 tiling 侧存在「gradOut末维必须等于size」的校验,违反时 tiling 返回ge::GRAPH_FAILED;但文档错误码表未列出该约束对应的条目,调用方拿到错误码后无法从错误码表反查是哪条约束被违反。位置:
conversion/unfold_grad/op_host/unfold_grad_tiling.cpp:236-242(被检 commit3e45432d)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 公式隐含了该约束:
shape 末尾的
size即「末维大小等于size」——参数表已声明。但错误码表(
:214-228)的561002下只列了 5 条,无「末维不等于size」:561002已列条目gradOut的第dim维 ≠(inputSizes[dim]-size)/step+1:230-236gradOut的 size ≠inputSizes的 size+1:223-229size≤ 0 或size>inputSizes第dim维:211(仅size ≤ 0部分)step≤ 0:212dim≠len(inputSizes)-1且 ≠len(inputSizes)-2:213-217gradOut末维 ≠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-mathHEAD3e45432d(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,确认其对应的公开错误码预期结果
docs/aclnnUnfoldGrad.md错误码表补一条:「gradOut的末维不等于size。」,归入实际对应的错误码(若与其余几何约束一致则为561002;若实测为其他码则按实测填写);## 约束说明的「gradOut的shape满足约束」下补一条:「gradOut的末维等于size。」;:107的 shape 公式已足够表达该约束,则至少在错误码表补齐对应条目,使错误码可反查。备注
与 #3797 的关系
本单拆自
#3797。按维护者分类口径,本项对应「末维约束说明」,单独跟踪。与 #3795 的边界
#3795覆盖dim的双轴校验缺失(len(inputSizes)=3时dim=0被放行,属校验未实现的行为缺陷)。本单只涉及「末维 =size」这条已实现但文档未列的约束,两者约束对象不同,不重叠。对原汇总单表述的修正
原
#3797第 2 项写「实现中违反时返回161002,文档错误码表与参数约束两处均未声明」,经复核有两处需修正:CheckShapeValid不含此判断,故不可能在 aclnn 层返回161002;实际应走 tiling 的GRAPH_FAILED,最终公开错误码需按实测确认,本单不断言。: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 层无此校验)