已关闭
[Bug-Report|缺陷反馈]: AddRmsNormQuantV2 aclnn 对二维 gamma/beta 做错误 reshape,导致 binary 匹配失败 #4948
raoliang_sac创建于  19 天前关闭于  15 天前
raoliang_sac成员
19 天前 创建

Describe the current behavior / 问题描述

aclnnAddRmsNormQuantV2gamma 秩为 2 且第 0 维 > 1 时必定失败,报找不到 binary:

Execution_Error(EZ1009): Cannot find binary for op AddRmsNormQuantV2
launch failed for AddRmsNormQuantV2, errno:561000

bf16 路径表现为 device error type 3, error code is 507035——同一根因的另一种表现。

根因在 norm/add_rms_norm_quant_v2/op_host/op_api/aclnn_add_rms_norm_quant_v2.cppSelfPreDealData()

if (inputTensor.gamma->GetViewShape().GetDimNum() == DIM_TWO) {
    auto gammaReshape = l0op::Reshape(inputTensor.gamma, {inputTensor.gamma->GetViewShape()[1]}, executor);
    inputTensor.gamma = gammaReshape;          // 无 CHECK_RET
}

三个问题:

  1. 目标 shape 丢掉第 0 维,元素数对不上。 gamma (7,15) 有 105 个元素,却要 reshape 成 15 个。reshape 前后元素数相等当且仅当 shape[0] == 1,所以只有前导 1 的形态碰巧等价。
  2. 没有 CHECK_RET l0op::Reshape 失败返回 nullptr,被直接赋回 gamma / betaOptional,错误被完全吞掉。
  3. 只特判 DIM_TWO 秩 3 及以上不进此分支却一直工作正常,反证算子原生支持多维 gamma,这段 reshape 本身多余。

gamma / beta 被置空后,GenSimplifiedKey 生成的 key 退化:

应为: 1/1/1/0/0/3/3/ 1/2/
实为: 1/1/0/0/0/3/3/-1/2/      ← gamma dtype 变 0、beta 变 -1「不存在」

416 条 binary 无一匹配。

触发条件:走到 aclnnAddRmsNormQuantV2 入口,且 gamma 秩恰好为 2、shape[0] != 1。判断只读 gamma,与 x1 完全无关——实测 x1 秩 2 到 6 均可复现。beta 那段是同样的错误,实践中 beta 与 gamma 同形,总是一起中招。

从 torch_npu 调用时,op-plugin 在 950 上按 beta 是否存在分流,有 beta 才进 V2;直接调 aclnnAddRmsNormQuantV2(例如 TTK aclnn 模式)则无论有无 beta 都会命中。

