ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

CANN Runtime 异常处理接口深度指南:错误获取、异常回调、UCE 修复与任务中止

2026/9/19 18:11:18 拓冰建站 浏览量
CANN Runtime 异常处理接口深度指南:错误获取、异常回调、UCE 修复与任务中止 CANN Runtime 异常处理接口深度指南错误获取、异常回调、UCE 修复与任务中止【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtimeCANN Runtime 在异步执行模型推理或算子任务时设备侧如 AI Core、内存、链路可能发生异常而异步任务本身不会直接向 Host 侧抛出错误码。本文基于 CANN Runtime 异常处理官方文档系统梳理 Runtime 提供的错误信息获取、进程级异常回调注册、内存 UCE 查询与修复、设备任务中止与故障恢复等一整套异常处理接口并对照本仓库源码include/external/acl/acl_rt.h、src/acl/aclrt_impl/callback.cpp、src/acl/aclrt_impl/device.cpp说明底层实现机理。读完本文你将能够在模型推理或算子执行异常时准确定位出错的 Task/Stream/Device并在遇错即停场景下完成任务中止与故障恢复的完整闭环。一、异常处理接口全景本章节描述的 CANN Runtime 异常处理接口覆盖四个维度错误信息获取、异常回调注册、内存 UCE 修复及任务中止。全部接口清单如下接口功能所属类别aclGetRecentErrMsg()获取并清空同一进程或线程中其它 acl 接口调用失败时的错误描述信息错误信息获取aclrtPeekAtLastError(level)获取当前线程的 Runtime 错误码仅获取不清空错误信息获取aclrtGetLastError(level)获取当前线程的 Runtime 错误码获取后清空错误信息获取aclrtSetExceptionInfoCallback(callback)设置进程级异常回调函数废弃接口异常回调aclrtExceptionInfoCallbackRegister(callback)注册进程级异常回调函数支持多个异常回调aclrtExceptionInfoCallbackUnregister(callback)注销已注册的进程级异常回调函数异常回调aclrtGetTaskIdFromExceptionInfo(info)获取异常信息中的任务 ID异常信息读取aclrtGetStreamIdFromExceptionInfo(info)获取异常信息中的 Stream ID异常信息读取aclrtGetThreadIdFromExceptionInfo(info)获取异常信息中的线程 ID异常信息读取aclrtGetDeviceIdFromExceptionInfo(info)获取异常信息中的 Device ID异常信息读取aclrtGetErrorCodeFromExceptionInfo(info)获取异常信息中的错误码异常信息读取aclrtGetMemUceInfo(deviceId, array, size, retSize)获取内存 UCE不可纠正错误的错误虚拟地址试验特性UCE 修复aclrtMemUceRepair(deviceId, array, arraySize)修复内存 UCE 的错误虚拟地址试验特性UCE 修复aclrtDeviceTaskAbort(deviceId, timeout)停止指定 Device 上正在执行的任务丢弃已下发任务试验特性任务中止aclrtGetErrorVerbose(deviceId, errorInfo)设备故障后获取详细错误信息试验特性故障恢复aclrtRepairError(deviceId, errorInfo)基于详细错误信息进行故障恢复试验特性故障恢复aclrtSetDeviceTaskAbortCallback(regName, callback, args)注册在aclrtDeviceTaskAbort前后触发的回调函数任务中止这些接口的声明与数据结构统一定义在头文件 include/external/acl/acl_rt.h并在 src/acl/aclrt_impl/acl_rt_wrapper.h 中以统一宏的形式打包转发到底层 RT 接口rtTaskFailCallback、rtSetTaskFailCallback等最终由src/acl/aclrt_impl/目录下的实现文件完成。产品支持情况汇总各接口在不同产品上的支持情况不完全一致以下为汇总详细情况可对照原文档各接口的产品支持说明接口Ascend 950PR/950DTAtlas A3 系列Atlas A2 系列Atlas 200I/500 A2Atlas 推理系列Atlas 训练系列IPV350aclGetRecentErrMsg支持支持支持支持支持支持不支持aclrtSetExceptionInfoCallback支持支持支持支持支持支持不支持aclrtExceptionInfoCallbackRegister/Unregister支持支持支持支持支持支持不支持aclrtGetTaskId/StreamId/ThreadId/DeviceId/ErrorCodeFromExceptionInfo支持支持支持支持支持支持不支持aclrtPeekAtLastError/aclrtGetLastError支持支持支持支持支持支持支持aclrtGetMemUceInfo/aclrtMemUceRepair支持支持支持不支持不支持不支持不支持aclrtDeviceTaskAbort支持支持支持不支持不支持不支持不支持aclrtGetErrorVerbose/aclrtRepairError支持支持支持不支持不支持不支持不支持aclrtSetDeviceTaskAbortCallback支持支持支持不支持不支持不支持不支持二、错误信息获取aclGetRecentErrMsgconst char *aclGetRecentErrMsg()功能说明获取并清空与本接口在同一个进程或线程中的其它 acl 接口调用失败时的错误描述信息。获取的是进程级还是线程级的错误描述信息由 aclInit 接口中的err_msg_mode配置控制默认线程级别。使用该接口需要注意以下几点建议每次 acl 接口调用失败时都调用本接口以便获取异常时的错误描述信息用于定位问题否则可能导致错误信息堆积、丢失。同一个进程或线程中多次调用aclGetRecentErrMsg后只有最后一次调用返回的错误描述字符串指针有效。之前调用返回的指针不能继续使用否则可能导致内存非法访问。本接口获取多条错误描述信息时最上面的错误描述信息为最新的。参数与返回值参数名输入/输出说明无—无参数返回错误描述字符串的指针获取失败时返回nullptr。返回的字符串由 Runtime 内部管理仅最后一次调用的结果有效业务侧不应长期保存该指针。三、线程级 Runtime 错误码aclrtPeekAtLastError 与 aclrtGetLastError这两个接口用于获取当前线程的 Runtime运行时管理模块错误码区别在于是否清空aclError aclrtPeekAtLastError(aclrtLastErrLevel level) // 仅获取不清空 aclError aclrtGetLastError(aclrtLastErrLevel level) // 获取后清空aclrtPeekAtLastError仅获取但不清空错误码可反复调用多次查看同一错误。aclrtGetLastError获取后清空当前线程的错误码。清空后在线程中无新增错误码之前调用本接口获取到的是ACL_SUCCESS。参数名输入/输出说明level输入指定获取错误码的级别当前仅支持线程级别。类型定义参见 aclrtLastErrLevel。返回 0 表示成功返回其他值表示失败错误码含义参见 aclError。aclrtLastErrLevel在头文件中定义为枚举ACL_RT_THREAD_LEVEL 0见 acl_rt.h当前只存在线程级别一个取值。与aclGetRecentErrMsg相比这两个接口返回的是结构化错误码而非文本描述适合在程序中做分支判断而文本化描述信息更适合打印日志。四、进程级异常回调机制4.1 核心概念Device 上的任务如 AI Core 算子异步执行执行异常不会同步返回到调用侧。Runtime 通过进程级异常回调机制在任务执行异常时向用户注册的回调函数传入一个aclrtExceptionInfo结构体指针其中包含任务 ID、Stream ID、线程 ID、Device ID 以及错误码。用户可以在回调中调用读取接口获取这些字段从而定位是哪个任务在哪个流上出了错。回调函数原型与结构体定义include/external/acl/acl_rt.h、acl_rt.htypedef struct rtExceptionInfo aclrtExceptionInfo; // 不透明结构体仅由 Runtime 内部管理 typedef void (*aclrtExceptionInfoCallback)(aclrtExceptionInfo* exceptionInfo);使用前提在执行异步任务之前完成回调的设置或注册否则可能收不到任务的异常通知。典型场景举例在调用aclopExecuteV2接口前设置/注册异常回调函数当算子在 Device 上执行异常时系统会传入包含任务 ID、Stream ID、线程 ID、Device ID 以及错误码的aclrtExceptionInfo指针并执行回调。4.2 aclrtSetExceptionInfoCallback废弃aclError aclrtSetExceptionInfoCallback(aclrtExceptionInfoCallback callback)须知此接口已废弃请使用 aclrtExceptionInfoCallbackRegister 或 aclrtExceptionInfoCallbackUnregister 接口替代。头文件声明处同样带有ACL_DEPRECATED_MESSAGE编译期废弃提示见 acl_rt.h。功能要点设置进程级异常回调函数如果想清空回调函数可将入参设置为空指针NULL。若多次调用本接口设置异常回调函数以最后一次设置为准。不影响通过aclrtExceptionInfoCallbackRegister接口注册的异常回调函数。参数名输入/输出说明callback输入指定要注册的回调函数原型为typedef void (*aclrtExceptionInfoCallback)(aclrtExceptionInfo* exceptionInfo);约束说明回调函数涉及共享资源例如锁因此使用需慎重在回调函数内调用资源申请释放、Stream 同步、Device 同步、任务下发、任务终止等接口可能导致错误或死锁。当 Device 上的任务执行异常时系统向回调函数传入包含任务 ID、Stream ID、线程 ID、Device ID 以及错误码的aclrtExceptionInfo指针并执行回调。exceptionInfo由 Runtime 管理仅在本次回调执行期间有效。回调函数不得保存、释放或修改该指针及其内容。4.3 aclrtExceptionInfoCallbackRegister 注册aclError aclrtExceptionInfoCallbackRegister(aclrtExceptionInfoCallback callback)与废弃接口的关键差异在于支持注册多个不同的回调函数通过本接口可注册多个函数指针值不同的异常回调函数。重复调用本接口注册同一个回调函数时返回成功但 Runtime 只会保留最后一次注册信息。本接口注册的回调与aclrtSetExceptionInfoCallback废弃设置的回调可以共存Device 任务异常进入 Runtime 异常通知流程时两类回调都会被通知。同一个回调函数既通过废弃接口设置、又通过本接口注册时Runtime 会将其保存为两个相互独立的注册项本次通知中该回调会被调用两次两次调用的先后顺序不做保证。参数名输入/输出说明callback输入要注册的回调函数不能为 NULL原型为typedef void (*aclrtExceptionInfoCallback)(aclrtExceptionInfo *exceptionInfo);入参为 NULL 时返回参数错误。从源码看注册实现在 src/acl/aclrt_impl/callback.cpp 中aclrtExceptionInfoCallbackRegisterImpl调用MakeExceptionCallbackRegName(rtCallback)将回调函数指针映射为一个字符串注册名再转发到底层rtSetTaskFailCallback注册接口。也就是说底层 RT 层以注册名 回调指针的形式管理注册项这正解释了文档中不同函数指针视为不同回调与重复注册同一回调仅保留最后一次的语义注销接口aclrtExceptionInfoCallbackUnregisterImplcallback.cpp则通过同样的注册名反查注销。多回调并存的额外约束Runtime 不保证同一个回调函数只在单个线程中执行。不同异常通知可能在不同线程中并发调用同一个回调函数回调函数需自行保证其访问的数据线程安全。Runtime 不对各回调函数进行异常隔离。任一回调函数抛出异常可能中断本次通知使尚未执行的其他回调函数不再被调用并可能中断 Runtime 后续异常处理。4.4 aclrtExceptionInfoCallbackUnregister 注销aclError aclrtExceptionInfoCallbackUnregister(aclrtExceptionInfoCallback callback)注销通过aclrtExceptionInfoCallbackRegister注册的进程级异常回调函数。不支持注销通过aclrtSetExceptionInfoCallback废弃接口设置的回调函数。callback为 NULL 时返回参数错误注销未注册的 callback 时不执行操作并返回成功。参数名输入/输出说明callback输入待注销的回调函数不能为 NULL。额外的语义约束Runtime 不记录调用本接口的调用方身份。进程内任意调用方只要持有已注册的相同函数指针均可注销该注册项。本接口不会等待已经进入异常通知流程或正在执行的回调函数结束。接口返回成功后后续开始分发的异常通知不再包含该注册项但已经进入通知流程的回调仍可能执行。因此释放回调函数访问的资源前需通过业务同步确认所有在途回调均已结束。4.5 多回调注册与注销示例以下示例仅展示多个回调函数的注册和注销顺序省略初始化、任务下发及异常处理逻辑void callbackA(aclrtExceptionInfo *exceptionInfo) { // 读取并处理callbackA关注的异常信息 deviceId aclrtGetDeviceIdFromExceptionInfo(exceptionInfo); streamId aclrtGetStreamIdFromExceptionInfo(exceptionInfo); taskId aclrtGetTaskIdFromExceptionInfo(exceptionInfo); ...... } void callbackB(aclrtExceptionInfo *exceptionInfo) { // 读取并处理callbackB关注的异常信息 deviceId aclrtGetDeviceIdFromExceptionInfo(exceptionInfo); streamId aclrtGetStreamIdFromExceptionInfo(exceptionInfo); taskId aclrtGetTaskIdFromExceptionInfo(exceptionInfo); ...... } aclrtExceptionInfoCallbackRegister(callbackA); aclrtExceptionInfoCallbackRegister(callbackB); // 下发异步任务并处理任务执行结果 aclrtExceptionInfoCallbackUnregister(callbackA); aclrtExceptionInfoCallbackUnregister(callbackB); // 注销接口不等待在途回调结束 // 释放回调函数访问的资源前需通过业务同步确认所有在途回调均已结束五、异常信息读取接口Runtime 向异常回调函数传入aclrtExceptionInfo指针后用户可在回调内通过以下五个只读接口取出各个字段接口返回内容异常时的特殊返回值uint32_t aclrtGetTaskIdFromExceptionInfo(const aclrtExceptionInfo *info)任务 ID0xFFFFFFFF 表示 Device 异常uint32_t aclrtGetStreamIdFromExceptionInfo(const aclrtExceptionInfo *info)Stream ID0xFFFFFFFF 表示 Device 异常uint32_t aclrtGetThreadIdFromExceptionInfo(const aclrtExceptionInfo *info)线程 ID0xFFFFFFFF 表示 Device 异常uint32_t aclrtGetDeviceIdFromExceptionInfo(const aclrtExceptionInfo *info)Device ID0xFFFFFFFF 表示 Device 异常uint32_t aclrtGetErrorCodeFromExceptionInfo(const aclrtExceptionInfo *info)错误码0xFFFFFFFF 表示 Device 异常参数info为异常信息指针输入即在执行任务之前通过废弃接口设置或通过注册接口注册回调时系统将产生异常的任务 ID、Stream ID、线程 ID、Device ID以及错误码存放在aclrtExceptionInfo结构体中。该指针由 Runtime 管理仅在本次回调执行期间有效。六、AI Core 异常信息获取的完整流程与示例使用场景执行整网模型推理时不支持动态 Shape 场景如果产生 AI Core 报错可以按照本章内容获取报错算子的描述信息再做进一步错误排查。推荐的接口调用顺序如下定义并实现异常回调函数 fnaclrtExceptionInfoCallback类型。在 fn 内调用aclrtGetDeviceIdFromExceptionInfo、aclrtGetStreamIdFromExceptionInfo、aclrtGetTaskIdFromExceptionInfo分别获取 Device ID、Stream ID、Task ID。在 fn 内调用aclmdlCreateAndGetOpDesc获取算子的描述信息。在 fn 内调用aclGetTensorDescByIndex获取指定算子输入/输出的 tensor 描述。在 fn 内调用如下接口获取 tensor 描述中的数据做进一步分析aclGetTensorDescAddresstensor 数据的内存地址可从该地址读取 tensor 数据、aclGetTensorDescType数据类型、aclGetTensorDescFormatFormat、aclGetTensorDescNumDimsShape 维度个数、aclGetTensorDescDimV2Shape 中指定维度的大小。调用aclrtSetExceptionInfoCallback或aclrtExceptionInfoCallbackRegister设置/注册异常回调函数。执行模型推理如果存在 AI Core 报错则触发回调函数 fn获取算子信息进行进一步分析。以下是 AI Core 异常信息获取功能的关键步骤代码示例不能直接拷贝编译运行仅供参考调用接口后需增加异常处理分支并记录报错日志、提示日志...... // 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.设置异常回调新接口为 aclrtExceptionInfoCallbackRegister aclrtSetExceptionInfoCallback(callback); // 5.执行模型 aclmdlExecute(modelId, input, output); // 6.处理模型推理结果 ...... // 7.释放描述模型输入/输出信息、内存等资源卸载模型 ......七、内存 UCE 查询与修复UCEuncorrectable error指系统硬件不能直接处理并恢复的内存错误。Runtime 提供查询与修复两个接口二者均为试验特性后续版本可能变更不支持应用于生产环境。7.1 aclrtGetMemUceInfo获取 UCE 错误虚拟地址aclError aclrtGetMemUceInfo(int32_t deviceId, aclrtMemUceInfo *memUceInfoArray, size_t arraySize, size_t *retSize)参数名输入/输出说明deviceId输入Device ID与 aclrtSetDevice 接口中保持一致memUceInfoArray输入输出aclrtMemUceInfo数组的指针类型定义参见 aclrtMemUceInfoarraySize输入传入aclrtMemUceInfo数组的长度retSize输出实际返回的aclrtMemUceInfo数组的有效长度7.2 aclrtMemUceRepair修复 UCE 错误虚拟地址aclError aclrtMemUceRepair(int32_t deviceId, aclrtMemUceInfo *memUceInfoArray, size_t arraySize)参数名输入/输出说明deviceId输入Device ID与 aclrtSetDevice 接口保持一致memUceInfoArray输入aclrtMemUceInfo数组的指针arraySize输入传入aclrtMemUceInfo数组的长度7.3 数据结构aclrtMemUceInfo结构体定义在头文件 acl_rt.h#define MAX_MEM_UCE_INFO_ARRAY_SIZE 128 #define UCE_INFO_RESERVED_SIZE 14 typedef struct aclrtMemUceInfo { void* addr; // UCE 错误虚拟地址 size_t len; // 地址长度 size_t reserved[UCE_INFO_RESERVED_SIZE]; } aclrtMemUceInfo;典型使用顺序先用aclrtGetMemUceInfo查询出发生 UCE 的错误虚拟地址数组实际有效长度由retSize返回再将该数组交给aclrtMemUceRepair进行修复形成查询 → 修复的闭环。八、设备故障处理与任务中止当 Device 发生严重故障时需要依次执行获取故障详情 → 中止任务 → 修复故障的流程配套接口为aclrtGetErrorVerbose、aclrtDeviceTaskAbort、aclrtRepairError以及任务中止的前后置回调接口aclrtSetDeviceTaskAbortCallback。这四个接口均为试验特性不支持应用于生产环境。8.1 aclrtGetErrorVerbose获取设备故障详细信息aclError aclrtGetErrorVerbose(int32_t deviceId, aclrtErrorInfo *errorInfo);调用时机用于在发生设备故障后获取详细错误信息。必须在获取故障事件之后、提交任务中止之前调用。参数名输入/输出说明deviceId输入Device ID与 aclrtSetDevice 接口保持一致errorInfo输出错误信息结构体定义如下aclrtErrorInfo相关类型完整定义与 acl_rt.h 一致typedef enum { ACL_RT_NO_ERROR 0, // 无错误 ACL_RT_ERROR_MEMORY 1, // 内存错误 ACL_RT_ERROR_L2 2, // L2 Buffer错误 ACL_RT_ERROR_AICORE 3, // AI Core错误 ACL_RT_ERROR_LINK 4, // 网络错误 ACL_RT_ERROR_L3_PORT 5, // L3端口错误 ACL_RT_ERROR_OTHERS 0xFFFF, // 其它错误 } aclrtErrorType; typedef enum aclrtAicoreErrorType { ACL_RT_AICORE_ERROR_UNKNOWN, // 未知错误 ACL_RT_AICORE_ERROR_SW, // 建议排查软件错误 ACL_RT_AICORE_ERROR_HW_LOCAL, // 建议排查当前Device的硬件错误 } aclrtAicoreErrorType; #define ACL_RT_MEM_UCE_INFO_MAX_NUM 20 typedef struct { size_t arraySize; // memUceInfoArray数组大小 aclrtMemUceInfo memUceInfoArray[ACL_RT_MEM_UCE_INFO_MAX_NUM]; // 内存UCE的错误虚拟地址数组 } aclrtMemUceInfoArray; typedef union aclrtErrorInfoDetail { aclrtMemUceInfoArray uceInfo; // 内存UCEuncorrect error aclrtAicoreErrorType aicoreErrType; // AI Core错误 } aclrtErrorInfoDetail; typedef struct aclrtErrorInfo { uint8_t tryRepair; // 是否需要修复0表示无需修复1表示需修复 uint8_t hasDetail; // 是否有详细报错信息0表示没有1表示有 uint8_t reserved[2]; // 预留参数 aclrtErrorType errorType; // 错误类型 aclrtErrorInfoDetail detail; // 错误详细信息 } aclrtErrorInfo;约束说明如果通过 aclrtGetOpTimeOutInterval 接口查询到的超时最短时间间隔小于 100ms 时本接口返回的故障详细信息可能不准确。对于 Atlas A3 训练系列产品/Atlas A3 推理系列产品、Atlas A2 训练系列产品/Atlas A2 推理系列产品仅支持获取ACL_RT_NO_ERROR无错误、ACL_RT_ERROR_MEMORY内存错误、ACL_RT_ERROR_OTHERS其它错误。8.2 aclrtDeviceTaskAbort停止指定 Device 上的任务aclError aclrtDeviceTaskAbort(int32_t deviceId, uint32_t timeout)停止指定 Device 上的正在执行的任务同时丢弃指定 Device 上已下发的任务。支持永久等待或配置具体的超时时间参数名输入/输出说明deviceId输入Device ID与 aclrtSetDevice 接口保持一致timeout输入超时时间0 表示永久等待0 表示配置具体的超时时间单位毫秒最大超时时间 36 分钟约束说明当前接口仅支持遇错即停场景下使用否则会出现不可预知的异常问题。默认模式为遇错继续模式如需调用本接口请先设置遇错即停模式具体可参考接口 aclrtSetStreamFailureMode。从源码看实现aclrtDeviceTaskAbortImpl实现于 src/acl/aclrt_impl/device.cpp调用前会记录deviceId与timeout的日志再向下转发到 RT 层任务中止接口。8.3 aclrtRepairError基于故障详情进行恢复aclError aclrtRepairError(int32_t deviceId, const aclrtErrorInfo *errorInfo)基于aclrtGetErrorVerbose接口获取的详细信息进行故障恢复此接口应该在提交任务中止之后调用。参数errorInfo为aclrtErrorInfo结构体输入其定义见 8.1 节。8.4 aclrtSetDeviceTaskAbortCallback任务中止前后回调aclError aclrtSetDeviceTaskAbortCallback(const char *regName, aclrtDeviceTaskAbortCallback callback, void *args)注册回调函数用于在调用aclrtDeviceTaskAbort接口前后触发该回调函数。不支持重复注册。参数名输入/输出说明regName输入注册名称保持唯一不能为空输入保证字符串以\0结尾callback输入回调函数。若 callback 不为 NULL表示注册回调函数若为 NULL表示取消注册回调函数。原型见下方定义args输入待传递给回调函数的用户数据的指针回调函数原型与 acl_rt.h、acl_rt.h 一致typedef enum { ACL_RT_DEVICE_TASK_ABORT_PRE 0, // 任务中止前 ACL_RT_DEVICE_TASK_ABORT_POST, // 任务中止后 } aclrtDeviceTaskAbortStage; typedef int32_t (*aclrtDeviceTaskAbortCallback)( int32_t deviceId, aclrtDeviceTaskAbortStage stage, uint32_t timeout, void* args);其中timeout表示期望回调函数执行的最长时间。8.5 故障恢复完整调用序列综合以上接口设备故障恢复的推荐调用序列为收到设备故障事件调用aclrtGetErrorVerbose获取详细错误信息必须在任务中止之前调用aclrtDeviceTaskAbort停止 Device 上正在执行/已下发的任务若需在前后挂接业务逻辑可先用aclrtSetDeviceTaskAbortCallback注册回调调用aclrtRepairError基于获取到的aclrtErrorInfo进行故障恢复必须在任务中止之后根据aclrtErrorInfo.errorType与detail判断是内存、L2、AI Core、链路等哪类错误决定是否需要进一步排查软硬件。九、接口返回值与错误码约定所有aclError类型的接口均遵循统一约定返回 0 表示成功返回其他值表示失败错误码含义请参见 aclError。异常信息读取接口Task/Stream/Thread/Device/ErrorCode在返回值为0xFFFFFFFF十六进制时表示Device 异常此时各字段不再具有实际意义应优先按设备级故障处理流程见第八章处理。十、总结与最佳实践错误描述与错误码双通道文本化描述用aclGetRecentErrMsg每次失败后立即调用注意只有最后一次返回的指针有效结构化错误码用aclrtGetLastError/aclrtPeekAtLastError线程级前者读取即清空。异步异常定位靠回调在异步任务下发前设置或注册进程级异常回调在回调内通过aclrtGetTaskIdFromExceptionInfo等接口拿到任务、流、线程、设备与错误码再结合aclmdlCreateAndGetOpDesc、aclGetTensorDescByIndex等接口还原出错算子的描述信息。新开发代码应使用aclrtExceptionInfoCallbackRegister/aclrtExceptionInfoCallbackUnregister而非已废弃的aclrtSetExceptionInfoCallback。回调内谨慎操作不要在回调内做资源申请/释放、Stream/Device 同步、任务下发与终止等可能引发死锁的操作多回调并存时要保证数据访问的线程安全。设备级故障走完整闭环遇错即停模式下按获取故障事件 →aclrtGetErrorVerbose→aclrtDeviceTaskAbort可配aclrtSetDeviceTaskAbortCallback前后置回调→aclrtRepairError的顺序处理。注意版本与产品限制UCE 修复、任务中止、故障恢复类接口均为试验特性且 Atlas 200I/500 A2、Atlas 推理系列、Atlas 训练系列等产品不支持投产前需确认目标产品的支持情况见产品支持情况汇总。源码阅读指引接口声明与数据结构见 include/external/acl/acl_rt.h回调注册/注销的实现见 src/acl/aclrt_impl/callback.cpp任务中止实现见 src/acl/aclrt_impl/device.cpp接口转发封装见 src/acl/aclrt_impl/acl_rt_wrapper.h。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考