Closed
[Bug-Report|缺陷反馈]: StridedSliceAssign 切片终态为 0 维 scalar 时 tiling 误报 EZ0012,且 shrink 位误应用 begin/end mask #3580
xuejinghuiAdd on  29 days agoClosed at  29 days ago
xuejinghuiCollaborators
29 days ago Create

[Bug-Report|缺陷反馈]: StridedSliceAssign 切片终态为 0 维 scalar 时 tiling 误报 EZ0012,且 shrink 位误应用 begin/end mask

问题描述

950 新增算子 StridedSliceAssign(ops-math/conversion/strided_slice_assign,arch35 SIMT 实现)在 GEIR 通路存在两个缺陷:

  1. rank-0 scalar 误拦截(EZ0012,主问题):当切片终态为 0 维 scalar(如 1 维 var + shrink_axis_mask=1)时,input_value 的合法 shape 为 ()。但 GEIR/TTK 通路会把 0 维 scalar 物化为 storage shape [1](origin shape 仍为 ()),tiling ValidateShape 使用 GetStorageShape().GetDimNum() 严格校验 input_value rank == finalRank(=0),读到 1 ≠ 0,误报 EZ0012: Parameter input_value ... rank must equal final slice rank。
  2. shrink 位误应用 begin/end mask(语义偏差,排查中新增用例暴露):ExpandOneSpecDim 原实现先应用 begin_mask/end_mask 再处理 shrink 分支,当 begin_mask 与 shrink_axis_mask 同位置位时,begin 被 mask 置 0,写入位置错误。TF 竞品(ValidateStridedSliceOp)中 shrink 分支不走 canonical(),begin/end mask 对 shrink 位不生效,应直接取 spec 的 begin 原值。

环境信息

Ascend 950PR/950DT;CANN 9.2.0;GEIR 图模式通路(该算子无 aclnn 接口)

重现步骤

CI 失败用例(StridedSliceAssign_L0_accuracy_perf_c_s_006/066/093/138,共 4 条,模式相同):

var=(25629532,) float32, begin=[1], end=[2], strides=[1], shrink_axis_mask=1, input_value shape=()

复现命令:

python3 -m ttk geir -i strided_slice_assign.csv --plugin <golden_dir> --device-whitelist=0 \
    -t StridedSliceAssign_L0_accuracy_perf_c_s_006 -o result.csv

语义合法性说明:var 为 1 维,shrink 第 0 维后切片终态为 0 维 scalar,input_value shape () 合法(TF 竞品同样接受)。

预期结果

  • tiling 正常通过,scalar 被写入 var 的 shrink 指定位置
  • begin_mask 与 shrink 同位置位时,写入位置取 spec 的 begin 原值(与 TF 一致)

日志/截图

Invalid_Argument_Tensor_Shape_Dim(EZ0012): Parameter input_value of op1 has incorrect shape ...
ValidateShape failed [strided_slice_assign_tiling_arch35.cpp]
Tiling4StridedSliceAssign failed → RunGraph failed: -1

日志中可见 var shape: (25629532,),input_value shape: (), total_shape: [1](rank 表示不一致的直接证据)。

根因分析

  1. GE 对 rank-0 tensor 的 storage shape 表示为 [1] 是框架既有行为;tiling 的 rank 校验未兼容该表示。
  2. 该盲区长期未暴露的原因:TSE 阶段曾生成过 21 条 rank-0 终态用例,但 TTK 框架 eliminate_scalar_shapes(ops-test-kit/ttk/utilities/container_utils.py:109)会把 () 一律改写为 (1,),当时误判为"框架下用例无法自洽"而全部改写规避(见 03_tse_changelog_v4.md),导致交付的 361 条用例中 shrink 到 scalar 组合覆盖为 0;CI 的 L0 用例来自独立用例仓,恰好命中该盲区。
  3. begin_mask+shrink 同位的语义偏差同理长期无覆盖。

修复方案

修复提交(ops-math,基于 upstream/master):

  • ValidateShape:finalRank==0 且 storage shape 为 [1] 时放行(strided_slice_assign_tiling_arch35.cpp:196)
  • ExpandOneSpecDim:shrink 分支不再应用 begin/end mask,直接使用 spec begin 原值(对齐 TF)

配套 UT 新增 4 条(test_strided_slice_assign_tiling_arch35.cpp):1D/2D 全 shrink 到 scalar 正向、finalRank=0 但 input 为 (2,) 负向、begin_mask+shrink 同位语义钉住。

配套用例(SIMT-LongTails / operator-artifacts 已同步):白盒新增 10 条 rank-0 scalar 终态用例(case00207~216),覆盖 1D/2D/3D/8D 全 shrink、负索引 shrink、shrink+ellipsis 展开 0 维、begin_mask+shrink 同位、3 条 CI 失败用例同源大 shape。

验证结果(Ascend950PR 真机,GEIR 通路)

  • CI 4 条失败用例:4/4 PASS(修复前全部 EZ0012)
  • 新增 10 条 scalar 用例:10/10 PASS
  • CI 全量 165 条回归:154 PASS;6 条 FAIL 为 (-0,-0) 数据生成的 ±0.0 比对 nan(换修复前旧包对照同样失败,与本次修复无关);3 条 PROFILE_CRASH 单独复跑全 PASS(并发内存争抢 flaky);2 条 2³² 元要素越界用例 SKIP
  • host UT:bash build.sh -u --ophost --ops=strided_slice_assign --soc=ascend950,12/12 PASS(tiling 9 + infershape 3)

关联提交

  • ops-math fork master / MR 分支 fix_strided_slice_assign_scalar:1a4749de1(squash 后单提交)
  • SIMT-LongTails main:260cfb5(用例)
  • operator-artifacts master:ead9558(用例同步)

备注

  • GEIR 单算子编译缓存(atc_data/kernel_cache)会固化 tiling 结果,tiling 变更后需清缓存重跑验证
  • 遗留观察(非本次修复范围):CI 用例中 (-0,-0) 数据范围生成的 ±0.0 在比对器下 Diff 为 nan 导致误判 FAIL,建议比对器对 +0.0/-0.0 特判或按位比较
likedislike
XxuejinghuiCollaborators
29 days ago Added label: bug-report
xuejinghuiCollaborators
29 days ago Comments:

/assign

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