模型执行
关于模型执行的接口调用流程,请依次参见主要接口调用流程、模型执行。
基本原理
模型加载成功、模型输入和输出数据结构准备好之后,还需将输入数据传输到模型输入数据结构的对应内存中,用于模型执行。
- 关于数据传输的详细描述请参见基本原理。
- 关于模型执行,当前pyACL支持同步模型执行、异步模型执行两种方式。同步模型执行时调用acl.mdl.execute接口
- 异步模型执行时调用acl.mdl.execute_async接口
对于异步接口,还需调用acl.rt.synchronize_stream接口阻塞Host运行,直到指定Stream中的所有任务都完成。
如果同时需要实现Callback功能,请参见Callback场景。
- 异步模型执行时调用acl.mdl.execute_async接口
- 关于模型执行的输出数据,如需进行进一步的处理,可由用户自行管理实现逻辑。推理结果处理中提供了可供参考的方式。
- 模型执行结束后,若无需使用输入数据、aclmdlDesc类型、aclmdlDataset类型、aclDataBuffer类型等相关资源,需及时释放内存、销毁对应的数据类型,防止内存异常。关于模型相关资源的释放请参见模型的输入、输出资源释放。
示例代码
您可以从样例介绍中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝运行,仅供参考。
ACL_MEMCPY_HOST_TO_DEVICE = 1
ACL_MEMCPY_DEVICE_TO_HOST = 2
NPY_BYTE = 1
images_list = ["./data/dog1_1024_683.jpg", "./data/dog2_1024_683.jpg"]
for image in images_list:
# 1.自定义函数transfer_pic,使用Python库读取图片文件,并对图片进行缩放、剪裁等操作,
# transfer_pic函数的实现请参考样例中源代码
img = transfer_pic(image)
# 2.准备模型推理的输入数据,运行模式默认为运行模式为ACL_HOST,当前实例代码中模型只有一个输入
np_ptr = acl.util.numpy_to_ptr(img)
# 将图片数据从Host传输到Device
ret = acl.rt.memcpy(self.input_data[0]["buffer"], self.input_data[0]["size"], np_ptr,
self.input_data[0]["size"], ACL_MEMCPY_HOST_TO_DEVICE)
# 3.执行模型推理
# self.model_id表示模型ID,在模型加载成功后,会返回标识模型的ID
ret = acl.mdl.execute(self.model_id, self.load_input_dataset, self.load_output_dataset)
# ......
父主题: 模型推理基本场景