Closed
[Bug-Report|缺陷反馈]: SparseBincount 算子 infershape 注册缺少 InputsDataDependency,GEIR 通路编译期取数失败报 EZ9999 #3800
xuejinghuiAdd on  22 days agoClosed at  21 days ago
xuejinghuiCollaborators
22 days ago Create

[Bug-Report|缺陷反馈]: SparseBincount 算子 infershape 注册缺少 InputsDataDependency,GEIR 通路编译期取数失败报 EZ9999

问题描述

math/sparse_bincount(950 新增算子)的 InferShape 中,输出 shape 由 dense_shape/size 两个输入的值决定(1D 模式输出 [size];多维模式输出 [dense_shape[0], size]),属典型的数据依赖输入。但 IMPL_OP_INFERSHAPE 注册链缺少 .InputsDataDependency({IDX_DENSE_SHAPE, IDX_SIZE}) 声明,GE 图编译期不会向 infershape 供给这两个输入的常量数据,GetData<int32_t/int64_t>() 返回 nullptr,直接报 EZ9999: size data is null(sparse_bincount_infershape.cpp:73),InferShape 返回 GRAPH_FAILED,GEIR 通路执行失败。

补齐 InputsDataDependency 后仍存在第二层面问题:当 size/dense_shape 本身就是动态输入(非常量)时,编译期天然无数据,原实现对空数据一律 return GRAPH_FAILED,动态 shape 场景被误拦截。

环境信息

Ascend 950PR/950DT;CANN 9.3.0;GEIR 图模式通路(aclnn 单算子通路不经过该 infershape 注册,不受影响)

重现步骤

  1. GEIR 图模式构造 SparseBincount 节点,size 以常量/placehelder 输入(如 indices=(156,-1)、values=(156)、dense_shape=(2)、size=(1)、weights=(156) 的动态 shape 图);
  2. 图编译期执行 InferShape;
  3. size 输入无数据供给,GetData 得到 nullptr,报 EZ9999,InferShape 失败,RunGraph 失败。

仓内最小复现(ophost UT,InfershapeContextFaker 不给 size 常量数据):

// dense_shape/size 不带 const 数据时,原实现 GetData==nullptr → GRAPH_FAILED

预期结果

  • size/dense_shape 为常量输入时:编译期可读到数据,正常推导输出 shape(1D → [size];多维 → [dense_shape[0], size]);
  • size/dense_shape 为动态输入(编译期无数据)时:对应输出维度置 -1(unknown dim),由运行时按真实数据推导,InferShape 不报错;
  • 全已知 shape 及异常输入行为保持不变。

日志/截图

EZ9999: size data is null
[ERROR] InferShapeSparseBincount failed (sparse_bincount_infershape.cpp:73)
InferShape failed → RunGraph failed

根因分析

  1. 输出 shape 依赖 dense_shape/size 的值而非 shape,属于数据依赖输入,必须通过 .InputsDataDependency({IDX_DENSE_SHAPE, IDX_SIZE}) 显式声明,GE 才会在编译期把常量数据喂给 infershape;注册缺失导致 GetData 返回 nullptr(与仓内 ArgMaxV2 同类问题同源)。
  2. 即便补齐声明,动态输入在编译期仍无数据属正常场景,原实现把"无数据"等同于"错误"处理过于严格,应降级为输出 unknown dim。

修复方案

修复提交(ops-math fork,squash 后单提交 cfa87226b,分支 fix_sparse_bincount_inputs_data_dependency,关联 MR !6508):

  • IMPL_OP_INFERSHAPE(SparseBincount) 注册链补充 .InputsDataDependency({IDX_DENSE_SHAPE, IDX_SIZE})(与 ArgMaxV2 同类修复范式一致);
  • size/dense_shape 数据为空时不再返回 GRAPH_FAILED:sizeValue/denseShapeRows 默认置 -1,对应输出维度推导为 unknown dim,交由运行时确定。

改动仅涉及 math/sparse_bincount/op_host/sparse_bincount_infershape.cpp(15+/8-)。

验证结果

  • host UT:bash build.sh -u --ophost --gtest_filter='SparseBincountInfershape*',6/6 PASS(1D、多维、unknown shape、unknown rank、混合 unknown,及本地补充的 indices=(156,-1) 混合已知/未知维度用例——该用例验证了 issue 场景的推导路径,未随本提交合入);
  • 常量输入推导结果与修复前一致(如 dense_shape={4,5}, size=8 → [4,8]),无行为回退。

关联提交

  • ops-math fork 分支 fix_sparse_bincount_inputs_data_dependency:cfa87226b(squash 后单提交)
  • MR:cann/ops-math !6508

备注

  • 该问题仅在 GEIR 图模式编译期暴露;aclnn 单算子通路走 runtime 推导,不受影响。
  • 同类排查建议:仓内凡输出 shape 依赖输入张量值的算子,infershape 注册均需检查 InputsDataDependency 声明是否齐备。
likedislike
XxuejinghuiCollaborators
22 days ago Added label: bug-report
xuejinghuiCollaborators
22 days ago Comments:

/assign

likedislike
CANN-robotCANN-robotCollaborators
22 days ago Assign xuejinghui as responsible person
CANN-robotCANN-robotCollaborators
21 days ago Close issue
CANN-robotCANN-robotCollaborators
21 days ago Added label: resolved