更新时间:2021-03-18 GMT+08:00
分享

样例介绍

获取样例

您可以从开发环境上的“ACLlib组件的安装目录/acllib/sample/acl_execute_model”目录下获取样例acl_resnet50_async的代码。

功能描述

该样例主要是基于Caffe ResNet-50网络(单输入、单batch)实现图片分类的功能。

将Caffe ResNet-50网络的模型文件转换为适配昇腾AI处理器的离线模型(*.om文件),在样例中,加载该om文件,对2张*.jpg图片进行n次异步推理(n作为运行应用的参数,由用户配置),分别得到n次推理结果后,再对推理结果进行处理,输出top1置信度的类别标识。

图1 Sample示例

原理介绍

在该Sample中,涉及的关键功能点,如下表所示。API接口的详细介绍请参见《应用软件开发指南》中的“AscendCL API参考”

初始化

  • 调用aclInit接口初始化ACL配置。
  • 调用aclFinalize接口实现ACL去初始化。

Device管理

  • 调用aclrtSetDevice接口指定用于运算的Device。
  • 调用aclrtGetRunMode接口获取昇腾AI软件栈的运行模式,根据运行模式的不同,内部处理流程不同。
  • 调用aclrtResetDevice接口复位当前运算的Device,回收Device上的资源。

Context管理

  • 调用aclrtCreateContext接口创建Context。
  • 调用aclrtSetCurrentContext接口设置线程的Context。
  • 调用aclrtDestroyContext接口销毁Context。

Stream管理

  • 调用aclrtCreateStream接口创建Stream。
  • 调用aclrtDestroyStream接口销毁Stream。

内存管理

  • 调用aclrtMallocHost接口申请Host上内存。
  • 调用aclrtFreeHost释放Host上的内存。
  • 调用aclrtMalloc接口申请Device上的内存。
  • 调用aclrtFree接口释放Device上的内存。

数据传输

如果在开发者板上运行应用,则无需进行数据传输。

模型推理

  • 调用aclmdlLoadFromFileWithMem接口从*.om文件加载模型。
  • 创建新线程(例如t1),在线程函数内调用aclrtProcessReport接口,等待指定时间后,触发回调函数(例如CallBackFunc,用于处理模型推理结果)。
  • 调用aclrtSubscribeReport接口,指定处理Stream上回调函数(CallBackFunc)的线程(t1)。
  • 调用aclmdlExecuteAsync接口执行模型推理,异步接口。
  • 调用aclrtLaunchCallback接口,在Stream的任务队列中增加一个需要在Host/Device上执行的回调函数(CallBackFunc)。
  • 调用aclrtSynchronizeStream接口,阻塞应用程序运行,直到指定Stream中的所有任务都完成。
  • 调用aclrtUnSubscribeReport接口,取消线程注册,Stream上的回调函数(CallBackFunc)不再由指定线程(t1)处理。
  • 模型推理结束后,调用aclmdlUnload接口卸载模型。

数据后处理

提供样例代码,处理模型推理的结果,直接在终端上显示top5置信度的类别编号。

另外,样例中提供了自定义接口DumpModelOutputResult,用于将模型推理的结果写入文件(运行可执行文件后,推理结果文件在应用可执行文件的同级目录下),默认未调用该接口,用户可在sample_process.cpp中,在调用OutputModelResult接口前,增加如下代码调用DumpModelOutputResult接口:

// print the top 5 confidence values with indexes.use function DumpModelOutputResult
// if want to dump output result to file in the current directory
processModel.DumpModelOutputResult();
processModel.OutputModelResult();

目录结构

样例代码结构如下所示。

├acl_resnet50_async
├── caffe_model
│   ├── resnet50.prototxt       //resnet50网络的模型文件

├── data
│   ├── dog1_1024_683.jpg            //测试数据
│   ├── dog2_1024_683.jpg            //测试数据

├── inc
│   ├── memory_pool.h                 //声明内存池处理相关函数的头文件
│   ├── model_process.h               //声明模型处理相关函数的头文件
│   ├── sample_process.h              //声明资源初始化/销毁相关函数的头文件                   
│   ├── utils.h                       //声明公共函数(例如:文件读取函数)的头文件

├── script
│   ├── transferPic.py               //将*.jpg转换为*.bin,同时将图片从1024*683的分辨率缩放为224*224

├── src
│   ├── acl.json         //系统初始化的配置文件
│   ├── CMakeLists.txt         //编译脚本
│   ├── main.cpp               //主函数,图片分类功能的实现文件
│   ├── memory_pool.cpp        //内存池处理相关函数的实现文件
│   ├── model_process.cpp      //模型处理相关函数的实现文件
│   ├── sample_process.cpp     //资源初始化/销毁相关函数的实现文件                                          
│   ├── utils.cpp              //公共函数(例如:文件读取函数)的实现文件

├── .project     //工程信息文件,包含工程类型、工程描述、运行目标设备类型等
├── CMakeLists.txt    //编译脚本,调用src目录下的CMakeLists文件
分享:

    相关文档

    相关产品

close