已关闭
[Bug-Report|缺陷反馈]: aclnnFakeQuantPerTensorAffineCachemask 0 维(rank=0)输入触发 AI Core 异常 507035 #7536
liuhanwen8创建于  7 天前关闭于  3 天前
liuhanwen8
liuhanwen8
7 天前 创建

现象

资料参数表里 self / out / mask 的「维度」列为 0-8,即 rank=0(0 维标量张量)在支持面内,
但实测 rank=0 时两段接口都返回 0,同步阶段报 507035(vector core exception)。

plog 关键行:

[ERROR] ... fault kernel_name=FakeQuantAffineCachemask_fp16_high_performance_2 ...
[ERROR] ... errorStr: The scalar instruction accesses an invalid GM address ...
[ERROR] ... rtStreamSynchronize:ErrCode=507035, desc=[vector core exception]

同一次进程内 rank=1、rank=8 的张量均正常返回,说明不是环境问题。

期望

rank=0 的 self(1 个元素)与同形状 out / mask 应正常返回,aclrtSynchronizeStream 返回 0,
out 为伪量化结果、mask 为对应布尔值;若不支持 rank=0,资料「维度」列应改为 1-8 并在参数表明确拒绝。

环境

  • 昇腾硬件型号:Ascend 910B3(Atlas A2 训练系列产品)
  • CANN 版本:9.2.0(Ascend-cann-toolkit 9.2.0)
  • 操作系统:openEuler 22.03 LTS(aarch64)
  • 代码版本:cann/ops-nn master a2b7042257(git fetch 后确认)
  • 接口资料:quant/fake_quant_affine_cachemask/docs/aclnnFakeQuantPerTensorAffineCachemask.md

复现步骤

  1. 将下方 issue_rank0.cpp 保存到任意目录;
  2. 执行 CANN 环境变量脚本;
  3. 按下方命令编译;
  4. 运行 ./issue_rank0;
  5. 观察 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;
}
实测输出:
[缺陷组 DEFECT] GetWorkspaceSize = 0
[缺陷组 DEFECT] execute = 0
[缺陷组 DEFECT] synchronize = 507035
[缺陷组 DEFECT] expect synchronize = 0(rank 0-8 均在资料支持面内)

影响

  • 崩溃级:设备侧 vector core 异常,同一 stream 上后续任务全部失败,需要重建上下文;
  • 与资料声明的 rank 0-8 直接冲突,按资料构造 0 维输入的调用方会稳定触发;
  • 一次性 16MB workspace 申请后崩溃,长跑训练任务里表现为整轮中断。

建议

在 host 侧对 rank=0 做两条路之一:
① 支持——tiling 取 headNum 时对 0 维按 1 处理(GetShapeSize() 已是 1);
② 拒绝——在 CheckShape 里显式返回 161002,并把资料「维度」列改为 1-8。

likedislike
liuhanwen8liuhanwen8
7 天前 添加了label:bug-report
yuning_chen
yuning_chen成员
6 天前 评论:

初步分析

感谢反馈。

现象理解:
资料声明 rank 0-8,rank=0 时两段返回 0 但同步报 507035(无效 GM 地址)。

当前判断:初步判断,待复现确认。
偏 0 维路径未覆盖或校验缺失。要么修 kernel/tiling,要么资料改为 1-8。

涉及范围:
FakeQuantAffineCachemask 对标量张量的支持与文档维度列。

下一步:
复现 rank0;修复或文档收窄并首段拒绝。

likedislike
yuning_chenyuning_chen成员
6 天前 将 m0_55003149 设为负责人
yuning_chen
yuning_chen成员
6 天前 评论:

您好,问题已收到,当前 @m0_55003149 正在处理中。

likedislike
Wwym_666成员
5 天前 关联了pull request:【fix】(fak_quant_affine_cachemask)解决rank=0(0 维标量张量)输入触发 AI Core 异常
wym_666成员
5 天前 评论:

/assign

likedislike
CANN-robotCANN-robot成员
5 天前 将 wym_666 设为负责人
CANN-robotCANN-robot成员
3 天前 关闭了 issue
CANN-robotCANN-robot成员
3 天前 添加了label:resolved