OrangePi AIpro学习4 —— 昇腾AI模型推理 C++版

目录

一、ATC模型转换

1.1 模型

1.2 ATC工具

1.3 实操模型转换

1.4 使用ATC工具时的一些关键注意事项

1.5 ATC模型转换命令举例

二、运行昇腾AI模型应用样仓程序

2.1 程序目录

2.2 下载模型和模型转换

2.3 下载图片和编译程序

2.4 解决报错

2.5 运行程序

三、运行其他程序

3.1 sampleCarColor

3.2 sampleCrowdCounting

3.3 sampleLlama

3.4 sampleResnetAIPP

3.5 sampleResnetDVPP

3.6 sampleResnetRtsp

3.7 sampleYOLOV7MultiInput

3.8 sampleYOLOV7NMSONNX


前言

昇腾AI模型应用,解释这个词汇就是,别人现在训练好了一个模型,我们利用这个模型对原始数据进行识别、预测。例如别人训练好了识别动物种类的模型,我们将一张图片传入进入,这个模型就能给我们传出图片的属于狗、猫还是兔子

一、ATC模型转换

第一章是讲理论的,看的浑身难受的小伙伴可以先从第二章开始看

1.1 模型

首先经过TensorFlow、Pytrouch训练之后会得到一个模型,这个模型类似于一个函数,有输出和输入。

我们输入图片,动物分类模型(函数)会输出一个动物类别给我们,我们通过这个动物类别就能找到图片是属于哪一个动物

我们可以下载一个.onnx后缀的模型文件,进入网站中查看:

Netron

模型要求输入一个下面这样格式的Tenser(矩阵)。下面0011位置或其他位置里面的数据就是该位置图片像素值,模型要求这个像素值的类型是float32类型的数据

模型跟函数不同的是,模型的输入输出都是矩阵,方便NPU运算。下面是模型输出的Tenser(矩阵):

1.2 ATC工具

ATC工具用于将Caffe、TensorFlow、ONNX、MindSpore深度学习框架训练出来的模型转换为昇腾生态能看懂的模型格式

(1) Caffe生成 .om需要两个模型文件:.prototxt (Caffe网络模型的网络结构)、.caffemodel (Caffe网络模型的权重文件);

(2) TensorFlow生成 .om需要模型文件 .pb (包含计算图和权重),如果是 .index和 .meta两个文件,则需要使用TensorFlow的私有api来把这两个文件合并成 .pb。

(3) ONNX代表的是pytorch生成的模型。pytorch能训练出 .pth和 .tar,pytorch可以用 .pth和 .tar来生成 .onnx,这是ATC需要的格式

(4) 华为自家的MindSpore框架训练出来的模型是 .air后缀的文件,另一种训练出来的格式后缀为 .mindir,.air可以转成 .om做离线推理 .mindir只能使用MindSpore做在线推理

1.3 实操模型转换

1. 软件安装

MindStudio下载:

MindStudio全流程开发工具链-特性-课程-案例-昇腾社区 (hiascend.com)

解压 

启动

进入界面:

进入界面后,远程工具好像是有点不堪重负,于是换成使用下面的工具进行远程:

【远程桌面】nomachine下载安装使用教程、zerotier下载安装使用教程超详细-CSDN博客

但是我发现两个工具都很差劲,有能接屏幕的小伙伴可以接一下屏幕看一下,或者在自己的电脑上安装这个软件,模型转换完成后上传到虚拟机中

这里学习的部分可以去看老师的视频了:

昇腾CANN系列教程——ATC模型转换_哔哩哔哩_bilibili

2. 这是我做的笔记:

打开软件后点击下面的选项

弹出了下面的小窗口,这个小窗口就可以配置模型转换的各种参数。首先是模型文件.prototxt和.caffemodel,模型文件可以去这里下载:ResNet-50 prototxt_resnet50 prototxt-CSDN博客

