Ascend 310 AI处理器上使用AIR模型进行推理

查看源文件

概述

Ascend 310是面向边缘场景的高能效高集成度AI处理器。Atlas 200开发者套件又称Atlas 200 Developer Kit(以下简称Atlas 200 DK),是以Atlas 200 AI加速模块为核心的开发者板形态的终端类产品,集成了海思Ascend 310 AI处理器,可以实现图像、视频等多种数据分析与推理计算,可广泛用于智能监控、机器人、无人机、视频服务器等场景。

本教程介绍如何在Atlas 200 DK上使用MindSpore基于AIR模型文件执行推理,主要包括以下流程:

  1. 开发环境准备,包括制作Atlas 200 DK的SD卡 、配置Python环境和刷配套开发软件包。

  2. 导出AIR模型文件,这里以ResNet-50模型为例。

  3. 使用ATC工具将AIR模型文件转成OM模型。

  4. 编译推理代码,生成可执行main文件。

  5. 加载保存的OM模型,执行推理并查看结果。

你可以在这里找到完整可运行的样例代码:https://gitee.com/mindspore/docs/tree/r1.8/docs/sample_code/acl_resnet50_sample

开发环境准备

硬件准备

  • 一个操作系统为Ubuntu的服务器或PC机,用于为Atlas 200 DK制作SD卡启动盘和开发环境部署。

  • 一张SD卡,建议容量不低于16G。

软件包准备

配置开发环境需要的脚本和软件包如下5类,共7个文件。

  1. 制卡入口脚本:make_sd_card.py

  2. 制作SD卡操作系统脚本:make_ubuntu_sd.sh

  3. Ubuntu操作系统镜像包:ubuntu-18.04.xx-server-arm64.iso,如果点击下载不成功,请尝试复制链接地址后下载。

  4. 开发者板驱动包与运行包:

    • Ascend310-driver-*{software version}*-ubuntu18.04.aarch64-minirc.tar.gz

    • Ascend310-aicpu_kernels-*{software version}*-minirc.tar.gz

    • Ascend-acllib-*{software version}*-ubuntu18.04.aarch64-minirc.run

  5. 安装开发套件包:Ascend-Toolkit-*{version}*-arm64-linux_gcc7.3.0.run

其中,

制作SD卡

读卡器通过USB与Ubuntu服务器连接,通过制卡脚本制作SD卡。具体操作参见操作步骤

连接Atlas 200 DK开发板与Ubuntu服务器

Atlas 200 DK开发者板支持通过USB端口或者网线与Ubuntu服务器进行连接。具体操作参见连接Atlas 200 DK开发者板与Ubuntu服务器

配置Python环境

安装Python以及gcc等软件,具体操作参见安装依赖

安装开发套件包

安装开发套件包Ascend-Toolkit-*{version}*-arm64-linux_gcc7.3.0.run,具体操作参见安装开发套件包

推理目录结构介绍

创建目录放置推理代码工程,例如/home/HwHiAiUser/Ascend/ascend-toolkit/20.0.RC1/acllib_linux.arm64/sample/acl_execute_model/acl_resnet50_sample,其中incsrctest_data可以从官网示例下载样例代码获取,model目录用于存放接下来导出的AIR模型文件和转换后的OM模型文件,out目录用于存放执行编译生成的可执行文件和输出结果目录,推理代码工程目录结构如下:

└─acl_resnet50_sample
    ├── inc
    │   ├── model_process.h                   //声明资源初始化/销毁相关函数的头文件
    │   ├── sample_process.h                  //声明模型处理相关函数的头文件
    │   ├── utils.h                           //声明公共函数(例如:文件读取函数)的头文件
    ├── model
    │   ├── resnet50_export.air               //AIR模型文件
    │   ├── resnet50_export.om                //转换后的OM模型文件
    ├── src
    │   ├── acl.json                          //系统初始化的配置文件
    │   ├── CMakeLists.txt                    //编译脚本
    │   ├── main.cpp                          //主函数,图片分类功能的实现文件
    │   ├── model_process.cpp                 //模型处理相关函数的实现文件
    │   ├── sample_process.cpp                //资源初始化/销毁相关函数的实现文件
    │   ├── utils.cpp                         //公共函数(例如:文件读取函数)的实现文件
    ├── test_data
    │   ├── test_data_1x3x224x224_1.bin       //输入样本数据1
    │   ├── test_data_1x3x224x224_2.bin       //输入样本数据2
    ├── out
    │   ├── main                              //编译生成的可执行文件
    │   ├── result                            //输出结果目录

输出结果目录acl_resnet50_sample/out/result需先创建好再执行推理操作。

导出AIR模型文件

在Ascend 910的机器上训练好目标网络,并保存为CheckPoint文件,通过网络和CheckPoint文件导出对应的AIR格式模型文件,导出流程参见导出AIR格式文件

