目录
一、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字节对齐
同时修改函数jpegd下面return出去的图片宽高
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
pip3 install -e transformers-4.29.2
后续两个命令我都执行不了了,我不太会装这个transformers,有知道怎么装的兄弟可以在评论区说一声
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
因为前面transformers没有安装程序,最后程序一定是会报错的,这一块先跳过,我研究一下再修改
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
路径不存在,然后需要修改程序中的文件名
这边报错,暂时先不排查原因了(这两天看的头晕,后面有机会再排查一下)