Open
ArgMaxGrad #13
TangPCAdd on  Sep 21
TangPC
TangPCCollaborators
Sep 21 Create

ArgMaxGrad 反馈资料核对结论

  • 日期:2026-11-06
  • 范围:operator-artifacts/hpc-group/august/ArgMaxGrad 的 01/02/03 三份文档、ops-nn/index/arg_max_grad 的 README 与源码、canndev 的 A2 实现
  • 性质:资料一致性问题核对 + A2/A5 兼容性复核 + 修复记录。修复未提交。

0. 结论摘要

  1. 反馈的 4 项资料矛盾全部成立,文档侧已修正。
  2. 第 2 项(keepdim)和第 4 项(D 上限)背后的代码缺口已补齐:A5 tiling 增加 rank 关系、逐维关系、D <= INT32_MAX 校验,UT 32/32 PASS。
  3. 额外发现:def.cpp 注册 ascend350 属仓库通行的 arch35 计算单元写法(同类算子 README 也不单列该产品),代码不动,只改设计文档表述;注释段名已修正。
  4. 剩余:temp/artifacts-golden-sync 拷贝未同步、ST 用例建议回归;其余 6 项 P2 属 ST 用例本身,不在本文范围。

1. 反馈 4 项核对

# 问题 结论 严重度 处理状态
1 var 的 rank 上界:需求「任意 rank」vs spec [1,8] 成立。spec 的 [1,8] 无任何来源,代码无上界 高 文档已改
2 indices/updates 形态:README keepdim vs 需求/spec squeeze 成立。README「置 1」写法错误,且 A5 原先不拒收 keepdim 高 README 已改;代码缺口已补
3 02_design 中 assist 输入前后矛盾 成立。§5/§6.1 DFX 是 A2 4 输入遗留文本 中 文档已改
4 被选轴长度 D <= INT32_MAX 未声明 成立。约束真实存在,三份资料均未写 中 文档已补;tiling 已补校验

1.1 问题 1:rank 上界

证据

  • 01_requirement.md:47(改前):任意 rank 的 ND
  • 03_spec.yaml:12(改前):rank: [1, 2, 3, 4, 5, 6, 7, 8]
  • op_host/arg_max_grad_def.cpp:OpDef 不声明 rank
  • op_host/arch35/arg_max_grad_tiling_arch35.cpp:168-170:仅 rank == 0 拒收,无上界
  • A2 侧同样无上界:canndev/ops/built-in/op_proto/elewise_calculation_ops.cc:5462-5469(IsArgMaxGradCheckPass)、arg_max_grad_d.py:48-88(check_param)、arg_max_grad_fusion_pass.cc(无 rank 数组)均只校验 rank 关系,不设上限

结论:按方案 A 放开 spec。A5 与 A2 均为「rank >= 1,无上界」。

UT:rank 覆盖已从 1~8 扩到 1~9,含 rank > 8 一档。

1.2 问题 2:keepdim vs squeeze

证据

  • README.md:37/45(改前):把第 dimension 维置 1、只能是 [2,3,1,5](等价 [2,3,5])
  • A2 契约:IsArgMaxGradCheckPass 要求 rank(var) == rank(updates) + 1;[2,3,1,5](rank 4)被拒(elewise_calculation_ops.cc:5462-5469)
  • A5 proto:op_graph/arg_max_grad_proto.h:49-57 只有 REG_OP + TensorType,无 VERIFY_FUNC
  • A5 tiling:arg_max_grad_tiling_arch35.cpp:181-216 只校验 dimension 范围与 indicesNum == outer × inner,不校验 rank 与逐维关系

结论:README 改为 squeeze(已改)。修复前「keepdim 会被拒收」只对 A2/A3 成立,A5 会接受。

修复前 A5 行为(var=[2,3,4,5], dim=2,outer=6, D=4, inner=5,门槛 30 个元素):

indices shape 元素数 修复前 A5 语义
[2,3,5] 30 接受 正确契约形态
[2,3,1,5] 30 接受 与 squeeze 内存布局等价
[6,5] 30 接受 与 squeeze 内存布局等价
[3,10] 30 接受 行长被当成 10,静默错算
[2,3,2,5] 60 拒收 元素数不符

