Closed
[Bug-Report|缺陷反馈]: aclnnMlaPreprocess 多维约束未校验(hiddenSize/tokenNum/blockNum/blockSize/qOut 形状/未定义 quantMode 全部放行) #6583
liuhanwen8Add on  17 days agoClosed at  7 days ago
liuhanwen8
liuhanwen8
17 days ago Create

问题描述

aclnnMlaPreprocess 的资料对多个维度与属性给了明确取值约束,但 A2 实测这些约束大多没有被校验,
非法输入直接返回 0 并照常执行(部分属性被完全忽略)。资料原文(attention/mla_preprocess/docs/aclnnMlaPreprocess.md「约束说明」):

  • tokenNum:取值范围 0~256
  • hiddenSize:固定 2048~10240,为 256 的倍数
  • blockNum:取值固定为 192;blockSize:取值固定为 128
  • cacheMode=1/3 时 qOut 形状为 [tokenNum, headNum, 512]
  • quantMode:0 为 per_tensor 静态非对称量化,1/2/3 标注「未实现」
  • transposeWdq/transposeWuq/transposeWuk:「预留参数,目前只支持 true」;wdkvSplitCount:「预留参数,目前只支持 1」
  • 报错表:shape/dtype 不在支持范围内应返回 161002

实测矩阵(其余参数取资料示例的合法值,单点变异):

用例 资料约束 实测第一段 / 第二段
hiddenSize=1024 2048~10240 0 / 0(成功执行)
hiddenSize=2000 为 256 的倍数 0 / 0
tokenNum=257 0~256 0 / 0
blockNum=191 固定 192 0 / 0
blockSize=64 固定 128 0 / 0
qOut=[8,32,576](cacheMode=1) [8,32,512] 0 / 0
quantMode=4(未定义取值) 无此取值 0 / 0
quantMode=1 / 2 / 3 标注「未实现」 0 / 361001(第二段才报 runtime error)
transposeWdq=false 只支持 true 0 / 0,且输出与 true 位级一致
transposeWuq=false / transposeWuk=false 只支持 true 0 / 0,输出与 true 位级一致
wdkvSplitCount=2 / 3 只支持 1 0 / 0,输出与 1 位级一致

对照组(说明校验链存在、只是覆盖不全):headNum=0/129、qNoRopeDim=8/272 返回 561002;
cacheMode=1 时 kvCache 传 int8 返回 161002。

环境信息

  • 产品:Atlas A2 训练系列产品(910B2),单卡
  • CANN:9.2.0(npu-smi 26.1.1)
  • 调用方式:aclnn 两段式 C 直调
  • 基线参数:tokenNum=8、hiddenSize=7168、headNum=32、blockNum=192、blockSize=128、cacheMode=1、quantMode=0

重现步骤

  1. 以 attention/mla_preprocess/examples/test_aclnn_mla_preprocess.cpp 为基线(cacheMode=1)。
  2. 逐项做单点变异:把 hiddenSize 改为 1024/2000;tokenNum 改为 257;blockNum 改 191;blockSize 改 64;
    qOut 末维改 576;quantMode 改 1/2/3/4;transposeWdq/Wuq/Wuk 改 false;wdkvSplitCount 改 2/3。
    (改维度时输入张量形状同步改到自洽,避免其它维度的校验先命中。)
  3. 观察两段返回值与输出是否被写入。
    // 例:hiddenSize=1024(资料下限 2048)
    std::vector<int64_t> inputShape = {8, 1024};
    std::vector<int64_t> gamma0Shape = {1024};   // beta0 同;wdqkv 改为 [2112, 1024]
    // ... 其余形状同步
    ret = aclnnMlaPreprocessGetWorkspaceSize(...);   // 实测 0
    ret = aclnnMlaPreprocess(workspace, workspaceSize, executor, stream);  // 实测 0

预期结果

超出资料约束的取值应在第一段返回 161002;标注「未实现」的 quantMode 与「只支持 true/1」的预留参数同理,
不应被静默接受。

实际结果

上述用例大多返回 0 并正常执行;transpose* 与 wdkvSplitCount 的非法取值被完全忽略(输出与合法取值位级一致);
quantMode=4 这个未定义取值也能成功执行。

