Closed
[Bug-Report|缺陷反馈]: BatchToSpaceND InferShape 未拒绝负值 block_shape 并生成负维度 #2823
KaranocaVeAdd on  Aug 24Closed at  Sep 28
KaranocaVe
KaranocaVe
Aug 24 Create

一、问题描述

在 cann/ops-math 的 commit
0a2ce5b57caec6068d9e5658b740c2d41482aa15 中,BatchToSpaceND README
明确规定 block_shape 中的每个元素必须大于 0。

但是 Host InferShape
conversion/batch_to_space_nd/op_host/batch_to_space_nd_infershape.cpp
只检查 block_shape 元素是否等于 0,没有拒绝负值。输入
x=[4,1,1,1]、block_shape=[-1,2]、crops=[0,0,0,0] 时,InferShape
返回 GRAPH_SUCCESS,并生成 [-2,-1,2,1]。该结果包含负维度,违反输入
协议和输出 shape 的基本有效性要求。

二、环境信息

  • 仓库/commit:cann/ops-math /
    0a2ce5b57caec6068d9e5658b740c2d41482aa15
  • 主机:Ubuntu 22.04.5、Linux 5.10、aarch64
  • Ascend 硬件:机器有 Ascend 910B3;本次为 Host InferShape 验证
  • Driver/Toolkit/OPP:验证环境 CANN 9.1.0;源码为 9.2.0-beta.2 开发线
  • 编译器/Python/CMake:GCC/G++ 11.4.0、Python 3.12.13、CMake 3.22.1

三、重现步骤

  1. 将 ops-math 固定到上述 commit,在已配置 CANN Toolkit 的环境执行:

    env ASCEND_INSTALL_PATH=<CANN Toolkit 安装路径>
    bash build.sh -u --ophost --ops=batch_to_space_nd
    --soc=ascend950 --noexec -j2

    构建退出码为 0。

  2. 运行 Host InferShape UT,观察合法、零值和负值三组输入:

  3. 观察合法、零值和负值三组输入:

    • 合法:x=[4,1,1,1],block_shape=[2,2],crops=[0,0,0,0]
    • 零值控制:block_shape=[0,2]
    • 非法负值:block_shape=[-1,2]

四、预期结果

合法输入应返回 GRAPH_SUCCESS,输出为 [1,2,2,1]。根据 README 的严格
正值约束,block_shape=[0,2] 和 block_shape=[-1,2] 均应返回
GRAPH_FAILED,不应继续生成包含负维度的输出 shape。

五、实际结果

  • 合法输入返回 GRAPH_SUCCESS,输出为 [1,2,2,1]。
  • 零值控制返回 GRAPH_FAILED。
  • 负值输入返回 GRAPH_SUCCESS,输出为 [-2,-1,2,1]。
  • 完整 Host InferShape UT 共 28/28 通过,负值用例重复 5 次均稳定成功。

源码中第 98-102 行只判断 block 值是否为 0,负值继续参与 batch 除法;
第 110-112 行又使用负 block 值计算空间输出维度。

六、影响与规避方式

图构建阶段可能接受违反算子约束的 block_shape,并把负 batch 或负空间
维度传播到后续图元数据,导致后续 shape、tiling 或执行阶段出现更晚且
不易定位的错误。调用方可暂时在进入图构建前自行校验 block_shape 全部为
正值;实现侧应在 InferShape 入口拒绝非正值。

七、日志和最小复现

Host InferShape UT 已覆盖上述三组输入。
构建和运行退出码均为 0;退出码为 0 表示当前测试按观察到的行为通过,
不是对非法输入正确性的断言。

八、建议的回归测试

增加合法 block_shape=[2,2]、零值 [0,2] 和负值 [-1,2] 的 InferShape
回归用例。合法用例应保持成功;所有非正 block_shape 都应返回
GRAPH_FAILED,并且输出 shape 不应包含负维度。

关联 PR

likedislike
KaranocaVeKaranocaVe
Aug 24 Added label: bug-report
KaranocaVeKaranocaVe
Aug 24 Associated pull request
陈思
陈思Collaborators
Aug 24 Comments:

/assign @KaranocaVe

likedislike
CANN-robotCANN-robotCollaborators
Aug 24 Assign KaranocaVe as responsible person
KaranocaVeKaranocaVe
Sep 21 Modify description of issue
WangJinCheng
WangJinChengCollaborators
Sep 28 Comments:

算子拦截都是在tiling中做拦截,infershape是负责推导输出的shape,不负责拦截作用

likedislike
Ssongkai111Collaborators
Sep 28 changed custom state from 进行中 to 已完成
Ssongkai111Collaborators
Sep 28 Close issue
KaranocaVe
KaranocaVe
Oct 2 Comments:

感谢指出。这里补的是 shape 推导阶段的输入约束:负值目前会参与 batch 和空间维度计算,让 InferShape 成功返回含负维度的输出 shape。tiling 校验能拦截后续执行,但无法阻止这个无效 shape 在图构建期间传播;因此我认为 InferShape 也需要拒绝这类输入。如果仓库对此有明确约定,麻烦指向对应接口,我会据此调整。

likedislike
liuchenghao
liuchenghao
Oct 6 Comments:

【Multica 同步】状态:done;说明:社区侧已在 shape 推导阶段补充输入约束(认领人 KaranocaVe 说明,2026-09-28 关闭),Multica 跟踪单同步关闭;详情:Multica issue AI4ME-166

likedislike
CANN-robotCANN-robotCollaborators
Oct 11 Added label: resolved