【2024第一期CANN训练营】从图片分类入门推理应用开发
收藏回复举报
【2024第一期CANN训练营】从图片分类入门推理应用开发
发表于2024-06-03 10:38:50
0 查看

从图片分类入门推理应用开发

简介:介绍推理应用开发语言AscendCL、应用开发基本概念&基本流程,并基于开发板演示如何运行图片分类应用样例。

目标:了解推理应用开发的基本流程,可自行运行已有的推理样例。

1. CANN基础知识

1.1. CANN架构(Compute Architecture for Neural Networks

CANNCompute Architecture for Neural Networks)是华为针对AI场景推出的异构计算架构,对上支持多种AI框架,对下服务AI处理器与编程,发挥承上启下的关键作用,是提升昇腾AI处理器计算效率的关键平台。同时针对多样化应用场景,提供高效易用的编程接口,支持用户快速构建基于昇腾平台的AI应用和业务。

CANN的架构分为很多层,自上而下分别是:昇腾计算语言、昇腾计算服务层、昇腭计箅编译层、昇腾计算执行层、昇腭计算基础层。

1.2. AscendCL昇腾计算语言开发接口

AscendCL(Ascend Computing Language)是一套用于在昇腾平台上开发深度神经网络推理应用的C语言API库。可以用于应用开发、模型开发、算子开发。

1.2.1. AscendCL的主要功能

  1. C/Python语言API
  2. 利用昇腾硬件计算资源的入口之一
  3. 提供深度学习推理计算、图像预处理、单算子加速计算等能力

1.2.2. AscendCL的应用场景

  1. 开发应用
  2. 供第三方框架调用
  3. 供第三方开发lib

1.2.3. AscendCL的优势

  1. 高度抽象
  2. 向后兼容
  3. 零感知芯片

2. 离线推理应用开发流程

cke_12416.png

2.1. 图片分类入门推理应用开发-模型转换

使用ATC工具完成离线模型转换,将开源框架的网络模型(如onnxpbcaffe等)转换为昇腾AI处理器支持的离线模型。

cke_19101.png

模型转换说明:开源框架网络模型经过Parser解析后,转换为中间态IR Graph。中间态IR经过图准备,图拆分,图优化,图译等一系列操作后,转成适配昇腾AI处理器的离线模型。用户可通过AscendCL接口加载模型文件实现推理,

使用AscendCL接口进行应用开发时,都需要先将训练好的模型转换为昇腾AI处理器能识别的*.om模型文件。图片分类入门推理应用开发离线模型转换,模型准备步骤具体如下:

2.1.1. 下载原始模型

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003 Atc Models/resnet50/resnet50.onnx

2.1.2. 执行模型转换命令

atc --model=resnet50.onnx --framework=5 --output=resnet50 --input shape="actual input 1:1 3,224,224"soc version=AscendXXX

2.1.3. 参数说明

--model:ResNet-50网络的模型文件路径,

--framework:原始框架类型。5表示ONNX

--output:resnet50.om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。

--soc version:昇腾AI处理器的版本。使用npu-smi info命令查询处理器版本,请根据实际情况选择。

2.2. 图片分类入门推理应用开发-代码开发

使用AscendCL接口完成代码开发,按照推理应用开发流程完成代码开发。

AscendCL的应用高度抽象后,可以得到以下流程:

2.2.1. AscendCL初始化:

使用AscendCL接口开发应用时,必须先初始化

AscendCl,否则可能会导致后续系统内部资源初始化出错,进而导致其它业务异常,调用aclInit接口实现初始化AscendCL

2.2.2. 运行管理资源申请:

应用程序中必须包含运行管理资源申请的代码逻辑,需要按顺序依次申请如下运行管理资源:DeviceContextStream,确保可以使用这些资源执行运算、管理任务。

2.2.3. 运行管理资源释放:

所有数据处理都结束后,需要依次释放运行管理资源:StreamContextDevice

2.2.4. AscendCL去初始化:

有初始化就有去初始化,在确定完成了AscendCL的所有调用(包括运行管理资源释放完成)之后,或者进程退出之前,需调用AscendCL接口实现AscendCL去初始化,调用aclFinalize接口实现AscendCL去初始化。

// 调用acl接口需要

使用acl.h头文件

#include "acl/acl.h"

uint32 t deviceld = 0;

aclrtContext context;

aclrtStream stream;

const char *aclConfigPath ="./src/acl.json";

aclError ret = aclnit(aclConfigPath);

ret = aclrtSetDevice(deviceld);

ret = aclrtCreateContext(&context, deviceld);

ret = aclrtCreateStream(&stream);

// 业务执行

ret = aclrtDestroyStream(stream);

ret = aclrtDestroyContext(context);

ret = aclrtResetDevice(deviceld);

ret = aclFinalize();

2.3. 图片分类入门推理应用开发-编译执行

在运行环境上将应用落地,执行应用,获取推理结果。

具备数据、离线模型、源码和CMake文件后,就可以进行代码的编译与运行了。

1.编译应用之前需要先设置环境变量,配置程序编译依赖的头文件与库文件路径:

export DDK PATH=$HOME/Ascend/ascend-toolkit/latest

export NPU HOST LIB=$DDK PATH/runtime/lib64/stub

2.切换到用于存放编译文件的目录如“build/intermediates/host",执行cmake生成编译文件:

cd build/intermediates/host

cmake ../.././src -DCMAKE CXX COMPILER=g++ -DCMAKE SKIP RPATH=TRUE

3.执行make命令,生成可执行文件main:

4.切换到可执行文件main所在的目录,运行可执行文件:

我要发帖子