备注

  • 影响:非法 shape 被放行后进入 tiling/kernel,行为不再受资料保证;qOut 形状与 cacheMode 不匹配时仍按内部固定维度写出,
    调用方会拿到与申请的 tensor 形状不一致的布局;quantMode=4 走了未定义分支,存在静默错误结果的风险。
  • 建议按维度补齐校验并统一在第一段返回 161002(与 headNum、qNoRopeDim 的现有校验保持同一出口)。
likedislike
liuhanwen8liuhanwen8
17 days ago Added label: bug-report
周云飞
周云飞Collaborators
17 days ago Comments:

您好,感谢提供详细的单点变异用例和对照结果。

问题分析

从您在 Atlas A2(910B2)、CANN 9.2.0 上报告的结果看,问题主要涉及三类输入约束:

  • 维度与形状:hiddenSize 的范围及对齐要求、tokenNum 上限、blockNum/blockSize 固定值,以及 cacheMode=1 时 qOut 的末维约束,均出现超出所引文档范围但两段返回成功的情况。
  • 量化模式:未定义的 quantMode=4 被接受,而标注“未实现”的 1/2/3 到第二段才返回 361001,未在第一段拒绝。
  • 预留属性:transposeWdq/Wuq/Wuk=false 和 wdkvSplitCount=2/3 被接受,且您观察到输出与受支持取值位级一致。不过,仅凭输出一致还不能确定这些属性在内部完全未被使用。

这些结果反映了所引文档约束与实际输入检查行为不一致。返回成功并不意味着超出文档范围的输入已受支持。尤其是 qOut 形状不匹配的情况,需要进一步确认实际写入布局;目前还不能据此断定存在越界写入,也不能确定 quantMode=4 的具体执行分支。

处理方向

一个可行的处理方向是在第一段参数检查中,按适用的产品和 cacheMode 补齐维度范围、对齐要求及输入输出形状关系检查,并明确拒绝未支持的量化模式和预留属性取值。若某些限制实际上已放宽,则需要明确支持边界并同步文档,不能仅以执行成功作为支持依据。

关于统一返回 161002 的建议,还需要区分内部检查结果与公开接口返回码。您给出的 headNum/qNoRopeDim 对照组实际返回 561002,与期望的 161002 不同,因此不能直接认定沿用现有检查出口就能得到相同的公开错误码。处理时需要同时核对错误码映射,使第一段拒绝行为与接口文档一致。

现有证据尚未覆盖内部完整检查和执行路径,也未完成独立复现。我们会继续确认这些约束在所报版本中的适用范围,以及第一段检查与错误码映射的具体缺口。

likedislike
liuhanwen8
liuhanwen8
17 days ago Comments:

同根因在 aclnnMlaPreprocessV2 上同样成立(同一套 def 声明与校验链),补充 A2 单点变异实测(两段返回值):

用例 资料约束 V2 实测
hiddenSize=1024 / 2000 2048~10240 且为 256 倍数 0 / 0
tokenNum=257 0~256 0 / 0
blockNum=191 / blockSize=64 固定 192 / 128 0 / 0
qOut 末维=576(cacheMode=1) 512 0 / 0
quantMode=4 无此取值 0 / 0
quantMode=1/2/3 标注「未实现」 0 / 361001
transposeWdq/Wuq/Wuk=false 只支持 true 0 / 0,输出与 true 位级一致
wdkvSplitCount=2/3 只支持 1 0 / 0,输出与 1 位级一致
对照:headNum=0/129、qNoRopeDim=8/272 1~128 / 16~256 561002(正确拒绝)
对照:cacheMode=1 且 kvCache 为 int8 与 input 一致 161002(正确拒绝)
likedislike
游震Collaborators
17 days ago Comments:

/assign @chaotang233

likedislike
CANN-robotCANN-robotCollaborators
17 days ago Assign chaotang233 as responsible person
游游震Collaborators
17 days ago Assign monologue815 as responsible person
游游震Collaborators
17 days ago Removed responsible person chaotang233
zhengyuhao3Collaborators
13 days ago Comments:

/assign

likedislike
CANN-robotCANN-robotCollaborators
13 days ago Assign zhengyuhao3 as responsible person
CANN-robotCANN-robotCollaborators
7 days ago Close issue
CANN-robotCANN-robotCollaborators
7 days ago Added label: resolved