这里提供使用ResNet-50模型导出的示例AIR文件resnet50_export.air

将AIR模型文件转成OM模型

登录Atlas 200 DK开发者板环境,创建model目录放置AIR文件resnet50_export.air,例如/home/HwHiAiUser/Ascend/ascend-toolkit/20.0.RC1/acllib_linux.arm64/sample/acl_execute_model/acl_resnet50_sample/model,并进入该路径下,设置如下环境变量。其中,install_path需指定为实际安装路径。

export install_path=/home/HwHiAiUser/Ascend/ascend-toolkit/20.0.RC1
export PATH=/usr/local/python3.7.5/bin:${install_path}/atc/ccec_compiler/bin:${install_path}/atc/bin:$PATH
export PYTHONPATH=${install_path}/atc/python/site-packages/te:${install_path}/atc/python/site-packages/topi:$PYTHONPATH
export LD_LIBRARY_PATH=${install_path}/atc/lib64:$LD_LIBRARY_PATH
export ASCEND_OPP_PATH=${install_path}/opp

resnet50_export.air为例,执行如下命令进行模型转换,在当前目录生成resnet50_export.om文件。

/home/HwHiAiUser/Ascend/ascend-toolkit/20.0.RC1/atc/bin/atc --framework=1 --model=./resnet50_export.air --output=./resnet50_export --input_format=NCHW --soc_version=Ascend310

其中:

  • --model:原始模型文件的路径。

  • --output:转换得到的OM模型文件的路径。

  • --input_format:输入数据格式。

ATC工具详细资料可在昇腾社区开发者文档中选择相应CANN版本后,查找《ATC工具使用指南》章节查看。

编译推理代码

进入工程目录acl_resnet50_sample,设置如下环境变量:

export DDK_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/20.0.RC1
export NPU_HOST_LIB=/home/HwHiAiUser/Ascend/ascend-toolkit/20.0.RC1/acllib_linux.arm64/lib64/stub/

CMakeLists.txt文件中acllib包的include的目录需要指定正确,否则会报acl/acl.h找不到的错误。CMakeLists.txt文件中指定include目录的代码位置如下,如果与实际安装目录不符,需要修改。

...
#Header path

 include_directories(

  ${INC_PATH}/acllib_linux.arm64/include/

  ../

 )
...

执行如下命令创建编译目录:

mkdir -p build/intermediates/minirc

然后切换至编译目录:

cd build/intermediates/minirc

执行cmake命令:

cmake ../../../src -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++ -DCMAKE_SKIP_RPATH=TRUE

再执行make命令编译即可。

make

编译完成后,在acl_resnet50_sample/out下会生成可执行main文件。

执行推理并查看结果

将生成的OM模型文件resnet50_export.om拷贝到acl_resnet50_sample/out目录下(和可执行main文件同路径),并确认acl_resnet50_sample/test_data目录中已经准备好输入数据样本,就可以执行推理了。

值得注意的是,需要设置如下环境变量,否则会导致推理不成功。

export LD_LIBRARY_PATH=/home/HwHiAiUser/Ascend/acllib/lib64/

进入到acl_resnet50_sample/out目录下,如果当前目录下result目录不存在,需要执行mkdir result命令创建该目录,然后执行如下命令进行推理。

./main  ./resnet50_export.om  ../test_data

执行成功后,可以看到推理结果如下,打印了top5的概率标签,并且输出结果会以.bin文件的格式保存在acl_resnet50_sample/out/result目录中。

[INFO]  acl init success
[INFO]  open device 0 success
[INFO]  create context success
[INFO]  create stream success
[INFO]  get run mode success
[INFO]  load model ./resnet50_export.om success
[INFO]  create model description success
[INFO]  create model output success
[INFO]  start to process file:../test_data/test_data_1x3x224x224_1.bin
[INFO]  model execute success
[INFO]  top 1: index[2] value[0.941406]
[INFO]  top 2: index[3] value[0.291992]
[INFO]  top 3: index[1] value[0.067139]
[INFO]  top 4: index[0] value[0.013519]
[INFO]  top 5: index[4] value[-0.226685]
[INFO]  output data success
[INFO]  dump data success
[INFO]  start to process file:../test_data/test_data_1x3x224x224_2.bin
[INFO]  model execute success
[INFO]  top 1: index[2] value[0.946289]
[INFO]  top 2: index[3] value[0.296143]
[INFO]  top 3: index[1] value[0.072083]
[INFO]  top 4: index[0] value[0.014549]
[INFO]  top 5: index[4] value[-0.225098]
[INFO]  output data success
[INFO]  dump data success
[INFO]  unload model success, modelId is 1
[INFO]  execute sample success
[INFO]  end to destroy stream
[INFO]  end to destroy context
[INFO]  end to reset device is 0
[INFO]  end to finalize acl