元素数校验会放行一批不等价形状,存在静默错算风险,也是 ST STRUCT.MIXED_RANK、structure:F1 的根因。已补 rank + 逐维校验,修复后上述非 squeeze 形态全部拒收。

1.3 问题 3:assist 遗留文本

证据(改前)

  • 02_design.md:87:要求「严格读取 assist」,且称「可以传任意 assist」
  • 02_design.md:102:DFX 校验 var.shape != assist.shape
  • 与 02_design.md:124(§8「省掉 assist」)、01_requirement.md:106-118/127(3 输入、assist 自生成)矛盾
  • 实现佐证:arg_max_grad_def.cpp 仅 3 输入;op_kernel/arch35/arg_max_grad_nd.h:218(GenAssist)与 arg_max_grad_vf.h:15(轴下标内核生成)

结论:A2 4 输入方案(ArgMaxGradD)遗留文本,成立。已按 3 输入口径统一。

1.4 问题 4:D 上限未声明

证据

  • 约束真实存在:内核轴下标 k 以 int32 生成(arg_max_grad_nd.h:218-250 的 Duplicate/Adds(int32_t);VF 内 Reg::Arange 同为 int32)
  • A2 同口径:fusion pass 生成 assist 为 int32,且 arg_max_grad_fusion_pass.cc:239 把 GetDim 强转 int32_t
  • 三份资料(README / 01 / 03)确实均未声明

但反馈的代码依据与本地快照不符

  • 反馈引用:arg_max_grad_tiling_arch35.cpp:69-71 有 MAX_DIM_SIZE 注释、:213 有 dimSize > MAX_DIM_SIZE 校验
  • 本地实际::69-71 是 MERGE_* 常量;:213 是 indicesNum 校验;全文件(含 ops-nn-fix 副本)搜不到 MAX_DIM_SIZE / INT32_MAX

结论:约束本身成立,资料已按「支持范围」补写,并在 A5 tiling 补了 dimSize > INT32_MAX 拒收,现资料与代码一致。评审所引用的 MAX_DIM_SIZE 行号与本地快照不同,可能来自更新分支,但契约与落点已无差异。

2. A2 兼容性复核

README 改动 对 A2/A3 是否成立 说明
公式/参数改为 squeeze ✅ 成立 A2 verify 明确要求 rank(var)=rank(updates)+1
「keepdim [2,3,1,5] 会被拒收」 ✅ 全产品(修复后) A2/A3 由 GE verify,A5 由 tiling 的 rank 校验
「rank >= 1,无上界」 ✅ 成立 A2 verify/check_param/fusion pass 均无上界
「仅 rank 为 0 时拒收」 ⚠️ 措辞偏 A5 A2 的 rank 0 是经 dimension 校验间接拒收,应改中性表述
「D <= INT32_MAX」 ✅ 成立(支持范围口径) A2/A5 均 int32;A2 无显式校验,写成支持范围准确

跨代差异结论:同一张带 keepdim indices 的图,在 A2/A3 会被 GE verify 拒收,在 A5 的 kernel/TTK 通路会被接受。A5 的 geir 通路是否复用装机 CANN 的内置 proto verify 未实测,存在两条通路行为不一致的风险。

3. 额外发现(未修改,待定)

# 发现 证据 影响
E1 def.cpp 注册了 ascend950 + ascend350,与 02 §7「只注册 ascend950」及「纯 A5」定位不一致 arg_max_grad_def.cpp:47-48 vs 02_design.md:110、01_requirement.md §4 仓库通行写法(其他算子同样注册 ascend350 但 README 不单列),代码不动,已改 02 设计文档表述
E2 def.cpp 注释称 dtype 面对齐 [ArgMaxGrad] 段,但 01 §3 指出该段为 0、实际为 [ArgMaxGradD] arg_max_grad_def.cpp:22 vs 01_requirement.md:40-42/56 已改注释为 [ArgMaxGradD]
E3 01 §6.6 的前提「GE 侧 verify 已把 rank 卡死」对 A5 不成立 01_requirement.md:142-146 vs A5 proto 无 verify 是问题 2 代码缺口的文档根源,建议随修
E4 02 §9 golden 用 scatter_,与 GOLDEN_REF 明确禁用矛盾 改前 02_design.md:130 vs 04_golden/GOLDEN_REF.md:10、golden.py:57 已修
E5 02 §6 引用 01 §6.3 说明动态 shape,实际应为 §6.4 改前 02_design.md:92 已修
E6 temp/artifacts-golden-sync/.../ArgMaxGrad 仍是旧版拷贝 与改后 03_spec 有差异 需要时再同步

