已关闭
[Bug-Report|缺陷反馈]: Index算子InferShape不支持动态shape(-1/-2/混合),indices广播误拦截未知维 #5915
xuejinghui创建于  25 天前关闭于  25 天前
xuejinghui成员
25 天前 创建

问题描述

index/index 算子的 InferShape 实现(op_host/index_infershape.cpp)不支持动态 shape 输入,具体缺陷:

  1. CanBroadcast 中 if (dim <= 0) 一刀切拦截:indices 输入任一维为 -1(unknown dim)或 -2(unknown rank)时直接返回 GRAPH_FAILED,混合动态 shape(如 {-1, 2, 4, -1})被误拦截
  2. 无 unknown rank 透传:x 或 indices 输入为 {-2} 时无任何特化处理,落入维度校验被拦截
  3. ComputeBroadcastShape 用 max(current_dim, dim) 静默吞掉 -1,广播时未知维信息丢失
  4. sizes_tensor->GetData<int64_t>() 返回值未判空,nullptr 输入直接崩溃
  5. indexedSizes 元素数大于 x 的 rank 时存在越界写风险

环境信息

Ascend 950PR / Atlas A2/A3;CANN 9.2.0

重现步骤

  1. 图模式构造 Index 节点,输入 x 的 shape 为 {-1, 2, 4, -1}(混合动态 shape)
  2. GE 构图执行 InferShape
  3. 返回 GRAPH_FAILED,日志报 dim must be > 0(-1 维被当非法值拦截)

或用 UT 复现:在 tests/ut/op_host/test_index_infershape.cpp 构造动态 shape 用例,修复前用例全部失败。

预期结果

  • indices 输入含 -1 维时逐维跳过该维校验(-1 通配),非法值(0 等)仍拦截
  • 混合动态 shape 正常推导:已知维保留原值、依赖未知维的输出维为 -1
  • x / indices 为 {-2}(unknown rank)时输出透传 {-2}
  • 广播计算传播未知维:该维位仅有 -1 与 1 时输出 -1,存在 >1 的已知维时保留已知值(如 {-1,5}×{3,-1} → {3,5})
  • GetData 返回 nullptr 时返回 GRAPH_FAILED 而非崩溃

日志/截图

修复分支 index_inferShape(commit f603fc21e,MR cann/ops-nn!10481):

  • 修复前:新增的动态 shape 用例全部失败(dim must be > 0 / 段错误路径)
  • 修复后:bash build.sh -u --ophost --soc=ascend950 --ops=index 23/23 通过
  • 新增 9 条 UT:6 条动态 shape(全 -1 / 全 -2(x 侧、indices 侧)/ 单输入混合 / 多输入混合 / 多 indices 混合广播)+ 3 条静态广播(rank 对齐 {3,5}×{5}、1 扩展 {3,1}×{1,5}、不兼容拦截 {3}×{5})

备注

  • 修复仅放宽动态 shape 场景;nullptr、非法维值(0、-2 残值)的拦截逻辑保持不变
  • canndev 仓配套的 infershape 1.0 注册屏蔽见另一 issue
likedislike
Xxuejinghui成员
25 天前 添加了label:bug-report
Xxuejinghui成员
25 天前 修改了issue 的描述
xuejinghui成员
25 天前 评论:

/assign

likedislike
CANN-robotCANN-robot成员
25 天前 将 xuejinghui 设为负责人
CANN-robotCANN-robot成员
25 天前 关闭了 issue
CANN-robotCANN-robot成员
25 天前 添加了label:resolved