已关闭
[Bug] ForeachAddc*List Div 精度档位漏配 + LambApplyOptimizerAssign grad 广播支持面与资料不符 #5750
TangPC创建于  13 天前关闭于  13 天前
TangPC
TangPC成员
13 天前 创建

Describe the current behavior / 问题描述

一、ForeachAddcdivList:Div 未指定精度档位,fp32 结果偏离正确舍入 1 ULP

foreach/foreach_utils/op_kernel/arch35/foreach_addc_list_regbase.hDiv 调用未指定 DivConfig,落到缺省 DivAlgo::INTRINSIC。该档在 dav-3510 上仅保真到 1 ULP:实测 fp32 用例 23689/524288(4.52%) 元素与正确舍入结果相差 1 ULP。

x1scalars*(x2/x3) 几乎相消的点上(例如输入 [-0.743, 1.248, 1.679]、结果 -6.39e-05),该绝对偏差被放大成上千 ULP 的相对误差,导致 cross_check 的 mare 判据报红(实测 mare 29.87 > L1 阈值 5.0)。

仓内 20/22 处显式 Div 配置均选 0ULP 档,本文件此前漏配;兄弟算子 foreach_div_list_inplace 已修过同一问题并在注释中记录(实测 8.3% 元素偏 1 ULP)。

二、LambApplyOptimizerAssign:资料声明的 grad 广播能力实际不被支持

README 声明 grad 可小于 inputv/inputm 并向上广播,但底层 Ops::Base 广播模板的 DoDimensionCollapse 不支持对 In0(grad)做广播。infershape 与 tiling 的校验用的是 NumPy 右对齐广播语义,会放行这类组合,导致失败被推迟到 tiling 阶段以 E90003 Inner_Error_Compile_Fail 抛出,报错不可读。

Environment / 环境信息

  • 硬件:Ascend950PR
  • CANN:9.2.0
  • 仓库:cann/ops-nn
  • 测试工具:ops-test-kit (TTK) 3.0.0

Steps to reproduce the issue / 重现步骤

问题一(Div 精度档位):

python3 -m ttk kernel -i <fp32 用例> --plugin foreach/foreach_addcdiv_list/tests/assets/golden.py \
  -d=false -b=false -c=true --dump full --dump-format npy

用例参数:单张量 (1024,512),dtype fp32,input_data_ranges = ((-2,2),(1,4),(1,4),(1,1))
将 dump 出的 NPU 输出与 fl(x1 + fl(x2/x3))(fp32 正确舍入三步)逐位比对。

问题二(grad 广播):

python3 -m ttk geir -i <用例> --plugin optim/lamb_apply_optimizer_assign/tests/assets/golden.py -c

用例参数:grad=()grad=(1,1,4)inputv=inputm=(2,3,4)input3=(2,3,4),全 fp16/fp32。

Describe the expected behavior / 预期结果

  • 问题一:fp32 除法结果应与 IEEE-754 正确舍入一致(0 ULP 偏差),与竞品实现口径对齐。
  • 问题二:资料声明的支持面应与实际能力一致;不支持的输入组合应在 host(infershape / tiling)阶段以可读的 shape 校验错误拒绝,而非在 tiling 编译阶段抛模板内部错误。

问题一 —— cross_check 判据实测:

eager      mare=29.87  mere=0.000372  rmse=0.000596  pass=False   (reason: ratio exceeded: mare(29.87>5.0))

逐位比对(同用例同区间):

改前(DivAlgo::INTRINSIC)        NPU 与正确舍入三步逐位不同: 23689/524288 (4.518%)
改后(PRECISION_0ULP_FTZ_TRUE)   NPU 与正确舍入三步逐位不同:     0/524288

问题二 —— 修复前,报错来自广播模板内部:

Inner_Error_Compile_Fail(E90003): Compile operator failed, cause: Template constraint,
  The 1 input's dim num is not same with output's dim num
    [FUNC:DimensionCollapse][FILE:broadcast_tiling.cpp][LINE:167]
  dimension collapse failed.
    [FILE:lamb_apply_optimizer_assign_tiling_arch35.cpp][LINE:128]

修复后,在 host 校验阶段给出明确原因:

[lamb_apply_optimizer_assign_tiling_arch35.cpp][CheckInplaceShapeConstraint]
  OpName:[op1] Parameter grad of op1 has incorrect shape [1].
  Reason: grad does not support broadcast and must have exactly the same shape as inputv/inputm.

Special notes for this issue / 备注

实测支持面矩阵(LambApplyOptimizerAssign,静态 GE 通路):

grad input3 结果
(2,3,4) (2,3,4) PASS
(2,3,4) (1,1,4) / (4,) / () / (1,) / (1,1,1) PASS
(2,3,4) (1,2,3,4)(rank 大于输出) 拒绝
() / (1,1,4) / (1,3,4) / (2,1,4) / (2,3,1) (2,3,4) 拒绝

结论:grad/inputv/inputm 三者必须同形,input3 是唯一可广播的输入。

关联 PR:https://gitcode.com/cann/ops-nn/pull/10141https://gitcode.com/cann/ops-nn/pull/10142

likedislike
TangPCTangPC成员
13 天前 添加了label:bug-report
yuning_chenyuning_chen成员
13 天前 将 zl_hw 设为负责人
CANN-robotCANN-robot成员
13 天前 关闭了 issue
CANN-robotCANN-robot成员
13 天前 添加了label:resolved