一、学习目标
1.了解模型推理过程如何进行数据传输 2.了解模型推理步骤及代码逻辑 2.掌握模型转换工具的使用方法及常用参数意义 3.了解AIPP并掌握AIPP的使用方法
二、模型离线推理
模型离线推理主要是使用已经转好的om对输入图片进行推理,主要步骤如下图所示:
各步骤解析如下:Host&Device内存管理与数据传输:Host&Device上的内存申请与释放,内存间的相互拷贝;模型加载:将离线的om文件加载到Device上;在样例的资源初始化模块中进行。模型输入输出准备:根据离线om的输入输出,在Device上申请好模型的输入输出内存;在样例的资源初始化模块中进行。执行推理:当模型的输入内存获取到有效数据后,便可以调用AscendCL接口执行模型推理,推理完成后结果生成到输出内存中;在样例的模型推理模块中进行。输出解析:使用AscendCL接口,将模型输出数据从特定格式中解析出来;在输出数据处理模块中进行。
(相关资料图)
三、数据传输和内存管理
1. 接口调用流程
(1)申请内存
a. Host上的内存,可以用C++标准库中的new、malloc接口申请内存,也可以使用AscendCL提供的aclrtMallocHost接口申请内存。
b. Device上的内存,使用AscendCL提供的aclrtMalloc或aclrtMallocHost接口申请内存。如果涉及媒体数据处理(例如,图片解码、缩放等)时,需使用acldvppMalloc或hi_mpi_dvpp_malloc接口申请内存。
(2)将数据读入内存。
由用户自行管理数据读入内存的实现逻辑。
(3)通过内存复制实现数据传输。
数据传输可以通过内存复制的方式实现,分为同步内存复制、异步内存复制:
a.同步内存复制:调用aclrtMemcpy接口。
b.异步内存复制:调用aclrtMemcpyAsync接口,再调用aclrtSynchronizeStream接口实现Stream内任务的同步等待。
对于Host内的数据传输、Device内的数据传输、Host与Device之间的数据传输,可以调用内存复制的接口实现,也可以直接通过指针传递数据。
2.内存管理具体样例
四、模型管理
1.模型加载
具体流程:
2.模型卸载
模型推理结束后需要通过aclmdlUnload接口卸载模型,并销毁aclmdlDesc类型的模型描述信息、释放模型运行的工作内存和权值内存。
五、模型输入输出准备
1.数据类型
AscendCL提供了相应的数据类型来描述模型、模型输入、模型输出以及存放数据的内存,在模型执行前,需要构造好这些数据类型,作为模型执行的输入:
(1)使用aclmdlDesc类型的数据描述模型基本信息(例如输入/输出的个数、名称、数据类型、Format、维度信息等)。
模型加载成功后,用户可根据模型的ID,调用aclmdlGetDesc接口获取该模型的描述信息,进而从模型的描述信息中获取模型输入/输出的个数、内存大小、维度信息、Format、数据类型等信息,可参见aclmdlDesc类型下的操作接口。
(2)使用aclmdlDataset类型的数据描述模型的输入/输出数据,模型可能存在多个输入、多个输出。
调用aclmdlDataset类型下的操作接口添加aclDataBuffer类型的数据、获取aclDataBuffer的个数等。
(3)每个输入/输出的内存地址、内存大小用aclDataBuffer类型的数据来描述。
调用aclDataBuffer类型下的操作接口获取内存地址、内存大小等。
2.调用接口
六、模型推理
准备好模型执行所需的输入、输出数据类型后,存放好模型执行的输入数据后,可以执行模型推理了。当前AscendCl支持同步模型执行、异步模型执行两种方式,这里说的同步、异步是站在调用者和执行者的角度。
若调用模型执行的接口后需等待推理完成再返回,则表示同步的。当用户调用同步模型执行接口后,可直接从该接口的输出参数中获取模型执行的结果数据,接口调用逻辑简单;若调用模型执行的接口后不等待推理完成完成再返回,则表示异步的。异步模型执行时,AscendCL提供了Callback机制,在指定时间内一旦有推理的结果数据,就触发回调函数获取推理结果,提高处理效率。
具体流程: