aclrtSetExceptionInfoCallback
产品支持情况
|
产品 |
是否支持 |
|---|---|
|
Atlas 350 加速卡 |
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
√ |
功能说明
设置异常回调函数。若多次设置异常回调函数,以最后一次设置为准。
函数原型
1
|
aclError aclrtSetExceptionInfoCallback(aclrtExceptionInfoCallback callback) |
参数说明
|
参数名 |
输入/输出 |
说明 |
|---|---|---|
|
callback |
输入 |
指定要注册的回调函数。 回调函数的函数原型为: typedef void (*aclrtExceptionInfoCallback)(aclrtExceptionInfo *exceptionInfo); |
返回值说明
返回0表示成功,返回其他值表示失败,请参见aclError。
约束说明
- 回调函数涉及共享资源(例如锁),因此在使用回调函数需慎重,在回调函数内调用资源申请&释放、Stream同步、Device同步、任务下发、任务终止等接口,可能会导致错误或死锁。
- 您需要在执行异步任务之前,设置异常回调函数,当Device上的任务执行异常时,系统会向用户设置的异常回调函数中传入一个包含任务ID、Stream ID、线程ID、Device ID以及错误码的aclrtExceptionInfo结构体指针,并执行回调函数,用户可以再分别调用aclrtGetTaskIdFromExceptionInfo、aclrtGetStreamIdFromExceptionInfo、aclrtGetThreadIdFromExceptionInfo、aclrtGetDeviceIdFromExceptionInfo、aclrtGetErrorCodeFromExceptionInfo接口获取产生异常的任务ID、Stream ID、线程ID、Device ID以及错误码,便于定位问题。
使用场景举例:例如,在调用aclopExecuteV2接口前,调用aclrtSetExceptionInfoCallback接口设置异常回调函数,当算子在Device执行异常时,系统会向用户设置的异常回调函数中传入一个包含任务ID、Stream ID、线程ID、Device ID以及错误码的aclrtExceptionInfo结构体指针,并执行回调函数。
- 如果想清空回调函数,可调用aclrtSetExceptionInfoCallback接口,将入参设置为空指针。
接口调用流程
使用场景举例:执行整网模型推理时(不支持动态Shape场景),如果产生AI Core报错,可以按照本章的内容获取报错算子的描述信息,再做进一步错误排查。
- 定义并实现异常回调函数fn(aclrtExceptionInfoCallback类型)。
- 在异常回调函数fn内调用aclrtGetDeviceIdFromExceptionInfo、aclrtGetStreamIdFromExceptionInfo、aclrtGetTaskIdFromExceptionInfo接口分别获取Device ID、Stream ID、Task ID。
- 在异常回调函数fn内调用aclmdlCreateAndGetOpDesc接口获取算子的描述信息。
- 在异常回调函数fn内调用aclGetTensorDescByIndex接口获取指定算子输入/输出的tensor描述。
- 在异常回调函数fn内调用如下接口获取tensor描述中的数据,进行进一步分析。
例如,调用aclGetTensorDescAddress接口获取tensor数据的内存地址(用户可从该内存地址中获取tensor数据)、调用aclGetTensorDescType接口获取tensor描述中的数据类型、调用aclGetTensorDescFormat接口获取tensor描述中的Format、调用aclGetTensorDescNumDims接口获取tensor描述中的Shape维度个数、调用aclGetTensorDescDimV2接口获取Shape中指定维度的大小。
- 调用aclrtSetExceptionInfoCallback接口设置异常回调函数。
- 执行模型推理。
示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
...... // 1.模型加载,加载成功后,返回标识模型的modelId // 2.创建aclmdlDataset类型的数据,用于描述模型的输入数据input、输出数据output // 3.实现异常回调函数 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); // 可以调用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); } // 4.设置异常回调 aclrtSetExceptionInfoCallback(callback); // 5.执行模型 aclmdlExecute(modelId, input, output); // 6.处理模型推理结果 ...... // 7.释放描述模型输入/输出信息、内存等资源,卸载模型 ...... |