已关闭
[Bug-Report|缺陷反馈]: UnsortedSegmentSum InferShape 未拒绝 segment_ids 的超范围 rank #5071
KaranocaVe创建于  8月24日关闭于  9月30日
KaranocaVe
KaranocaVe
8月24日 创建

问题描述

在 cann/ops-nn 的 commit
bcf8c094ca51b5659c7c21ac5abecec5fa9ef2be 中,UnsortedSegmentSum 的 proto 规定
segment_ids rank 必须小于等于 x rank,且 shape 必须是 x.shape 的前缀。
但 Host InferShape 实现没有先检查这两个约束,直接以 size_t 计算
x_rank - segment_ids_rank + 1。

当 x 为一维、segment_ids 为二维时,非法输入没有被拒绝,InferShape 仍返回
GRAPH_SUCCESS。该路径还会发生无符号 rank 下溢,调用方可能继续使用不符合算子
契约的输出 shape。

环境信息

  • 仓库/commit:cann/ops-nn /
    bcf8c094ca51b5659c7c21ac5abecec5fa9ef2be
  • OS/架构:Ubuntu 22.04.5 LTS,Linux 5.10,aarch64
  • Ascend 硬件:Ascend 910B3;本次验证为 Host InferShape,不是 NPU 端到端测试
  • Driver/Toolkit/OPP:验证环境 CANN Toolkit/OPP 9.1.0,目标源码为 9.2 开发线
  • 编译器:G++ 11.4.0;CMake 3.22.1;Python 3.12.13

重现步骤

  1. 在固定 commit 上构建 ops-nn 的 Host OpInfer 共享库和
    UnsortedSegmentSum InferShape UT。
  2. 运行定向测试:
    UnsortedSegmentSumInferShape.SegmentIdsRankGreaterThanXRankMustFail。
  3. 测试构造 x=[4]、segment_ids=[4,1]、num_segments=[1],并调用注册的
    UnsortedSegmentSum InferShape 回调。
  4. 使用 x=[2,3]、segment_ids=[2] 和 x=[2,3]、segment_ids=[2,3] 运行合法
    rank 对照。

预期结果

由于 segment_ids rank 为 2,而 x rank 为 1,输入违反算子 proto 约束;回调应
在形状检查阶段返回 ge::GRAPH_FAILED,而不是继续计算输出 rank。

实际结果

非法用例回调返回 ge::GRAPH_SUCCESS (0),而断言期望
ge::GRAPH_FAILED (4294967295)。包含两个合法对照和该非法用例的测试退出码为 1;
非法用例连续重复 5 次,结果均一致。两个合法对照均退出成功,分别得到输出 shape
[-1,3] 和 [-1]。

关键日志为 run_rank_ut.log、run_rank_valid.log、repeat_invalid_rank.log,
结构化结果为 unsorted_segment_sum_rank.xml 和 unsorted_segment_sum_valid.xml。

影响与建议

非法输入可绕过 Host shape 校验并返回成功,后续编译/执行阶段可能接收与算子契约不符
的 shape。建议在计算输出 rank 前显式校验 segment_ids rank 不大于 x rank,并
校验 segment_ids shape 是 x shape 的前缀;增加超范围 rank、非前缀 shape、合法
前缀和等 rank 的回归测试。临时规避方式是调用方在构图前自行遵守上述 proto 约束。

备注

本报告仅基于固定 commit 的 Host InferShape 复现。由于源码与验证环境 Toolkit/OPP 版本
不匹配,未将结果扩展为匹配版本 NPU 运行结论。

likedislike
KaranocaVeKaranocaVe
8月24日 添加了label:bug-report
yuning_chenyuning_chen成员
8月24日 将 KaranocaVe 设为负责人
yuning_chen
yuning_chen成员
9月17日 评论:

初步分析

感谢反馈,我们已开始核对这个问题。

现象理解:缺陷反馈;UnsortedSegmentSum InferShape 未拒绝 segment_ids 的超范围 rank。
当前判断:从描述看这是缺陷反馈「UnsortedSegmentSum InferShape 未拒绝 segment_ids 的超范围 rank」。正文里出现报错信息(如 ``UnsortedSegmentSumInferShape.SegmentIdsRankGreaterThanXRankMustFail。),更像实现或使用问题。以上为初步判断,待复现确认,不能当成已确认根因。
涉及范围:segment_ids_rank、run_rank_ut、run_rank_valid、repeat_invalid_rank、unsorted_segment_sum_rank、unsorted_segment_sum_valid
下一步:我们会继续对照代码/文档定位。

正文中的报错摘录:

  • ``UnsortedSegmentSumInferShape.SegmentIdsRankGreaterThanXRankMustFail。
  • 在形状检查阶段返回 ge::GRAPH_FAILED,而不是继续计算输出 rank。
  • ``ge::GRAPH_FAILED (4294967295)。包含两个合法对照和该非法用例的测试退出码为 1;
likedislike
CANN-robotCANN-robot成员
9月30日 关闭了 issue
CANN-robotCANN-robot成员
9月30日 添加了label:resolved
m0_46386992
m0_46386992成员
18 天前 评论:

Rank & 前缀合法性检查已在tiling中存在。另外,为了防止无符号x_rank - segment_ids_rank + 1 计算出现下溢问题,已在infershape阶段增加针对rank的校验。

likedislike