模型名就是模型文件去除后缀名后的名字。香橙派昇腾芯片的SoC Version是Ascend310B4。下面的三个输入格式是根据模型要求的输入来配置的,具体怎么看模型要求输入格式,我后面模型训练的课程会再介绍

点击下一步后。下图是高级配置,如果点击了,后续会在模型上就把数据预处理做了

 下图是软件根据你前面的配置,生成出来的执行语句,这个语句会再Linux中执行,实现模型转换

点击Finish开始执行,程序开始运行,得到下面结果: 

经过上面这么一通操作,在/home/ascend/modelzoo/resnet50/Ascend310目录下生成了一个resnet50.om的模型文件,这个就是昇腾生态需要的模型文件

1.4 使用ATC工具时的一些关键注意事项

 ● 支持原始框架类型为Caffe、TensorFlow、MindSpere、QNNX的模型转换;

(1) 当原始框架类型为Caffe、MindSpore、ONNX时,输入数据类型为FP32 (单精度浮点)、FP16 (半精度浮点) (通过设置入参 —— input_fp16_nodes实现,MindSpore框架不支持该参数)、UINT8 (通过配置数据预处理实现);

(2) 当原始框架类型为TensorFlow时,输入数据类型为FP16、FP32、 UINT8、 INT32、BOOL (原始框架类型为TensorFlow时,不支持输入输出数据类型为INT64,需要用户自行将INT64的数据类型修改为INT32类型)。

● 当原始框架类型为Caffe时,模型文件 (.prototxt) 和权重文件 (.caffemodel) 的op name、op type必须保持名称一致 (包括大小写)。

● 当原始框架类型为TensorFlow时,只支持FrozenGraphDef格式。

● 不支持动态shape的输入,例如:NHWC输入为[?,?,?,3]多个维度可任意指定数值。模型转换时需指定固定数值

● 对于Caffe框架网络模型:输入数据最大支持四维,转维算子 (reshape、expanddim等) 不能输出五维。

● 模型中的所有层算子除const (常量) 算子外,输入和输出需要满足dim!=0 (维度!=0)。

● 只支持算子规格参考中的算子,并需满足算子限制条件。

1.5 ATC模型转换命令举例

--model

原始网络模型、网络结构

--weiget

权重文件位置

--output

模型转换完成之后,输出到哪里去

--soc_version

模型转换完成之后,是要跑在那一种型号处理器上

--input_shape

指定输入形状,输入节点的名字:输入的形状

--framework

原始网络模型框架类型,0表示Caffe框架

上面四个模型转换过程最大的不同的地方是下图红色的部分:

二、运行昇腾AI模型应用样仓程序

2.1 程序目录

inference/modelInference · Ascend/samples - 码云 - 开源中国 (gitee.com)

下面是以运行sampleResnetQuickStart程序为例子,讲解一下使用样仓程序的流程

2.2 下载模型和模型转换

cd $HOME/samples/inference/modelInference/sampleResnetQuickStart/cpp/model 

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

atc --model=resnet50.onnx --framework=5 --output=resnet50 --input_shape="actual_input_1:1,3,224,224"  --soc_version=Ascend310B4

注意:第三步获取到的昇腾芯片型号,要应用在第四步模型转换过程中的--soc_version=Ascend310B4,这个参数中,一定要修改,否则后面推理的时候会出错

2.3 下载图片和编译程序

cd $HOME/samples/inference/modelInference/sampleResnetQuickStart/cpp/data 

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg

cd $HOME/samples/inference/modelInference/sampleResnetQuickStart/cpp/scripts 

bash sample_build.sh

2.4 解决报错

报错内容1:报错找不到opencv2

解决报错:把opencv2拷贝到系统目录下:

mv /usr/include/opencv4/opencv2 /usr/include/opencv2

rm -rf opencv4

报错内容2:找不到ascendcl动态库

解决报错:把ascendcl动态库添加到cmake查找路径中

