Closed
[Bug-Report|缺陷反馈]: aclnnMhcPreSinkhorn 尾轴 c 未做 128 对齐校验,c=130 被接受(rc1=0) #6654
liuhanwen8Add on  16 days agoClosed at  9 days ago
liuhanwen8
liuhanwen8
16 days ago Create

现象

aclnnMhcPreSinkhorn 对尾轴 c 不做 128 对齐校验:c=130 时两段接口均返回成功并继续执行。

用例 x shape 第一段 rc 第二段 rc
对照组 (1, 8, 4, 128) 0 0
缺陷组 (1, 8, 4, 130) 0 0

资料写明尾轴必须为 128 的倍数,实测非对齐输入既不报错也不拦截。

期望

docs/aclnnMhcPreSinkhorn.md「约束说明 / 规格约束」(Atlas A2、A3 段)原文:

尾轴c需为128的倍数且取值范围为[1, 100000]。

按该约束,c=130 应在第一段 aclnnMhcPreSinkhornGetWorkspaceSize 返回 161002(ACLNN_ERR_PARAM_INVALID)。

环境

  • 硬件:Atlas A2 训练系列(Ascend 910B2,8 卡)
  • CANN:9.2.0
  • 仓库:cann/ops-transformer,master 92d0f9c2(git fetch 后确认校验缺失仍在)

复现步骤

  1. 取官方样例:cp examples/test_aclnn_mhc_pre_sinkhorn.cpp repro.cpp
  2. 用例规模改为 int64_t bs = 1, seq_len = 8, n = 4, c = 130;(phi_shape 由 c 自动推导,无需改动)
  3. 编译:见下方「复现脚本」
  4. 运行 ./repro,程序打印 c=130 ACCEPTED (rc1=0 rc2=0)
  5. 把 c 改回 128 重编译运行,同样打印 rc1=0 rc2=0(对照组,行为正确)

复现脚本

cp examples/test_aclnn_mhc_pre_sinkhorn.cpp repro.cpp
sed -i 's/int64_t bs = 2, seq_len = 128, n = 4, c = 4096;/int64_t bs = 1, seq_len = 8, n = 4, c = 130;/' repro.cpp
g++ -std=c++17 -O2 repro.cpp -o repro \
    -I${ASCEND_HOME_PATH}/include -L${ASCEND_HOME_PATH}/lib64 \
    -Wl,--allow-shlib-undefined -lascendcl -lnnopbase -lopapi
./repro

实测输出:

RESULT c=130 ACCEPTED (rc1=0 rc2=0)

c=128 对照组输出:

RESULT rc1=0 rc2=0 (ACCEPTED)

影响

  1. 按仓内 .cpp 逻辑,尾轴对齐是 kernel 侧搬运/切块的前提,非对齐输入被放行后输出正确性没有保障;本轮无 CPU 标杆,未判定是否算错,只确认校验缺失。
  2. 调用方按错误的 c 构造不会得到任何提示,问题会推迟到数值比对阶段才暴露,定位成本高。
  3. 该校验在 aclnn 第一段与 tiling 两侧都不存在(op_host/op_api/aclnn_mhc_pre_sinkhorn.cpp 的 CheckShape 与 op_host/op_tiling/ 均无 c % 128 判断),图模式通路同样缺失。

建议

在 CheckShape 中补 c % 128 == 0 判断,报 ACLNN_ERR_PARAM_INVALID(161002)并带上实测 c 与约束值;若实现实际支持任意 c,则同步修订资料的支持面并补充对应精度用例。

likedislike
liuhanwen8liuhanwen8
16 days ago Added label: bug-report
周云飞
周云飞Collaborators
16 days ago Comments:

您好,感谢提供完整的复现步骤和对照结果。

问题分析

按您引用的 Atlas A2、A3 文档约束,c=130 不满足“尾轴为 128 的倍数”的要求。您在 Atlas A2、CANN 9.2.0 环境中报告两阶段均返回 0,这与上述约束不一致,需要进一步确认参数检查的覆盖情况。

两阶段接口返回成功并不能证明非对齐输入的计算结果正确。目前没有数值比对结果,因此不能据此认定已经算错,也不能将 c=130 视为受支持的输入。图模式是否同样放行,以及 kernel 是否依赖该对齐条件,还需要结合对应实现确认。

处理方向

若该对齐约束适用于当前实现,一个可行的处理方案是在第一阶段的 CheckShape 中增加 c % 128 == 0 检查,保留现有取值范围及形状关系检查,并在错误信息中说明实际 c 值和对齐要求。第一阶段应按您提出的预期返回 ACLNN_ERR_PARAM_INVALID(161002),具体错误码还需沿检查失败的返回路径核对。图模式入口也需要考虑等效检查,避免只在 aclnn 接口侧拦截。

若实现确实支持非对齐输入,则需要以对应平台的计算结果验证为依据,再评估是否调整文档,而不能仅凭接口返回成功扩大支持范围。在支持范围明确前,建议调用方继续使用满足文档约束的 c 值,不直接依赖 c=130 的执行结果。

likedislike
renruhai
14 days ago Comments:

/assign

likedislike
CANN-robotCANN-robotCollaborators
14 days ago Assign renruhai as responsible person
Rrenruhai
12 days ago Associated pull request
renruhai
12 days ago Comments:

已提交修复 PR:https://gitcode.com/cann/ops-transformer/merge_requests/14770

修复内容:CheckShape 补充 c % 128 == 0 校验(返回 161002,错误信息带实际 c 值),门控于非 TND 平台(A2/A3,与文档规格约束的 npu="A3,910b" 范围一致);950/960DT 的 TND 路径不受影响。

实机验证(910B3,cann/master 未修复版与本分支 A/B):c=130 由 0(放行)→ 161002,c=128 回归不受影响。

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