Environment / 环境信息

  • 硬件:Ascend 950(Ascend950PR_9599,arch35 regbase)
  • CANN:9.2.0;9.1.0 同样存在
  • 仓库:ops-nn master(复现时 base 931af11c9
  • 框架:torch_npu + op-plugin(AddRmsNormQuantKernelOpApi.cpp),以及 ops-test-kit aclnn 模式直调

该缺陷由 2f541bc3e 代码同步(2025-12-21)引入,非 9.2.0 回退

Steps to reproduce the issue / 重现步骤

最小复现(fp16,x1 与 gamma 同形 (8,15)):

import torch, torch_npu
x1 = torch.rand(8, 15, dtype=torch.float16).npu()
x2 = torch.rand(8, 15, dtype=torch.float16).npu()
gamma = torch.rand(8, 15, dtype=torch.float16).npu()      # 秩 2,首维 8 > 1
scales1 = torch.rand(8, 15).npu()
zp1 = torch.zeros(8, 15, dtype=torch.int32).npu()
beta = torch.rand(8, 15, dtype=torch.float16).npu()       # 有 beta -> 走 V2
torch_npu.npu_add_rms_norm_quant(x1, x2, gamma, scales1, zp1, beta,
                                 None, None, axis=-1, epsilon=1e-5, div_mode=True)

gamma 换成 (15,)(1,15)(4,7,15) 均正常,只有秩 2 且首维 > 1 会失败。

变量隔离结论(每个配置独立进程,避免 device 进错误态后返回脏 buffer):

gamma 形态 结果
秩 1 (15,) OK
秩 2 前导 1 (1,15) OK
秩 2 (2,15) (7,15) (7,16) (7,32) (16,64) (64,128) (7,1) 全部 EZ1009
bf16 秩 2 (7,15) device error 507035
秩 3 (4,7,15) / 秩 4 / 秩 5 OK

与 dtype、末维 32B 对齐、规模均无关。

Describe the expected behavior / 预期结果

  • 符合文档约束的多维 gamma(shape 与 x1 需要 norm 的维度逐维相等)应正常计算。文档《aclnnAddRmsNormQuantV2》对 gamma 的要求是「shape 与 x1 需要 norm(层归一化)的维度保持一致」,(7,15)x1 (7,15)(7,7)x1 (8,7,7) 都是合规输入。
  • 不符合该约束的输入(如 gamma (1,N)x1 (M,N))应在 aclnn 参数校验层返回 ACLNN_ERR_PARAM_INVALID 并给出可读文案,而不是掉到 binary 匹配或 tiling 才失败。

失败时(fp16):

Execution_Error(EZ1009): Cannot find binary for op AddRmsNormQuantV2
launch failed for AddRmsNormQuantV2, errno:561000

bf16:

device error type 3, error code is 507035

plog 中 SimpleKeyTemp 与「Optional input beta exist」日志缺失,可直接佐证 gamma / beta 被置空。

100 条 aclnn 用例实测(Ascend950PR,CANN 9.2.0,每条独立进程):

配置 通过
修复前 79/100(其中 17 条失败为本缺陷,全部是 gamma 秩 2 首维 > 1)
修复后 100/100

ops-test-kit aclnn 模式独立复现同一批用例,失败集与上述 17 条完全重合。

Special notes for this issue / 备注

修复

已提 PR:https://gitcode.com/cann/ops-nn/merge_requests/8966

改法为删除整段 reshape,并把 V1 CheckParams 一直在用的 CheckShapeGammaX 补进 CheckParamsV2——V2 原先没有任何 gamma 与 x1 的 shape 校验,不合规输入正是靠那段 reshape 掩盖着。补上后报错变为:

AclNN_Parameter_Error(EZ1001): The gamma tensor's shape dim 0 is 1, is not equal to x1 8.

为什么长期没被发现:测试资产在 gamma 秩上完全没有覆盖

这是本 issue 更值得跟踪的部分。三层防线同时漏:

  1. opapi UTadd_rms_norm_quant_v2/tests/ut/op_host/op_api/ 只有 2 条用例,gamma 均为一维 {64},且两条里唯一的断言都被注释掉:

    aclnnStatus aclRet = ut.TestGetWorkspaceSize(&workspace_size);
    // EXPECT_EQ(aclRet, ACLNN_ERR_PARAM_INVALID);
    

    连返回值都不检查。

  2. ops-test-kit 用例集:该算子共 6 份 CSV、合计 2255 条gamma 秩全部为 1,无一条二维

    文件 条数 gamma 秩分布
    aclnn/aclnn_add_rms_norm_quant.csv 500 全部 1
    aclnn/aclnn_add_rms_norm_quant_v2.csv 500 全部 1
    kernel/add_rms_norm_quant.csv 500 全部 1
    kernel/add_rms_norm_quant_v2.csv 500 全部 1
    kernel/add_rms_norm_quant_vl_boundary.csv 135 全部 1
    kernel/add_rms_norm_quant_v2_vl_boundary.csv 120 全部 1

    aclnn_add_rms_norm_quant_v2.csv 为例,x1 的秩扫得很开({1:40, 2:365, 3:95}),gamma 的秩却被固定成常量 1。而本缺陷的触发条件只由 gamma 决定、与 x1 无关,所以 500 条跑下来一片绿。

    值得一提的是 golden 专门为多维 gamma 写过,注释里还引了文档原文:

    # 归约维由 gamma 的 shape 决定,不是固定的最后一维 —— aclnnAddRmsNormQuantV2 文档里
    # gamma 的约束就是「shape 与 x1 需要 norm 的维度保持一致」。
    reduce_axes = tuple(range(x_fp32.ndim - gamma.ndim, x_fp32.ndim))
    

    能力具备,但没有任何用例走进这个分支。

  3. 算子仓 STadd_rms_norm_quant_v2/tests/没有 st/ 目录,一条 ST 用例都没有(V1 有 54 条)。

建议补齐:在 aclnn_add_rms_norm_quant_v2.csv 增加 gamma 秩 2 / 3、首维 > 1 的用例(golden 侧无需改动),并给 V2 补 opapi 参数校验 UT(含负例,断言不要注释掉)。

遗留观察

CheckSupportV2() 中 legacy 平台(910B / 910_93 / 310P)的 isGammaOk 仍显式白名单 gamma (1,N),与文档约束以及 V1 在同一平台上的 CheckParams 都不一致。补上 CheckShapeGammaX 后该分支即使命中也会被参数校验拒绝,行为与走 V1 一致,不构成新的失败模式;但该路由分支的清理需要 910B 实机验证,未在 PR !8966 中一并处理。

likedislike
yuning_chenyuning_chen成员
19 天前 将 raoliang_sac 设为负责人
CANN-robotCANN-robot成员
15 天前 关闭了 issue
CANN-robotCANN-robot成员
15 天前 添加了label:resolved