模型加载
按照模型构建中的说明构建出模型后,再加载该模型,为模型执行做准备。
接口调用流程
开发应用时,如果涉及整网模型推理,则应用程序中必须包含模型加载的代码逻辑,关于模型加载的接口调用流程,请先参见AscendCL接口调用流程了解整体流程,再查看本节中的流程说明。本节描述的是整网模型加载的接口调用流程,对于算子模型加载与执行的详细说明请参见单算子调用。
AscendCL提供两套模型加载的接口,用户可根据编程习惯、使用场景选择对应的模型加载接口:
- 如图1所示,针对不同的加载方式(从文件加载、从内存加载等),只需设置接口中的配置参数,适用各种加载方式,但涉及多个接口配合使用,分别用于创建配置对象、设置对象中的属性值、加载模型。
- 如图2所示,根据不同的加载方式(从文件加载、从内存加载等)选择不同的接口,操作相对简单,但需要记住各种方式的加载接口。
关键接口的说明如下:
- 在模型加载前,需要先构建出适配昇腾AI处理器的离线模型(*.om文件),构建方式请参见模型构建。
- 当由用户管理内存时,为确保内存不浪费,在申请工作内存、权值内存前,需要调用aclmdlQuerySize接口查询模型运行时所需工作内存、权值内存的大小。
如果模型输入数据的Shape不确定,则不能调用aclmdlQuerySize接口查询内存大小,在加载模型时,就无法由用户管理内存,因此需选择由系统管理内存的模型加载接口(例如,aclmdlLoadFromFile、aclmdlLoadFromMem)。
- 支持以下方式加载模型,模型加载成功后,返回标识模型的模型ID:
- 使用aclmdlSetConfigOpt接口、aclmdlLoadWithConfig接口时,是通过配置对象中的属性来区分,在加载模型时是从文件加载,还是从内存加载,以及内存是由系统内部管理,还是由用户管理。
- 使用以下接口时,是从使用的接口上区分从文件加载,还是从内存加载,以及内存是由系统内部管理,还是由用户管理。
- aclmdlLoadFromFile:从文件加载离线模型数据,由系统内部管理内存。
- aclmdlLoadFromMem:从内存加载离线模型数据,由系统内部管理内存。
- aclmdlLoadFromFileWithMem:从文件加载离线模型数据,由用户自行管理模型运行的内存(包括工作内存和权值内存,工作内存用于模型执行过程中的临时数据,权值内存用于存放权值数据)。
- aclmdlLoadFromMemWithMem:从内存加载离线模型数据,由用户自行管理模型运行的内存(包括工作内存和权值内存)。
示例代码
模型加载成功,会返回标识模型的ID,在模型执行时需要使用该ID。
您可以从样例介绍中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 1.初始化变量。 // 此处的..表示相对路径,相对可执行文件所在的目录 // 例如,编译出来的可执行文件存放在out目录下,此处的..就表示out目录的上一级目录 const char* omModelPath = "../model/resnet50.om" // ...... // 2.根据模型文件获取模型执行时所需的权值内存大小、工作内存大小。 aclError ret = aclmdlQuerySize(omModelPath, &modelMemSize_, &modelWeightSize_); // 3.根据工作内存大小,申请Device上模型执行的工作内存。 ret = aclrtMalloc(&modelMemPtr_, modelMemSize_, ACL_MEM_MALLOC_HUGE_FIRST); // 4.根据权值内存的大小,申请Device上模型执行的权值内存。 ret = aclrtMalloc(&modelWeightPtr_, modelWeightSize_, ACL_MEM_MALLOC_HUGE_FIRST); // 5.加载离线模型文件,由用户自行管理模型运行的内存(包括权值内存、工作内存)。 // 模型加载成功,返回标识模型的ID。 ret = aclmdlLoadFromFileWithMem(modelPath, &modelId_, modelMemPtr_, modelMemSize_, modelWeightPtr_, modelWeightSize_); // ...... |
父主题: 模型推理