文档
注册

AI Core异常信息获取

基本原理

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

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

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

    1. 在异常回调函数fn内调用acl.rt.get_device_id_from_exception_infoacl.rt.get_stream_id_from_exception_infoacl.rt.get_task_id_from_exception_info接口分别获取Device ID、Stream ID、Task ID。
    2. 在异常回调函数fn内调用acl.mdl.create_and_get_op_desc接口获取算子的描述信息。
    3. 在异常回调函数fn内调用acl.get_tensor_desc_by_index接口获取指定算子输入/输出的Tensor描述。
    4. 在异常回调函数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中指定维度的大小。

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

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

示例代码

调用接口后,需增加异常处理的分支,示例代码中不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。

示例中,运行管理资源申请与释放请参见运行管理资源申请与释放,模型加载的接口调用流程请参见接口调用流程,模型推理的接口调用流程、准备模型推理的输入/输出数据的接口调用流程请参见准备模型执行的输入/输出数据结构
 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
53
import acl
import numpy as np
# ......

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

# 2.模型加载,加载成功后,返回标识模型的model_id。
# ......

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

# 4.实现异常回调函数。
def exception_callback(info):
    stream_id = acl.rt.get_stream_id_from_exception_info(info)
    thread_id = acl.rt.get_thread_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.释放运行管理资源。
# ......
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词