env发现无输出,使用find查找动态库的位置

然后根据cmake编写的内容修改cmake中的路径,CMAKE中,如果没有定义环境变量就用我们填入的内容,很显然没有定义,所以使用我们刚刚填写的地址

2.5 运行程序

bash sample_run.sh

这个程序成功的给狗狗分类了

三、运行其他程序

运行其他程序和sampleResnetQuickStart类似,下面只说不同的点

3.1 sampleCarColor

问题1

报错和解决方法:

error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope_‘cvloadimage’ was not declared in this scope-CSDN博客

问题2:又提示下面这个错误了:

这次编辑一下启动配置文件:vim ~/.bashrc 

source ~/.bashrc

问题3:程序运行没有结果,经过检查是例程是错的,我正在尝试修改

3.2 sampleCrowdCounting

这个程序的库函数有问题,修改库函数jpegd的这里,如果是Ascend310B4芯片,就让它宽度按照64字节对齐

同时修改resize函数中使用到的_gen_input_pic_desc函数,如下图

3.3 sampleLlama

1. 安装transformers

下载transformers-4.29.2包

wget https://codeload.github.com/huggingface/transformers/zip/refs/tags/v4.29.2

unzip v4.29.2

pip3 install SentencePiece -i https://mirrors.163.com/pypi/simple/

pip install transformers -i https://mirrors.163.com/pypi/simple/

2. 下载数据和模型

cd $HOME/samples/inference/modelInference/sampleLlama

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/llama_weight/llama_weight.zip --no-check-certificate

unzip llama_weight.zip

mkdir data & cd data

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/llama_weight/data.zip --no-check-certificate

unzip data.zip

3. 运行程序

cd $HOME/samples/inference/modelInference/sampleLlama/scripts

export ASCEND_CUSTOM_PATH=/usr/local/Ascend/ascend-toolkit/latest

bash run_llama.sh

4. 这个程序是运行不起来的,原因如下

首先要解决内存不够的问题,整个程序要把模型权重全部读入内存。香橙派最高只有16G版本的,所以16G需要增加4GB swap内存,8G需要增加12GB swap内存,才能把所有权重文件读入内存

其次本程序会调用一个aclnnPromptFlashAttentionV2函数,310B4并不支持这个函数。如何函数上面写了

最后要说明的是,如果要在支持的设备上运行这个程序,除了toolkit工具外,还要安装kernels算子包

3.4 sampleResnetAIPP

● 注意不要使用下面两句话添加环境变量,因为我们前面已经设置好了

export DDK_PATH=$HOME/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=$DDK_PATH/runtime/lib64/stub

● 报错添加头文件#include <opencv2/imgproc/types_c.h>

python版本代码需要修改一下.sh里面的命令

3.5 sampleResnetDVPP

运行下面python程序的时候提示缺少acllite_imageproc这个包

经过查找,发现acl封装的库函数是在/root/samples/python/common/acllite目录下,将这个目录配置到环境变量中:vim ~/.bashrc

然后保存一下:source ~/.bashrc

3.6 sampleResnetRtsp

1.给程序提供视频流

cd /

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/sampleResnetRtsp/live.2023.05.10.tar.gz --no-check-certificate

tar -zxvf live.2023.05.10.tar.gz

cd ./live

./genMakefiles linux

make -j8

cd /live/testProgs

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/sampleResnetRtsp/test.264 --no-check-certificate

./testOnDemandRTSPServer

让程序能从下面的地址获取视频一帧一帧的内容:

上面的程序视频流一直开着,我们用vscode进入程序执行

3.7 sampleYOLOV7MultiInput

需要安装json解析库:apt install libx11-dev

3.8 sampleYOLOV7NMSONNX

路径不存在,然后需要修改程序中的文件名

这边报错,暂时先不排查原因了(这两天看的头晕,后面有机会再排查一下)

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

herb.dr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值