Open
问题 #7
zl_hwAdd on  Jul 21
zl_hwCollaborators
Jul 21 Create

ArgMaxGrad 资料矛盾与未声明约束清单
范围:tasks/argmaxgrad/doc 三份文档 + ops-nn/index/arg_max_grad 源码交叉核对。
结论:以下 4 项均为资料一致性问题,不构成算子功能性缺陷;但会导致 ST 用例无法覆盖或用户误用,需资料侧先统一口径。
生成日期:2026-11-05。
问题 1:var 的 rank 上界,需求与 spec 冲突
项
内容
严重度
高(影响 ST 覆盖判定与用户认知)
冲突点
需求称「任意 rank」,spec 限定 [1,8],代码无上界检查
● 01_requirement.md:47
| var | Input(REQUIRED) | FLOAT16 / FLOAT / INT32 / INT8 | 任意 rank 的 ND |
● 03_spec.yaml:12
rank: [1, 2, 3, 4, 5, 6, 7, 8]
● 代码佐证:op_host/arg_max_grad_def.cpp 与 op_host/arch35/arg_max_grad_tiling_arch35.cpp:170 均无 rank 上界检查,只拒 rank=0(rank == 0 时拒收)。即算子实际支持任意 rank ≥ 1。
影响:ST 评审因「rank>8 是否支持无法判定」产生 GAP(RANK.HIGH、INVALID_RANK、shape-layout:F1/F2),rank>8 用例无法取舍。
建议改法(二选一,推荐方案 A):
● 方案 A(推荐):03_spec.yaml 将 rank 上界放开,与「任意 rank」及代码一致,例如改为 rank: 任意(≥1) 或删掉 rank 硬约束,另行说明「上界由实现/元素计数决定」;并在 requirement §3.1 补一句「rank 上界不再收窄,A5 与 A2 一致为任意 rank」。
● 方案 B:若确有上界(如框架或 proto 限制),在 requirement §3.1 与 spec 同时写明上界值及来源,并在 tiling 增补对应拒收逻辑 + UT。
问题 2:indices/updates 的形状形态,README 与需求/spec 矛盾(keepdim vs squeeze)
项
内容
严重度
高(会引导用户构造 GE 会拒收的形状)
冲突点
README 描述为 keepdim「置 1」,需求/spec 明确 keepdim 会被拒收
● README.md:37(参数说明)
indices ... shape为var的形状把第dimension维置1。
● README.md:45(约束说明)
indices与updates沿dimension轴的长度必须为1,即...只能是[2,3,1,5](等价[2,3,5]),不支持[2,3,2,5]。
● 01_requirement.md:59
...indices/updates 只能是 squeeze 形态 [2,3,5],不支持 [2,3,2,5],也不支持 keepdim 的 [2,3,1,5](rank 4 会被 GE verify 以 "The dim size of var should biger than updates(indices) 1." 拒收)
● 03_spec.yaml:42
不支持 PyTorch scatter 的一般形态(var=[2,3,4,5] dim=2 时 indices/updates 只能是 squeeze 形态 [2,3,5];keepdim 的 [2,3,1,5] 会被 GE verify 拒收)
影响:README 的「置 1」是 keepdim 描述,与真实契约(squeeze、rank(indices)==rank(var)-1)相反。ST 评审因此把 keepdim 拒收列为 DEFECT(STRUCT.MIXED_RANK、COVERAGE.DECLARED、structure:F1),且无法判断该异常用例该不该补。
建议改法:
● README.md:37 改为「shape 为 var 去掉第 dimension 维后的形状(rank(var)==1 时为 (1,))」。
● README.md:45 改为与 requirement/spec 一致的 squeeze 表述:「indices/updates 的 shape 为 var 去掉第 dimension 维(如 var=[2,3,4,5]、dimension=2 时为 [2,3,5]);不支持 keepdim 形态 [2,3,1,5],会被 GE verify 拒收」。
问题 3:设计文档中 assist 输入前后自相矛盾(A2 4 输入遗留文本)
项
内容
严重度
中(不影响实现,但误导 reviewer/后续维护)
冲突点
§5 要求「严格读取 assist 第 4 输入」,§8/需求 §6.3 明确「3 输入、assist 自生成」
● 02_design.md:87
严格读取 assist:...单算子调用(GE 图 / TTK)可以传任意 assist,语义必须与 A2 的 vcmp(indices, assist, 'eq') 一致。
● 02_design.md:102(§6.1 DFX 表)
| shape 不一致 | host 校验拒收:indices.shape != updates.shape、var.shape != assist.shape(对齐 A2 check_param 的两条硬校验) |
● 相矛盾处 02_design.md:124(§8 风险表)
| assist 可推导,是否可省 | 省掉:其值恒等于...内核直接由 (outer, D, inner) 布局的中间维直接得到,...省掉一条与 var 等大的 int32 GM 读 |
● 佐证 01_requirement.md:116、op_host/arg_max_grad_def.cpp(仅 3 输入 var/indices/updates)、op_kernel/arg_max_grad.cpp(GenAssist 内核内生成轴下标)。
影响:02_design.md:87、:102 是从 A2 ArgMaxGradD(4 输入)改写遗留的旧文本;var.shape != assist.shape 这条校验在当前 3 输入实现中已被 tiling 正确移除(见 arg_max_grad_tiling_arch35.cpp:161-163 注释),与文档冲突。
建议改法:
● 02_design.md:87 删除或改写为「轴下标(assist 等价量)由内核按 (outer, D, inner) 自生成,不再作为输入;生成语义与 A2 assist_int32_help 等价而非近似」。
● 02_design.md:102 删掉 var.shape != assist.shape 半句,仅保留 indices.shape != updates.shape。
问题 4:被选轴长度 D ≤ INT32_MAX 约束未在资料声明
项
内容
严重度
中(实现有约束,资料未公开,导致容量边界无法判定)
冲突点
代码有上限检查,README/spec/requirement 均未声明
● 代码 op_host/arch35/arg_max_grad_tiling_arch35.cpp:69-71
// 被选轴长上限: 轴下标 assist 在内核按 int32 生成... D 超过 INT32_MAX 时下标 k 回绕...
constexpr int64_t MAX_DIM_SIZE = static_cast<int64_t>(INT32_MAX);
● 代码 op_host/arch35/arg_max_grad_tiling_arch35.cpp:213
OP_CHECK_IF((tilingData_->dimSize > MAX_DIM_SIZE), ... "<= INT32_MAX", return GRAPH_FAILED);
● 三份资料均无此声明:README.md、01_requirement.md、03_spec.yaml 全文未提及被选轴长上限。
影响:ST 评审 SHAPE.INT32、FOUR_G_ELEMENTS、FOUR_G_BYTES 三个 GAP 的根因——「int32 索引容量边界无法判定」。已核实 upboundary 用例 d_b_351/d_b_421 的 4G 落在 outer(dimSize=1),不触发该拒收,属合法功能用例;真正受限的只是被选轴长度 D,此约束需写进资料。
建议改法:
● 在 README.md「约束说明」与 03_spec.yaml「constraints」补一条:「被选轴长度 D 不超过 INT32_MAX(索引以 int32 表示,超过会回绕)」,并在 01_requirement.md §3.2/§2 对应说明。
附:与 ST 评审 14 项 P2 finding 的对应关系
资料问题
直接导致的 ST 评审结论
问题 1(rank 上界)
RANK.HIGH(GAP)、INVALID_RANK(GAP)、shape-layout:F1/F2
问题 2(keepdim 形态)
STRUCT.MIXED_RANK(DEFECT)、COVERAGE.DECLARED(DEFECT)、structure:F1
问题 3(assist 描述)
评审中未显式列为 finding,但会影响 reviewer 对实现理解(建议随修复一并处理)
问题 4(D 上限未声明)
SHAPE.INT32(GAP)、FOUR_G_ELEMENTS(GAP)、FOUR_G_BYTES(GAP)
其余 6 项 P2 属纯用例缺陷(单因素变异缺失、dimval_015 字段错误、NAN-INT32、TOL-FLOAT、GEIR-2、不支持 dtype 负向覆盖),修改对象是 ST 用例本身,不在本文档范围内。

