函数:set_exception_info_callback
产品支持情况
|
产品 |
是否支持 |
|---|---|
|
Atlas 350 加速卡 |
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
√ |
|
|
√ |
功能说明
设置异常回调函数。
函数原型
- C函数原型
1aclError aclrtSetExceptionInfoCallback(aclrtExceptionInfoCallback callback)
- python函数
1ret = acl.rt.set_exception_info_callback(fn)
参数说明
|
参数名 |
说明 |
|---|---|
|
callback |
function,表示Python侧的回调函数,格式如下: def exception_callback(exception_info) """ :exception_info: 表示异常信息aclrtExceptionInfo的指针地址 :return: """ |
返回值说明
|
返回值 |
说明 |
|---|---|
|
ret |
int,错误码,返回0表示成功,返回其它值表示失败。 |
约束说明
- 回调函数涉及共享资源(例如锁),因此在使用回调函数需慎重,在回调函数内调用资源申请&释放、Stream同步、Device同步、任务下发、任务终止等接口,可能会导致错误或死锁。
- 您需要在执行异步任务之前,设置异常回调函数,当Device上的任务执行异常时,系统会向用户设置的异常回调函数中传入一个包含任务ID、Stream ID、线程ID、Device ID以及错误码的aclrtExceptionInfo的指针地址,并执行回调函数,用户可以再分别调用acl.rt.get_task_id_from_exception_info、acl.rt.get_stream_id_from_exception_info、acl.rt.get_thread_id_from_exception_info、acl.rt.get_device_id_from_exception_info、acl.rt.get_error_code_from_exception_info接口获取产生异常的任务ID、Stream ID、线程ID、Device ID以及错误码,便于定位问题。
使用场景举例:例如,在调用acl.op.execute_v2接口前,调用acl.rt.set_exception_info_callback接口设置异常回调函数,当算子在Device执行异常时,系统会向用户设置的异常回调函数中传入一个包含任务ID、Stream ID、线程ID、Device ID以及错误码的aclrtExceptionInfo的指针地址,并执行回调函数。
- 如果多次设置异常回调函数,以最后一次设置为准。
- 如果想清空回调函数,可再次调用acl.rt.set_exception_info_callback接口进行重置(传入None或不传入参数)。
接口调用流程
使用场景举例:执行整网模型推理时(不支持动态Shape场景),如果产生AI Core报错,可以调用本接口获取报错算子的描述信息,再做进一步错误排查。
- 定义并实现异常回调函数fn(aclrtExceptionInfoCallback类型),回调函数原型请参见acl.rt.set_exception_info_callback。
实现回调函数的关键步骤如下:
- 在异常回调函数fn内调用acl.rt.get_device_id_from_exception_info、acl.rt.get_stream_id_from_exception_info、acl.rt.get_task_id_from_exception_info接口分别获取Device ID、Stream ID、Task ID。
- 在异常回调函数fn内调用acl.mdl.create_and_get_op_desc接口获取算子的描述信息。
- 在异常回调函数fn内调用acl.get_tensor_desc_by_index接口获取指定算子输入/输出的Tensor描述。
- 在异常回调函数fn内参考如下接口获取Tensor描述中的数据,进行进一步分析。
例如,调用acl.get_tensor_desc_address接口获取Tensor数据的内存地址(用户可从该内存地址中获取Tensor数据)、调用acl.get_tensor_desc_type接口获取Tensor描述中的数据类型、调用acl.get_tensor_desc_format接口获取Tensor描述中的Format、调用acl.get_tensor_desc_num_dims接口获取Tensor描述中的Shape维度个数、调用acl.get_tensor_desc_dim_v2接口获取Shape中指定维度的大小。
- 调用acl.rt.set_exception_info_callback接口设置异常回调函数。
- 执行模型推理。
示例代码
调用接口后,需增加异常处理的分支,示例代码中不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
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 47 48 49 50 51 52 |
import acl import numpy as np # ...... # 1.申请运行时资源。 # ...... # 2.模型加载,加载成功后,返回标识模型的model_id。 # ...... # 3.创建aclmdlDataset类型的数据,用于描述模型的输入数据input、输出数据output。 # ...... # 4.实现异常回调函数。 def exception_callback(info): stream_id = acl.rt.get_stream_id_from_exception_info(info) device_id = acl.rt.get_device_id_from_exception_info(info) task_id = acl.rt.get_task_id_from_exception_info(info) # 用户可以将获取的算子信息写入到文件,或者另起线程侦听异常回调,当发生异常回调时触发线程处理函数,在线程处理函数中将算子信息打屏。 op_name, input_desc, num_inputs, output_desc, num_outputs, ret = \ acl.mdl.create_and_get_op_desc(device_id, stream_id, task_id, 256) # 可以调用acl Tensor的相关接口,获取算子的相关信息,用户可以根据自己需要调用。 for i in range(num_inputs): desc = acl.get_tensor_desc_by_index(input_desc, i) address = acl.get_tensor_desc_address(desc) num_dims = acl.get_tensor_desc_num_dims(desc) dim_0, ret = acl.get_tensor_desc_dim_v2(desc, 0) for i in range(num_outputs): desc = acl.get_tensor_desc_by_index(output_desc, i) address = acl.get_tensor_desc_address(desc) num_dims = acl.get_tensor_desc_num_dims(desc) dim_0, ret = acl.get_tensor_desc_dim_v2(desc, 0) acl.destroy_tensor_desc(input_desc) acl.destroy_tensor_desc(output_desc) # 5.设置异常回调。 ret = acl.rt.set_exception_info_callback(exception_callback) # 6.执行模型。 ret = acl.mdl.execute(model_id, input, output) # 7.处理模型推理结果。 # ...... # 8.释放描述模型输入/输出信息、内存等资源,卸载模型。 # ...... # 9.释放运行时资源。 # ...... |