已关闭
[Bug-Report|缺陷反馈]: aclnnFakeQuantPerTensorAffineCachemask 0 维(rank=0)输入触发 AI Core 异常 507035 #7536
liuhanwen8创建于 7 天前关闭于 3 天前
7 天前 添加了label:bug-report
yuning_chen
6 天前 评论:
6 天前 评论:
6 天前 将 m0_55003149 设为负责人
yuning_chen
6 天前 评论:
6 天前 评论:
您好,问题已收到,当前 @m0_55003149 正在处理中。


5 天前 将 wym_666 设为负责人
3 天前 关闭了 issue
3 天前 添加了label:resolved
现象
资料参数表里 self / out / mask 的「维度」列为 0-8,即 rank=0(0 维标量张量)在支持面内,
但实测 rank=0 时两段接口都返回 0,同步阶段报 507035(vector core exception)。
plog 关键行:
同一次进程内 rank=1、rank=8 的张量均正常返回,说明不是环境问题。
期望
rank=0 的 self(1 个元素)与同形状 out / mask 应正常返回,
aclrtSynchronizeStream返回 0,out 为伪量化结果、mask 为对应布尔值;若不支持 rank=0,资料「维度」列应改为 1-8 并在参数表明确拒绝。
环境
a2b7042257(git fetch 后确认)复现步骤
issue_rank0.cpp保存到任意目录;./issue_rank0;synchronize = 507035(期望 0)。复现脚本
// aclnnFakeQuantPerTensorAffineCachemask:0 维(rank=0)self 触发 AI Core 异常 507035 // 资料声明 self/out/mask 维度为 0-8,rank=0 应可用。 // 编译:g++ -O2 -std=c++17 issue_rank0.cpp -o issue_rank0 \ // -I$ASCEND_TOOLKIT_HOME/include -L$ASCEND_TOOLKIT_HOME/lib64 -lascendcl -lnnopbase -lopapi // 运行:./issue_rank0 #include <cstdio> #include "acl/acl.h" #include "aclnnop/aclnn_fake_quant_per_tensor_affine_cachemask.h" int main() { setvbuf(stdout, nullptr, _IONBF, 0); aclInit(nullptr); aclrtSetDevice(0); aclrtStream stream = nullptr; aclrtCreateStream(&stream); aclFloat16 hx = aclFloatToFloat16(1.0f); aclFloat16 hs = aclFloatToFloat16(0.05f); int32_t zp = 120; uint8_t maskCanary = 0x7F; void *xs = nullptr, *ss = nullptr, *zs = nullptr, *os = nullptr, *ms = nullptr; aclrtMalloc(&xs, 2, ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc(&ss, 2, ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc(&zs, 4, ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc(&os, 2, ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc(&ms, 1, ACL_MEM_MALLOC_HUGE_FIRST); aclrtMemcpy(xs, 2, &hx, 2, ACL_MEMCPY_HOST_TO_DEVICE); aclrtMemcpy(ss, 2, &hs, 2, ACL_MEMCPY_HOST_TO_DEVICE); aclrtMemcpy(zs, 4, &zp, 4, ACL_MEMCPY_HOST_TO_DEVICE); aclrtMemcpy(ms, 1, &maskCanary, 1, ACL_MEMCPY_HOST_TO_DEVICE); // 0 维张量:dimNum = 0 int64_t one = 1; aclTensor *self = aclCreateTensor(nullptr, 0, ACL_FLOAT16, nullptr, 0, ACL_FORMAT_ND, nullptr, 0, xs); aclTensor *scale = aclCreateTensor(&one, 1, ACL_FLOAT16, &one, 0, ACL_FORMAT_ND, &one, 1, ss); aclTensor *zeroPoint = aclCreateTensor(&one, 1, ACL_INT32, &one, 0, ACL_FORMAT_ND, &one, 1, zs); aclTensor *out = aclCreateTensor(nullptr, 0, ACL_FLOAT16, nullptr, 0, ACL_FORMAT_ND, nullptr, 0, os); aclTensor *mask = aclCreateTensor(nullptr, 0, ACL_BOOL, nullptr, 0, ACL_FORMAT_ND, nullptr, 0, ms); uint64_t wsSize = 0; aclOpExecutor *exec = nullptr; int rc1 = (int)aclnnFakeQuantPerTensorAffineCachemaskGetWorkspaceSize( self, scale, zeroPoint, 1.0f, 0, 255, out, mask, &wsSize, &exec); printf("[缺陷组 DEFECT] GetWorkspaceSize = %d\n", rc1); if (rc1 != 0) return 0; void *ws = nullptr; if (wsSize > 0) aclrtMalloc(&ws, wsSize, ACL_MEM_MALLOC_HUGE_FIRST); printf("[缺陷组 DEFECT] execute = %d\n", (int)aclnnFakeQuantPerTensorAffineCachemask(ws, wsSize, exec, stream)); printf("[缺陷组 DEFECT] synchronize = %d\n", (int)aclrtSynchronizeStream(stream)); printf("[缺陷组 DEFECT] expect synchronize = 0(rank 0-8 均在资料支持面内)\n"); return 0; }影响
建议
在 host 侧对 rank=0 做两条路之一:
① 支持——tiling 取 headNum 时对 0 维按 1 处理(
GetShapeSize()已是 1);② 拒绝——在
CheckShape里显式返回 161002,并把资料「维度」列改为 1-8。