likedislike
Zzl_hwCollaborators
Jul 21 Modify description of issue
TangPCTangPCCollaborators
29 days ago Modify description of issue
Zzl_hwCollaborators
29 days ago Modify description of issue
Zzl_hwCollaborators
12 days ago Modify description of issue
TangPC
TangPCCollaborators
11 days ago Comments:

本地跑通 TensorFlow 通路的环境版本组合

实测日期:2026-10-30(现场复测 npu_device.open(),NPU:0 设备创建成功、tf.math.add 计算正确)

一、版本组合

项 版本 / 位置
解释器 Python 3.9.25,/workspace/zl_tmp/venv39/bin/python
TensorFlow 2.6.5
npu_device(Ascend TF adapter) 2.6.5,装在 venv39 内,含 _npu_device_backends.so / _npu_ops.so
keras 2.6.0
tensorflow-estimator 2.6.0
Keras-Preprocessing 1.1.2
numpy 1.19.5
protobuf 3.19.6
absl-py 0.15.0
CANN toolkit 9.3.0(innerversion V100R001C12B116,arch x86_64)
/home/developer/Ascend/ascend-toolkit/latest
gcc 13.3.0
Ascend-cann-tfplugin 未安装(系统无 tfplugin 目录)

TF adapter 源码:/workspace/zl_tmp/tensorflow/tf_adapter_2.x(自行编译)。
npu-device 不在 pypi 上,venv39 若丢失需从该源码重新构建安装。