4. 已完成的修改(未提交)

4.1 代码(仅 A5,A2/A3 无改动)

文件 修改
op_host/arch35/arg_max_grad_tiling_arch35.cpp CheckShape 增 indices rank 关系;CheckAttrAndSplitLayout 增逐维关系与 D <= INT32_MAX 校验
op_host/arg_max_grad_def.cpp 注释段名 [ArgMaxGrad] → [ArgMaxGradD](无行为变化)
tests/ut/op_host/arch35/test_arg_max_grad_tiling.cpp 新增 keepdim / rank 不符 / 逐维不符 / D 超限 4 条负向用例;rank 全区间扩到 9

UT 结果:32 tests from ArgMaxGradTiling,PASSED 32。

4.2 文档

文件 行号 修改
01_requirement.md 47 var 的 shape 改为「任意 rank(rank >= 1,无上界)」
60 新增 A5 rank 口径(def 不声明、tiling 只拒 rank=0)
61 新增 D <= INT32_MAX 支持范围
03_spec.yaml 12 rank: [1..8] → rank: "any (>= 1)"
44 constraints 新增 rank 无上界
45 constraints 新增 D <= INT32_MAX
02_design.md 20/22 布局与公式去掉 assist 输入,改为内核生成的 k
64-77 §5 增加 assist 口径说明;伪代码改为 k_seg 内核生成
91 删除「严格读取 assist / 可传任意 assist」,改为 3 输入自生成
95 01 §6.3 → 01 §6.4
104-105 DFX 表删除 assist dtype/形状校验
107 DFX 表新增 D <= INT32_MAX
134 golden 改为纯 torch.where,与 GOLDEN_REF 对齐
176 DFX 列表删除 var/assist shape 不等
ops-nn/index/arg_max_grad/README.md 20 公式说明改为 squeeze,注明公式按 keepdim 视角书写
37 indices 参数说明改为去掉第 dimension 维
45 约束改为 squeeze,注明 keepdim 被拒
47 新增 rank >= 1、无上界
48 新增 D <= INT32_MAX

5. 待决策 / 待修清单

优先级 事项 处理 状态
P0 A5 缺 rank 与逐维关系校验 按 A2 IsArgMaxGradCheckPass 在 tiling 补齐:rank 关系、逐维关系;新增 4 条负向 UT ✅ 已修,UT 32/32 PASS
P1 本地无 D <= INT32_MAX 校验 tiling 增加 MAX_DIM_SIZE 与 dimSize 拒收 ✅ 已修
P1 README 跨代拒收表述 改为「A2/A3 由 GE verify,A5 由 tiling」,并加「产品差异」小节 ✅ 已修
P2 def.cpp 注册 ascend350 确认属仓库通行的计算单元写法,代码不动,改 02 设计文档 ✅ 已定
P2 def.cpp 注释段名 [ArgMaxGrad] → [ArgMaxGradD] ✅ 已修
P2 01 §6.6 的错误前提 改为「A5 由 tiling 校验同一契约」 ✅ 已修
P3 UT rank 只覆盖 1~8 扩到 1~9 ✅ 已修
P3 temp/artifacts-golden-sync 拷贝未同步 需要时按改后版本覆盖 ⏳ 未做

6. 不在本文范围

反馈提到的其余 6 项 P2(单因素变异缺失、dimval_015 字段错误、NAN-INT32、TOL-FLOAT、GEIR-2、不支持 dtype 负向覆盖)修改对象是 ST 用例本身,未核对。

likedislike
TangPCTangPCCollaborators
Sep 22 Modify description of issue
TangPCTangPCCollaborators
22 days ago Modify description of issue
Zzl_hwCollaborators
4 days ago Change title to "ArgMaxGrad", originally titled "LambApplyOptimizerAssign".
Zzl_hwCollaborators
4 days ago Modify description of issue
Zzl_hwCollaborators
4 days ago deleted a comment from pingchuantang.