Closed
[Bug-Report|缺陷反馈]: aclnnMlaPreprocess 多维约束未校验(hiddenSize/tokenNum/blockNum/blockSize/qOut 形状/未定义 quantMode 全部放行) #6583
liuhanwen8Add on 17 days agoClosed at 7 days ago
17 days ago Added label: bug-report
周云飞
17 days ago Comments:
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 不同,因此不能直接认定沿用现有检查出口就能得到相同的公开错误码。处理时需要同时核对错误码映射,使第一段拒绝行为与接口文档一致。
现有证据尚未覆盖内部完整检查和执行路径,也未完成独立复现。我们会继续确认这些约束在所报版本中的适用范围,以及第一段检查与错误码映射的具体缺口。


liuhanwen8
17 days ago Comments:
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(正确拒绝) |


游震
17 days ago Comments:
17 days ago Comments:
/assign @chaotang233


17 days ago Assign chaotang233 as responsible person
zhengyuhao3
13 days ago Comments:
13 days ago Comments:
/assign


13 days ago Assign zhengyuhao3 as responsible person
7 days ago Close issue
7 days ago Added label: resolved
问题描述
aclnnMlaPreprocess的资料对多个维度与属性给了明确取值约束,但 A2 实测这些约束大多没有被校验,非法输入直接返回 0 并照常执行(部分属性被完全忽略)。资料原文(
attention/mla_preprocess/docs/aclnnMlaPreprocess.md「约束说明」):tokenNum:取值范围 0~256hiddenSize:固定 2048~10240,为 256 的倍数blockNum:取值固定为 192;blockSize:取值固定为 128cacheMode=1/3时qOut形状为[tokenNum, headNum, 512]quantMode:0 为 per_tensor 静态非对称量化,1/2/3 标注「未实现」transposeWdq/transposeWuq/transposeWuk:「预留参数,目前只支持 true」;wdkvSplitCount:「预留参数,目前只支持 1」161002实测矩阵(其余参数取资料示例的合法值,单点变异):
[8,32,512]对照组(说明校验链存在、只是覆盖不全):
headNum=0/129、qNoRopeDim=8/272返回561002;cacheMode=1时kvCache传 int8 返回161002。环境信息
重现步骤
attention/mla_preprocess/examples/test_aclnn_mla_preprocess.cpp为基线(cacheMode=1)。hiddenSize改为 1024/2000;tokenNum改为 257;blockNum改 191;blockSize改 64;qOut末维改 576;quantMode改 1/2/3/4;transposeWdq/Wuq/Wuk改 false;wdkvSplitCount改 2/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这个未定义取值也能成功执行。备注
qOut形状与cacheMode不匹配时仍按内部固定维度写出,调用方会拿到与申请的 tensor 形状不一致的布局;
quantMode=4走了未定义分支,存在静默错误结果的风险。161002(与headNum、qNoRopeDim的现有校验保持同一出口)。