二、跑法

/workspace/zl_tmp/venv39/bin/python -m ttk e2e -i <用例csv> -t <用例名> \
    [--compare --no-memory-check --pc --plugin --proc-timeout --run]

ttk e2e 只认上述参数;写 -d false -b release 会 unrecognized arguments 秒退。

三、必须注意的坑

  1. 不能用默认 python3:默认是 Python 3.12 + TF 2.21 + 无 npu_device,日志出现
    npu_device not installed, falling back to CPU 或 Device Platform: cpu →
    回落 CPU,我方算子全程不被调用,此时看到的任何 TF 报错都只是 TF 自身 CPU kernel 行为,
    结论一律作废。

  2. 验自定义 / vendor 算子要设 ASCEND_CUSTOM_OPP_PATH:本次 smoke test 出现告警
    Could not load custom npu supported ops ASCEND_CUSTOM_OPP_PATH empty,
    不设则只会走 CANN 内置算子。

  3. inplace 语义的 tf API 用例集不能标 output_tensor_indexes:
    TTK testcase_manager/testcase_e2e.py:492 只把不在 output_tensor_indexes 里的张量算作输入,
    tf.compat.v1.scatter_mul(ref, indices, updates) 的 ref 既是输入也是输出,
    标成 output 会报 requires at least 3 input tensor parameters ... but testcase configured 2。
    TTK 只对 torch 的 inplace 方法有 _is_inplace_tensor_method 特判,tf 不走那条。

  4. ttk tf 子命令不是主仓能力:主仓 cann/ops-test-kit 只有
    {kernel, aclnn, e2e, geir, info, list}。ttk tf(.pb → aclgrphParseTensorFlow → GE,
    不依赖 npu_device)是我们自己的 PR225(分支 feat/ttk-tf-invoke-pathway),
    测试方没有该子命令,不能作为对外建议。

四、现场复测输出(摘要)

python 3.9.25
tf 2.6.5
npu_device /workspace/zl_tmp/venv39/lib/python3.9/site-packages/npu_device/__init__.py
...
core/npu_device.cpp:208] entering Create Device
core/npu_device.cpp:237] W Could not load custom npu supported ops ASCEND_CUSTOM_OPP_PATH empty
core/npu_device_register.cpp:104] Npu device instance /job:localhost/replica:0/task:0/device:NPU:0 created
OK npu open
[2. 4.]
likedislike
zl_hwCollaborators
6 days ago Comments:
Zzl_hwCollaborators
4 days ago Modify description of issue
Zzl_hwCollaborators
4 days ago Modify description of issue