模型执行
关于模型执行的接口调用流程,请依次参见主要接口调用流程、模型执行。
基本原理
模型加载成功、模型输入和输出数据结构准备好之后,还需将输入数据传输到模型输入数据结构的对应内存中,用于模型执行。
- 关于数据传输的详细描述请参见基本原理。
- 关于模型执行,当前AscendCL支持同步模型执行、异步模型执行两种方式。
- 同步模型执行时调用aclmdlExecute接口
- 异步模型执行时调用aclmdlExecuteAsync接口
对于异步接口,还需调用aclrtSynchronizeStream接口阻塞应用程序运行,直到指定Stream中的所有任务都完成。
如果同时需要实现Callback功能,请参见Callback场景。
- 关于模型执行的输出数据,如需进行进一步的处理,可由用户自行管理实现逻辑。推理结果处理中提供了可供参考的方式。
- 模型执行结束后,若无需使用输入数据、aclmdlDesc类型、aclmdlDataset类型、aclDataBuffer类型等相关资源,需及时释放内存、销毁对应的数据类型,防止内存异常。关于模型相关资源的释放请参见模型的输入、输出资源释放。
示例代码
您可以从样例介绍中获取完整样例代码。
调用接口后,需增加异常处理的分支,并记录报错日志、提示日志,此处不一一列举。以下是关键步骤的代码示例,不可以直接拷贝编译运行,仅供参考。
string testFile[] = { "../data/dog1_1024_683.bin", "../data/dog2_1024_683.bin" }; for (size_t index = 0; index < sizeof(testFile) / sizeof(testFile[0]); ++index) { //1 自定义函数ReadBinFile,调用C++标准库std::ifstream中的函数读取图片文件,输出图片文件占用的内存大小inputBuffSize以及图片文件存放在内存中的地址inputBuff void *inputBuff = nullptr; uint32_t inputBuffSize = 0; auto ret = Utils::ReadBinFile(fileName, inputBuff, inputBuffSize); //2 准备模型推理的输入数据 //在申请运行管理资源时调用aclrtGetRunMode接口获取软件栈的运行模式 //如果运行模式为ACL_DEVICE,则g_isDevice参数值为true,表示软件栈运行在Device侧,无需传输图片数据或在Device内传输数据 ;否则,需要调用内存复制接口将数据传输到Device if (!g_isDevice) { // if app is running in host, need copy data from host to device //modelInputBuffer、modelInputSize分别表示模型推理输入数据的内存地址、内存大小,在输入/输出数据结构准备时申请该内存 aclError aclRet = aclrtMemcpy(modelInputBuffer, modelInputSize, inputBuff, inputBuffSize, ACL_MEMCPY_HOST_TO_DEVICE); (void)aclrtFreeHost(inputBuff); } else { // app is running in device aclError aclRet = aclrtMemcpy(modelInputBuffer, modelInputSize, inputBuff, inputBuffSize, ACL_MEMCPY_DEVICE_TO_DEVICE); (void)aclrtFree(inputBuff); } //3. 执行模型推理 //modelId_表示模型ID,在模型加载成功后,会返回标识模型的ID //input_、output_分别表示模型推理的输入、输出数据,在准备模型推理的输入、输出数据结构时已定义 aclError ret = aclmdlExecute(modelId_, input_, output_) //TODO:处理每一张图片的推理结果 } //TODO:模型执行的输入和输出资源释放
父主题: 模型推理基本场景