AI Core异常信息获取

基本原理

使用场景举例:执行整网模型推理时,如果产生AI Core报错,可以调用本接口获取报错算子的描述信息,再做进一步错误排查。

推荐的接口调用顺序如下:
  1. 定义并实现异常回调函数fn(aclrtExceptionInfoCallback类型),回调函数原型请参见aclrtSetExceptionInfoCallback

    实现回调函数的关键步骤如下:

    1. 在异常回调函数fn内调用aclrtGetDeviceIdFromExceptionInfoaclrtGetStreamIdFromExceptionInfoaclrtGetTaskIdFromExceptionInfo接口分别获取Device ID、Stream ID、Task ID。
    2. 在异常回调函数fn内调用aclmdlCreateAndGetOpDesc接口获取算子的描述信息。
    3. 在异常回调函数fn内调用aclGetTensorDescByIndex接口获取指定算子输入/输出的tensor描述。
    4. 在异常回调函数fn内如下接口获取tensor描述中的数据,进行进一步分析。

      例如,调用aclGetTensorDescAddress接口获取tensor数据的内存地址(用户可从该内存地址中获取tensor数据)、调用aclGetTensorDescType接口获取tensor描述中的数据类型、调用aclGetTensorDescFormat接口获取tensor描述中的Format、调用aclGetTensorDescNumDims接口获取tensor描述中的Shape维度个数、调用aclGetTensorDescDimV2接口获取Shape中指定维度的大小。

  2. 调用aclrtSetExceptionInfoCallback接口设置异常回调函数。
  3. 执行模型推理。

    如果存在AI Core报错,则触发回调函数fn,获取算子的信息,进行进一步分析。

示例代码

调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。

本节中的示例重点介绍AI Core异常信息获取的代码逻辑,AscendCL初始化和去初始化请参见AscendCL初始化与去初始化,运行管理资源申请与释放请参见运行管理资源申请与释放,模型加载、准备模型推理的输入/输出数据的接口调用流程、模型执行、模型卸载等请参见模型推理
// 1.AscendCL初始化

// 2.申请运行管理资源,包括设置用于计算的Device、创建Context、创建Stream

// 3.模型加载,加载成功后,返回标识模型的modelId

// 4.创建aclmdlDataset类型的数据,用于描述模型的输入数据input、输出数据output

// 5.实现异常回调函数
void callback(aclrtExceptionInfo *exceptionInfo)
{
    deviceId = aclrtGetDeviceIdFromExceptionInfo(exceptionInfo);
    streamId = aclrtGetStreamIdFromExceptionInfo(exceptionInfo);
    taskId = aclrtGetTaskIdFromExceptionInfo(exceptionInfo);
    
    char opName[256];
    aclTensorDesc *inputDesc = nullptr;
    aclTensorDesc *outputDesc = nullptr;
    size_t inputCnt = 0;
    size_t outputCnt = 0; 
    // 用户可以将获取的算子信息写入到文件,或者另起线程,当发生异常回调时触发线程处理函数,在线程处理函数中将算子信息在屏幕上显示 
    aclmdlCreateAndGetOpDesc(deviceId, streamId, taskId, opName, 256,  &inputDesc, &inputCnt, &outputDesc, &outputCnt);
    // 可以调用AscendCL tensor的相关接口,获取算子的相关信息,用户可以根据自己需要调用
    for (size_t i = 0; i < inputCnt; ++i) {
        const aclTensorDesc *desc = aclGetTensorDescByIndex(inputDesc, i);
        aclGetTensorDescAddress(desc);
        aclGetTensorDescFormat(desc);
    }
    for (size_t i = 0; i < outputCnt; ++i) {
        const aclTensorDesc *desc = aclGetTensorDescByIndex(outputDesc, i);
        aclGetTensorDescAddress(desc);
        aclGetTensorDescFormat(desc);
    }
    aclDestroyTensorDesc(inputDesc);
    aclDestroyTensorDesc(outputDesc);
}

// 6.设置异常回调
aclrtSetExceptionInfoCallback(callback);

// 7.执行模型
ret = aclmdlExecute(modelId, input, output);

// 8.处理模型推理结果

// 9.释放描述模型输入/输出信息、内存等资源,卸载模型

// 10.释放运行管理资源

// 11. AscendCL去初始化

// ......