目录
前言
昇腾AI模型应用,解释这个词汇就是,别人现在训练好了一个模型,我们利用这个模型对原始数据进行识别、预测。例如别人训练好了识别动物种类的模型,我们将一张图片传入进入,这个模型就能给我们传出图片的属于狗、猫还是兔子
一、ATC模型转换
第一章是讲理论的,看的浑身难受的小伙伴可以先从第二章开始看
1.1 模型
首先经过TensorFlow、Pytrouch训练之后会得到一个模型,这个模型类似于一个函数,有输出和输入。
我们输入图片,动物分类模型(函数)会输出一个动物类别给我们,我们通过这个动物类别就能找到图片是属于哪一个动物
我们可以下载一个.onnx后缀的模型文件,进入网站中查看:
模型要求输入一个下面这样格式的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
报错和解决方法:
问题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
路径不存在,然后需要修改程序中的文件名
这边报错,暂时先不排查原因了(这两天看的头晕,后面有机会再排查一下)