AI推理卡/ModelArts

##我的需求:x86上Nvidia显卡训练好的模型用在AI推理卡上,host端运行C++主程序device端的AI推理卡提供NN算力,进行推理##

华为AI 推理卡

环境配置

安装ubuntu系统、AI推理卡环境

1,安装ubuntu20.04.4  Ubuntu Releases 过程忽略,网上教程很多。

2,ubuntu20.04.4设置root登录,参考 Ubuntu系统设置默认用户为root并自动登录(详解)_偷心的小白的博客-CSDN博客_ubuntu默认root登录

3,ubuntu20.04.4网络配置

发现可以连接内网,但连接不了外网。通过ifconfig 先查到我的网卡名称,我的是enp6s0。看大家说要编辑/etc/systemd/resolved.conf 文件,增加 DNS=114.114.114.114 以及 DNS=8.8.8.8然而并无作用。我的做法是 修改/etc/netplan/ 下面的 .yaml文件,下图是原本的样子:

 通过上面的命令可以看到这台电脑的内网IP是10.10.XXXXX9/24,于是我将yaml文件修改为下面的样子,即addresses改成这台机器的内网IP,网关大家可以通过 route 命令查看,然后填在下方即可:

 改完 netplan apply 一下,不放心再重启一次即可看到 ping 内网以及外网均OK了。

4,设置远程(这步可以不做,我是想通过远程操作这台主机,因为声音太吵了)

以前的电脑用16.04的设置是win10 远程桌面ubuntu16 现在是20.04所以我按照Ubuntu20.04桌面共享-爱码网 ubuntu20.10设置桌面共享的三种方式_xingyu97的博客-CSDN博客_ubuntu桌面共享 这些流程操作发现sharing--Screen Sharing的使能按钮打不开,无法打到On状态:

究其原因是蓝色处的网络没正确自动显示,导致使用VNC Viewer连接时显示“The connection was refused by the computer”。查了下按照大家说的将下面设置为自动:

然后并不起作用。后面找了很久xorg - Ubuntu 18.04.1 LTS Can't Enable Screen Sharing - Ask Ubuntu 终于找到这个解决办法:

cd /etc/NetworkManager
save NetworkManager.conf to NetworkManager.orig (as a backup)
sudo vi NetworkManager.conf
Change managed=false to managed=true

sudo service network-manager restart
cd /etc/netplan
sudo vi xxxxxxxxxx.yaml

Change renderer under networt from networkd to NetworkManager like below:

renderer: NetworkManager

save
sudo netplan apply
I had then to restart the computer for this to be effective.Then you can go to Settings » Sharing » Screen Sharing and set it to On

 可以看到现在已经可以正常开启。重启后,开机时会出现下图红色的部分failed,不用在意。通过VNC Viewer连接大家可以看到已经连接上了这台主机:

如果要ssh远程,则apt-get install openssh-server 然后将/etc/ssh下的sshd_config文件PermitRootLogin 改成yes

5,python安装

网上教程很多,如下python2和python3都安装了:

6,固件与驱动 的安装大家根据官方文档《NPU驱动和固件安装指南》进行即可,参考网址华为 Atlas 300I Pro 配置手册、产品文档、PDF - 华为即可,大家可以直接将技术文档都下载下来。安装完毕后大家可以 npu-smi info -t board -i NPU ID 命令查询是可以看到的:

由图可知我安装的驱动是22.0.2.3,固件是1.82.22.5.220,处理器是310P3即710芯片。我的这张卡不支持windows。另外后续会说的deviceid就是指的芯片,不是指的服务器也不是指推理卡而是指推理卡中的芯片。看我的deviceid知道我就一个芯片。这些信息除了在终端查看,按这个介绍 调用示例 - Atlas 300I Pro 推理卡 6.0.RC1 DSMI API参考 01 - 华为 还可以如下查看,一定记得加上/usr/local/Ascend/driver/lib64/stub 路径下的 drvdsmi_host 库哦:

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <unistd.h>
#include "dsmi_common_interface.h"

int main()//(int argc, char *argv[])
{
	int ret=0;

    unsigned int phealth = 0;
	ret = dsmi_get_device_health(0, &phealth);
	if (ret)
	{
		printf("call dsmi_get_device_health fail, ret = %d \n", ret);
		return -1;
	}
	else
	{
		/*phealth type is unsigned int, printf value should use %u*/
		printf("check device health ,phealth:%u ; ", phealth);
	}

	int devicenum=0;
	ret=dsmi_get_device_count(&devicenum);
	if(ret)
	{
				printf("call dsmi_get_device_count fail, ret = %d \n", ret);
				return -1;
	}
	else
	{
				printf("devicenum:%d ; ", devicenum);
	}
	printf("\n\n AI core freq info :\n");

	int deviceid=devicenum-1;

	struct dsmi_aicore_info_stru pdevice_aicore_info = {0};
	ret = dsmi_get_aicore_info(deviceid, &pdevice_aicore_info);
	if (ret)
	{
			printf("call dsmi_get_aicore_info fail, ret = %d \n", ret);
			return -1;
	}
	else
	{
			printf("standard freq:%u MHz; current freq:%u MHz\n\n", pdevice_aicore_info.freq,pdevice_aicore_info.curfreq);
	}

	int tempera=0;
	ret = dsmi_get_device_temperature(0, &tempera);
	if (ret)
	{
			printf("call dsmi_get_device_temperature fail, ret = %d \n", ret);
			return -1;
	}
	else
	{
			printf("device temperature:%d \n", tempera);
	}


    return 0;
}

7,华为CANN软件包

参考步骤5中给出的链接文档《CANN软件安装指南》安装完毕(我安装的是 昇腾社区-官网丨昇腾万里 让智能无所不及这个版本),如下所示:

所以对于我的需求而言,不用另外安装其他CANN相关的软件包。这个set_env.sh里是配置环境变量,所以一定要运行生效哦。不过我的这个版本里面没有配置ATC:

所以要增加ATC的环境变量如下所示:不好意思,这里我少打了一个冒号 ,nnengine后面,大家记得加上)使其生效,即将source /home/.../set_env.sh 添加到Home/.bashrc的最后一行,再source一下即可。然后在终端输入 atc 就会显示:ATC start working now,please wait for a moment 证明环境生效。

后面我还是决定root重装到标准路径/usr/local下,所以我重新按照这个昇腾社区-官网丨昇腾万里 让智能无所不及装了ascend_cann_toolkit 和nnrt对应版本,流程参考昇腾社区-官网丨昇腾万里 让智能无所不及 这个即可。安装完毕分别会有:

然后atc的环境变量像我上面所述一样修改生效,直到终端输出为下面这样即可:

然后输入 npu-smi info 再检查一下输出是否像我开头那样就表示安装正确,如果npu-smi info显示有问题,则是驱动问题,驱动应该卸载掉重装。但固件不用重装,因为固件可以支持很多版本。

8,安装opencv

安装opencv依赖库(可选,也可以先不装)

9,安装tensorflow (可选,也可以先不装)

我是装的2.5.0如果后面跑离线模型推理实例需要tf1的时候,大家就在报错的 .py脚本中自己转化一下:将import tensorflow as tf改成:

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()

 离线模型inceptionv4推理

使用的是华为提供的模型,参考网址昇腾社区-官网丨昇腾万里 让智能无所不及 或者按照昇腾社区-官网丨昇腾万里 让智能无所不及 按照这个步骤进行,模型的数据集需要我们自己下载,大家可以在ImageNet Object Localization Challenge | Kaggle kaggle上下载相关的数据集。这个网站要注册,我就直接在 百度网盘 请输入提取码  提取码:ux59  这里下载的Imagenet2012 Jpeg格式数据集ILSVRC2012_img_val和Label文件ILSVRC2012_devkit_t12。下完数据集与标签后,看到 ATC ShuffleNetv1(FP16) :昇腾社区-官网丨昇腾万里 让智能无所不及和  ATC Inceptionv4(FP16)(这个例子最简单,只要python下import numpy成功,就可以运行这个例子,所以建议从这个例子开始吧):昇腾社区-官网丨昇腾万里 让智能无所不及 这两个模型推理都是用的Imagenet2012这个数据集。按照刚刚给的模型链接下的步骤操作后,报拼写错误如下所示:

终于知道原因了,原来刚刚官网下载的模型解压后有空格,所以另外保证总路径没有空格即可:

 可以看到模型转换成功了。但下一步build.sh失败,哪怕我将include路径也添加到环境变量中:所以干脆在cmake文件中将绝对路径加进去:

终于build.sh成功。但最后一步推理时还是有问题,我懒得改了。直接按标准路径重装,如上面第7步骤所说重新装cann-toolkit和nnrt以及驱动,然后重新去官网下载、运行这个例子,什么都不用修改,发现这次什么错都没有,直接完全按照链接中的步骤来,一路顺风。

这表示这个模型离线推理完毕。终于成功,诀窍就是环境一定要安装正确。

root@adlink:/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts# bash benchmark_tf.sh --batchSize=1 --modelType=inceptionv4 --imgType=raw --precision=fp16 --outputType=fp32 --useDvpp=1 --deviceId=0 --modelPath=/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/inception_v4_tf_aipp.om --dataPath=/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs --trueValuePath=/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_lable.txt
======================infer test========================
./benchmark --dataDir /home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs --om /home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/inception_v4_tf_aipp.om --batchSize 1 --modelType inceptionv4 --imgType raw --deviceId 0 --loopNum 1 --useDvpp 1
[INFO]dataDir = /home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs
[INFO]om = /home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/inception_v4_tf_aipp.om
[INFO]batchSize = 1
[INFO]modelType = inceptionv4
[INFO]imgType = raw
[INFO]deviceId = 0
[INFO]loopNum = 1
[INFO]useDvpp = 1
parase params start
dataDir /home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs 
output dir ../../results not exists, try to make dir.
outDir ../../results 
batchSize 1 
modelType inceptionv4 
imgType raw 
useDvpp is 1 
parase params done
context init start
context init done
load model start
binFileBufferData:0x7fcbbaa96010
Load model success. memSize: 6502400, weightSize: 87928832.
load model done
model input num 1
model input[0] size 138624
model input[0] dimCount 4
model input[0] dim[0] info 1
model input[0] dim[1] info 304
model input[0] dim[2] info 304
model input[0] dim[3] info 3
model input[0] format 1 inputType 4
model input[0] name input
model input name input is belone to input 0
model output num 1
model output[0] size 4000
model output[0] dimCount 2
model output[0] dim[0] info 1
model output[0] dim[1] info 1000
model output[0] format 1 outputType 0
model output[0] name InceptionV4/Logits/Logits/BiasAdd:0
model output name InceptionV4/Logits/Logits/BiasAdd:0 is belone to output 0
***********fileNum:10
resizedWidth 304 resizedHeight 304 resizedWidthAligned 304 resizedHeightAligned 304 resizedOutputBufferSize 138624
loopCnt 0, loopNum 1
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000001.JPEG] jpeg picDesc info: W=500, H=375, W_Aligned=512, H_Aligned=384, outBufSize=589824, format=6
w_new=500, h_new=375, format=6
CentralCrop newInputWidth=500 newInputHeight=375 modelInputWidth=447 modelInputHeight=335 
the format is 1
inference batch 1 start
ILSVRC2012_val_00000001.JPEG inference time use: 1581 us
inference batch 1 done
save batch 1 start
save batch 1 done
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000005.JPEG] jpeg picDesc info: W=500, H=333, W_Aligned=512, H_Aligned=336, outBufSize=516096, format=6
w_new=500, h_new=333, format=6
CentralCrop newInputWidth=500 newInputHeight=333 modelInputWidth=447 modelInputHeight=298 
the format is 1
inference batch 2 start
ILSVRC2012_val_00000005.JPEG inference time use: 1541 us
inference batch 2 done
save batch 2 start
save batch 2 done
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000006.JPEG] jpeg picDesc info: W=500, H=368, W_Aligned=512, H_Aligned=368, outBufSize=565248, format=6
w_new=500, h_new=368, format=6
CentralCrop newInputWidth=500 newInputHeight=368 modelInputWidth=447 modelInputHeight=329 
the format is 1
inference batch 3 start
ILSVRC2012_val_00000006.JPEG inference time use: 1607 us
inference batch 3 done
save batch 3 start
save batch 3 done
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000007.JPEG] jpeg picDesc info: W=500, H=334, W_Aligned=512, H_Aligned=336, outBufSize=516096, format=6
w_new=500, h_new=334, format=6
CentralCrop newInputWidth=500 newInputHeight=334 modelInputWidth=447 modelInputHeight=298 
the format is 1
inference batch 4 start
ILSVRC2012_val_00000007.JPEG inference time use: 1659 us
inference batch 4 done
save batch 4 start
save batch 4 done
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000008.JPEG] jpeg picDesc info: W=500, H=375, W_Aligned=512, H_Aligned=384, outBufSize=589824, format=6
w_new=500, h_new=375, format=6
CentralCrop newInputWidth=500 newInputHeight=375 modelInputWidth=447 modelInputHeight=335 
the format is 1
inference batch 5 start
ILSVRC2012_val_00000008.JPEG inference time use: 1564 us
inference batch 5 done
save batch 5 start
save batch 5 done
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000009.JPEG] jpeg picDesc info: W=375, H=500, W_Aligned=384, H_Aligned=512, outBufSize=589824, format=6
w_new=375, h_new=500, format=6
CentralCrop newInputWidth=375 newInputHeight=500 modelInputWidth=335 modelInputHeight=447 
the format is 1
inference batch 6 start
ILSVRC2012_val_00000009.JPEG inference time use: 1540 us
inference batch 6 done
save batch 6 start
save batch 6 done
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000010.JPEG] jpeg picDesc info: W=500, H=375, W_Aligned=512, H_Aligned=384, outBufSize=589824, format=6
w_new=500, h_new=375, format=6
CentralCrop newInputWidth=500 newInputHeight=375 modelInputWidth=447 modelInputHeight=335 
the format is 1
inference batch 7 start
ILSVRC2012_val_00000010.JPEG inference time use: 1527 us
inference batch 7 done
save batch 7 start
save batch 7 done
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000011.JPEG] jpeg picDesc info: W=500, H=400, W_Aligned=512, H_Aligned=400, outBufSize=614400, format=6
w_new=500, h_new=400, format=6
CentralCrop newInputWidth=500 newInputHeight=400 modelInputWidth=447 modelInputHeight=358 
the format is 1
inference batch 8 start
ILSVRC2012_val_00000011.JPEG inference time use: 1591 us
inference batch 8 done
save batch 8 start
save batch 8 done
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000016.JPEG] jpeg picDesc info: W=500, H=333, W_Aligned=512, H_Aligned=336, outBufSize=516096, format=6
w_new=500, h_new=333, format=6
CentralCrop newInputWidth=500 newInputHeight=333 modelInputWidth=447 modelInputHeight=298 
the format is 1
inference batch 9 start
ILSVRC2012_val_00000016.JPEG inference time use: 1611 us
inference batch 9 done
save batch 9 start
save batch 9 done
DvppInitInput dvpp malloc dst size:138624
the format is 6
file[/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/val_imgs/ILSVRC2012_val_00000017.JPEG] jpeg picDesc info: W=500, H=375, W_Aligned=512, H_Aligned=384, outBufSize=589824, format=6
w_new=500, h_new=375, format=6
CentralCrop newInputWidth=500 newInputHeight=375 modelInputWidth=447 modelInputHeight=335 
the format is 1
inference batch 10 start
ILSVRC2012_val_00000017.JPEG inference time use: 1562 us
inference batch 10 done
save batch 10 start
save batch 10 done
unload model start
unload model done
destory context done
reset device done


DVPP performance details:
#############################################
DvppTotalProcess using avg time 3.24 ms

performance summary:
#############################################
total 10 imgs processed and batch size 1
avg preprocess time 3.25 ms, 307.84 imgs/s
avg inference time 1.58 ms, 633.59 imgs/s
======================collect results===================
param: /home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts/../results/inceptionv4/,fp32

InferencePerformance: 1.58 ms/batch, 633.59 images/sec
top1: , top5:
======================end===============================
root@adlink:/home/jumper/samples/ATC_Inceptionv4_FP16_tf_Ascend310/Inceptionv4_for_TensorFlow/scripts# 

大家还可以一边推理,一边开另一个终端输入npu-smi info watch 来查看AI core/AI cpu的占用率。

离线模型shuffleNetv1推理

直接按照官网的来,因为我之前npu-smi info输出处理器是310P,所以我只用将昇腾社区-官网丨昇腾万里 让智能无所不及这里的310改成310P3即可,另外模型以及图片的路径大家尽量不要像官网用相对路径,直接用绝对路径,像我这样:

atc --model=/home/jumper/samples/ShuffleNetv1_for_TensorFlow/shufflenetv1.pb --framework=3 --output=shufflenetv1_tf_96batch --output_type=FP32 --soc_version=Ascend310P3 --input_shape="input:96,224,224,3" --out_nodes="classifier/BiasAdd:0" --log=info

这个例子的4b步骤我运行脚本出错,所以直接改用命令运行成功,可以看到官网的步骤中少了一步创建result文件夹以及label写成了label等笔误,像我下面这样创建好后全部用绝对路径::

/home/jumper/samples/ShuffleNetv1_for_TensorFlow/Benchmark/out/benchmark --om=/home/jumper/samples/ShuffleNetv1_for_TensorFlow/shufflenetv1_tf_96batch.om --dataDir=/home/jumper/samples/ShuffleNetv1_for_TensorFlow/scripts/input_bins/ --modelType=shufflenetv1 --outDir=/home/jumper/samples/ShuffleNetv1_for_TensorFlow/results --batchSize=1 --imgType=bin --useDvpp=0

可以看到成功推理了。然后后处理部分我也改用命令运行:可以看到也同样成功了。至此我们运行了官网的两个离线推理实例,均成功。可以看到AI core开始被使用:

调大batch,AI core占用率会提高。

 AI推理卡的C++环境

下面我们终于可以开始创建AI推理卡的C++开发环境:

第三方C++库

opencv上面我已经装过,找到opencv2文件夹。(这里我重新按我之前的博客编译了带并行的opencv,大家若用不着并行,则不必重新编译)

安装MindStudio

按照昇腾社区-官网丨昇腾万里 让智能无所不及 这个步骤一步步安装好mindstudio,缺什么就装什么,反正就按官网的流程走。于是就成了下面这样:

一定要到具体版本号那个文件夹,才会自动显示。但后面听说这个不好用,于是决定不用这个IDE,换成VScode。

安装Visual Studio code

直接在官网下载VScode的deb文件,然后dpkg -i code_xxx.deb安装即可,然后在终端即可打开。我试了一下固定到任务栏双击,发现打不开,于是还是老实使用下面的命令在终端打开:

然后按照官网例子,开始创建第一个helloworld程序,或参考Ubuntu快速搭建C++开发环境(VS Code编辑器) - 知乎 它是要先自己选择好或创建好一个跑工程的文件夹A,再在A下创建 .vscode 文件夹和一些cpp等源文件(源文件也可以之后再新建),再在A下打开终端开启IDE,就会自动导入这个工程,工程名就是A的名字,最后点击源文件进行编码。大家也可直接参考下面的官网,讲解了如何编写配置文件即三个.json,.vscode编写完毕可以重复使用,即另新建一个工程,也只用将.vscode拷贝过去即可。:

可以看到正确输出。vscode安装OK。

code --user-data-dir="/home/jumper/vscode_projects/forAI/helloworld" --no-sandbox

AI C++实例

resnet50 C++

1,准备图片 在官网昇腾社区-官网丨昇腾万里 让智能无所不及 这里下载C++实例代码简称resnet50sample,可以看到有三个h和cpp文件及main文件,再在CIFAR-10 and CIFAR-100 datasets这里下载C++格式的图片。可以看到我下载了两张png格式的,但实例脚本中是jpg,自己改一下就好,然后直接运行,生成的bin文件就是预处理后的图片。不好,突然发现官网又有笔误,即下图左红框中是脚本将图片转成float16这与右边模型的输出不一样,所以我们将脚本中这处地方改成float32,然后再重新运行一遍这个脚本:

 2,模型转换ATC 官网下载模型昇腾社区-官网丨昇腾万里 让智能无所不及 并进行转换,这个方法已经很熟悉了,因为我上面已经描述了两个atc转换并推理的实例。此步不再详细讲解,大家可以往上翻那两个离线推理实例。

atc --model=/root/Downloads/ATC_Resnet50_V1_from_Tensorflow_Ascend310/resnet_v1_50.pb --framework=3 --output=/root/Downloads/resnet50_imagenet_classification/model/resnet50_tf__batch1_fp16_FP32 --output_type=FP32 --soc_version=Ascend310P3 --input_shape=input:1,224,224,3

可以看到目标文件夹下生成了om模型。然后将我们处理完的bin图片和om放入resnet50sample的data以及model下面。

3,C++命令行编译运行 我们先直接使用命令行编译试试,如下左一图很顺利。接着我们修改cmakelists.txt文件如下中间的图,修改黑框位置为自己的安装路径,sample_process.cpp红框部分注意改成与自己的一致(因为这个文件与官网安装步骤中矛盾,所以要改)。然后再在终端make,可以看到也很顺利。make完后out文件夹下会生成一个main可执行文件。这时候其实可以在命令行下运行了,但因为我cmakelists中没有添加相应的lib,而且我以后也主要是在IDE中编译运行,所以运行这步我就不做了。大家若感兴趣可以试下。

  

4,C++ IDE编译运行 如果大家用的是MindStudio 此时就可以按照昇腾社区-官网丨昇腾万里 让智能无所不及 直接打开MindStudio,然后工程目录定位到resnet50sample文件夹下,如下左图。接着编译如中间图,此时out文件夹下会生成main可执行文件,最后运行如右图。

  可以看到运行正确。

VGG_SSD C++

官网有很多C++实例,我下载的是这个https://github.com/Ascend/samples/tree/master/cplusplus/level2_simple_inference/2_object_detection/VGG_SSD_coco_detection_CV_without_AIPP,然后和resnet50差不多流程来做,这个链接下也有步骤,但有的不正确。我觉得还是华为AI推理卡太新了,使用者太少所以反馈少,他们官网就有很多笔误处矛盾处没改正过来,看我写到现在就发现至少3处。不吐槽了,继续搞事:先按github这个链接中的地址下载好模型。

1,atc模型转换 如下我改名是因为发现与其脚本模型名不一致(再次吐槽官网笔误太多),所以改成了下面这样,大家跟着改。注意输出模型名为vgg_ssd.om,不是vgg-ssd.om!!!我贴出的这张图笔误了)然后开始打开scripts运行sample_build.sh脚本,注意我修改了框框处的路径成绝对路径(sample_run.sh我也同样先修改好)。运行sample_build.sh成功后data文件夹下自动下载了一张测试图片。

2,实例的环境 这个例子需要INSTALL_DIR和THIRDPART_PATH,但我们之前按官网教程安装时set_env.sh中并不是这个名字,而是叫做ASCEND_TOOLKIT_HOME(这又是官网的一个矛盾处,醉了)所以我们只能:

A:将下面这4句添加到/root/.bashrc的后面,然后source生效(我的架构是x86_64,大家可以通过uname -a查看自己的,然后像下面这样添加):

export CPU_ARCH='x86_64'
export INSTALL_DIR=/usr/local/Ascend/ascend-toolkit/latest
export install_path=/usr/local/Ascend/ascend-toolkit/latest
export THIRDPART_PATH=/usr/local/Ascend/thirdpart/${CPU_ARCH}

B:接着再看下这个实例需要的环境samples/cplusplus/environment at master · Ascend/samples · GitHub 我们都先看一遍。然后可以知道要在/usr/local/Ascend下新建一个thirdpart/x86_64文件夹。

C:下载所有实例https://github.com/Ascend/samples直接下载下来解压,然后samples/catenation_environmental_guidance_CN.md at master · Ascend/samples · GitHub看到samples-master/common文件夹拷贝到步骤B的x86_64下面。再把samples-master/cplusplus/common/acllite文件夹拷贝到步骤B的x86_64下面。

D:然后按照samples/catenation_environmental_guidance_CN.md at master · Ascend/samples · GitHub这个链接安装ffmpeg与x246插件这一步安装这两个东西。发现很顺利。

E:在x86_64/acllite下面编译这个文件夹,即make然后make install,发现很顺利。然后可以看到x86_64下生成了include和lib文件夹。说明正确。

F:继续按照samples/catenation_environmental_guidance_CN.md at master · Ascend/samples · GitHub这个步骤编译presentagent文件夹。可以看到x86_64下又生成了bin文件夹,include和lib下多了很多内容,如此图至此C++实例的公共环境编译完成。最后将我们之前装的opencv2文件夹拷贝到x86_64/include下面。

3,命令行编译实例 然后我们回到我们下载的VGG-SSD例子中make时发现报黄框中的错误,原因是我下载的是opencv4.x,而VGG-SSD实例中用的是opencv2.X,所以我152行、330行都进行了红框中的修改。顺利完成make和make install。

4:IDE中编译运行 打开Mindstudio,进入工程目录,编译很顺利out文件夹下生成了main文件,再运行都很顺利。

发现竟然没有生成结果图,于是我修改了存图代码后终于有结果图了,如下所示:我将其copydatatoDevice的时间打印了出来,300X300 CV32FC3只需要0.6ms!非常快,这比以前Nvidia CUDA或AMD OpenCL快很多。

5,可能遇到的问题  大家看到这个实例我ATC转换时soc_version=310P3,与我的npu-smi info输出一致,但实例结果图中却没有框框,而且我运行多次发现结果竟然随机这说明结果不正确,然后联系华为他们,发现这两个指令一个输出正确一个输出错误,原因就是soc_version,如果用Ascend310输出的结果图就是debugwd4.jpg就是正确的。但用Ascend310P3就是随机的结果是错误的:

 他们已经去反馈这个问题了。等回复了我再补在这里(还是忍不住吐槽:是不是技术太新了,都没人发现这个问题吗?)他们已回复在 A300 I pro 使用act转模型结果不正确 · Issue #I66FPT · Ascend/samples - Gitee.com

 即之前的链接里的模型不适合AscendP3,这个技术人员更新的链接中的模型才适合AscendP3即现在的结果正确了。那么模型与soc的适配与否取决于什么?大家可以看那个技术人员后续的回复。

图像分割C++实例

接下来我们依葫芦画瓢运行自己的例子(模板我上传在   https://download.csdn.net/download/wd1603926823/87517545),这用的是我几年前测试过的一个图像分割实例,在之前的博客里有跑过Nvidia下的结果,大家可以自己去找看下当时的耗时应该是38ms!现在改到AI推理卡下,步骤如下:

1,创建工程名your_project_name与目录

上面所有流程都实践过的朋友,应该知道data下就放要推理的图片,inc下放几个头文件,model下就放 .om 模型,out下就是编译后的可执行文件与输出结果的位置,src下放cpp文件。这一级的cmake的txt文件就只有这几句话,第7行改成自己的工程名即可。

2,在MindStudio下打开工程到your_peroject_name,然后立刻会自动生成一些东西,不用在意。

3,头文件与cpp文件

有这几个文件就够了。其中acl.json文件中只有一个{}符号。

4,src下的cmakelist.txt与makefile

src下的Cmake的txt文件,基本不用改,就是一样将第7行改成自己的工程名your_project_name。这个txt作用就是规定了输出的位置、包含的头文件与库、需要编译的源文件等。makefile下改下这些路径即可

 

4,修改源文件sample_process.cpp

修改模型名称和模型需要的size即dnnsize大小,以及测试图片名称。其它没什么需要改的,这里我自己增加了预处理函数PreProcessCutImgs,若大家不需要则可以删掉。PreProcess()函数中才是将图片稍微处理后拷贝到device,不能删。

5,修改源文件utils.cpp

这个文件中一般只用修改PreProcess,保证是将测试图的数据传到inputBuff,然后拷贝给picDevBuffer即可。注意fileSize不能搞错。

6,修改源文件model_process.cpp

这个文件一般只用修改OutputModelResult(),outData就是推理得到的结果,可以在这个函数里对推理结果进行后处理,比如我的是将它转成8bit图存在本地。

7,头文件根据上面的修改而修改。

8,Build,Debug也行Release也行,成功后会有一个可执行文件生成在out下。

9,Run,选择Ascend App然后定位到out下即可。

10,看我的结果:

可以看到结果与GPU推理结果一致,release下耗时真的巨短才18ms(在此感叹:果然是华为!)!当初使用Nvidia 2060 Super耗时是38ms!所以相当于少了20ms!!!然后看了下AI Core的占用率,才用到5%!还有很多使用空间。

11,换VScode IDE运行此实例,大家推崇vscode,于是我试了下在下图添加路径,仍旧报错找不到头文件:

还有ascendcl、acl_dvpp路径也报错找不到,明明已经添加进去了!唉,opencv都可以找到,怎么ascend的找不到,还是用MindStudio吧。

 把vscode官网和它的github看了一遍,还是不行。算了不用这个IDE了。然后我又换成了eclipse试一下:

直接将例子放到eclipse下,加入ascendcl、acl_dvpp两个库就可以运行了。配置很简单,至少不会像vscode那样。虽然功能没有vscode强大。我们就先用着吧。

C++去模糊实例

这个实例是根据https://arxiv.org/pdf/1711.07064.pdf这篇论文《DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks》实现,原python代码在GitHub - dongheehand/DeblurGAN-tf: Tensorflow implementation of DeblurGAN(Blind Motion Deblurring Using Conditional Adversarial Networks) 这里。然后华为将其作为https://github.com/Ascend/ModelZoo-TensorFlow/tree/master/TensorFlow/contrib/cv/Blur2Sharp/ATC_DeblurGAN_tf_AE实例,github上在https://github.com/Ascend/samples/tree/master/cplusplus/level2_simple_inference/6_other/DeblurGAN_GOPRO_Blur2Sharp此。然后我们按照说明跑一下,下面这幅图是输入的模糊图片:

然后下面这幅是原论文中去模糊后的结果

 最后这幅图是按华为说明得到的结果,看图最后一百列处蓝色海报处的字迹,有损失估计是atc转换时的精度损失:

 然后我们换一幅图试试,看华为的结果,标记出来的部分有严重损失导致马赛克,这个原因我们暂时不去查。跑通即可:

 C++多线程语义分割

接着我们试下多线程的例子,按照readme中操作反正就不会是一帆风顺的,当./sample_build.sh运行完会发现自动下载了多张图片到data下,接下来就报下图的错。不用理会,直接去src下进行cmake .. 与make以及make install即可。然后out文件下生成了main可执行文件,直接运行即可,可以看到右图正确:接下来我们分析这个官例是怎么实现的,还是分析下面这个多线程的例子吧

C++ YOLOV3COCO多线程实例

如上个例子一样操作,编译没问题但就是MindStudo打不开这个MP4文件cv::videocapture去open时总是失败,手动可以打开,如下图。然后将这句代码移到eclipse下可以打开,但整个例子移到eclipse又编译通不过,配置如下:

为何,都跑了这么多实例了,怎么还会报配置的错误?

make all 
Building file: ../src/main.cpp
Invoking: GCC C++ Compiler
g++ -std=c++11 -I/home/jumper/eclipse_projects/yolov3coco4thread/inc -I/usr/local/Ascend/ascend-toolkit/latest/runtime/include -I/usr/local/Ascend/thirdpart/x86_64/include -I/home/jumper/workspace/opencv_tbb_4.5.2/include -I/home/jumper/workspace/opencv_tbb_4.5.2/include/oneTBB-2020.2 -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/main.d" -MT"src/main.o" -o "src/main.o" "../src/main.cpp"
In file included from /usr/local/Ascend/thirdpart/x86_64/include/acllite/AclLiteUtils.h:32,
                 from ../src/main.cpp:26:
/usr/local/Ascend/ascend-toolkit/latest/runtime/include/acl/ops/acl_dvpp.h:15:2: error: #error "if you want to use dvpp funtions ,please use the macro definition (ENABLE_DVPP_INTERFACE)."
   15 | #error "if you want to use dvpp funtions ,please use the macro definition (ENABLE_DVPP_INTERFACE)."
      |  ^~~~~
In file included from /usr/local/Ascend/thirdpart/x86_64/include/acllite/AclLiteType.h:27,
                 from /usr/local/Ascend/thirdpart/x86_64/include/acllite/AclLiteUtils.h:34,
                 from ../src/main.cpp:26:
/usr/local/Ascend/ascend-toolkit/latest/runtime/include/acl/ops/acl_dvpp.h:15:2: error: #error "if you want to use dvpp funtions ,please use the macro definition (ENABLE_DVPP_INTERFACE)."
   15 | #error "if you want to use dvpp funtions ,please use the macro definition (ENABLE_DVPP_INTERFACE)."
      |  ^~~~~
../src/main.cpp: In function ‘void Postprocess(aclrtContext, Queue<message>*)’:
../src/main.cpp:164:27: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<BBox>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
  164 |         for (int i = 0; i < detectResults.size(); ++i) {
      |                         ~~^~~~~~~~~~~~~~~~~~~~~~
make: *** [src/subdir.mk:23: src/main.o] Error 1

09:25:43 Build Failed. 3 errors, 1 warnings. (took 3s.329ms)

终于找到原因,如下所示已解决:

可以看到这个实例多线程下,四个核每个都跑到了几乎100% 。说明的确是多线程。接下来我们分析一下多线程推理其实现过程:文中是4路视频,可以理解成4幅图-----预处理时是4个子线程t1对4幅图并行处理,但通常不是同时结束预处理preprocess,总会有一个顺序假设完-成顺序是img2、img4、img1、img3。----那么当img2完成preprocess时立刻就放入队列prequeue中了,然后马上pop出prequeue队进推理车间,推理完毕后入postqueue队列中。这些都在主线程T中完成---------可能在img2入队prequeue后img4紧跟着入队prequeue中,但如果此时推理车间(主线程T)还在忙着处理img2,那img4就要等待,直到img2已处理完毕即主线程空闲了,才会马上处理img4,即将img4 pop出prequeue队进推理车间,推理完毕后入postqueue队列中------注意img4在推理车间进行处理时,img2此时可能已经被pop出postqueue队列了,开始子线程t2对img2进行后处理postprocess。   由此可知,并不是真正的并行,而是异步!对于唯一的一个modelid,只能异步。

如果要传统意义上的真正并行,必须要创建多个modelid 配套不同的context、内存input、output以及device上的buffer等资源,才能真正并行。

独立并行推理C++

实现真正的独立且并行推理,根据上面的分析我们知道samples中的实例只是实现了异步推理,并没有真正实现独立并行推理,因此我们自己试下。

使用中遇到的问题

多线程下稳定性

之前单线程下测试是没问题的,今天开始使用多线程进行稳定性测试时,我开了10个线程每个线程处理近六十几张图,隔半个小时记录一次AI卡的温度、AI core占用率与频率,结果出现卡在下面左图十五分钟以上,不止这个终端卡住,整个系统完全卡死,无法关机,然后一直等到下中图直接被killed!我以为是哪里资源没释放,但我是参照官例写的,官例释放了哪些资源我就照做的。

 我以为是AI卡的保护机制,可能我线程太多温度太高负荷太大所以把我killed了。于是我减少线程到1并减少图片数量,然后重新重启试下,还是会在某次卡死,从top看每个iteration有释放资源,并不是内存一直增加到爆满。

另外查问题可以看下这两个网站 :日志收集 msnpureport工具使用 - Atlas 300I Pro 推理卡 5.1.RC2 黑匣子日志参考 01 - 华为 然后错误码解释 aclError - CANN 5.0.4 应用软件开发指南 (C&C++, 推理) 01 - 华为 

ModelArts的使用

最近试了一下这个ModelArts,过程如下:

训练方式1

1,登录云计算平台

然后点击箭头位置跳到ModelArts控制台

 2,创建notebook实例,并:启动,然后点击: 打开

 就进入了jupyterLab

这个箭头位置可以从本地上传图片等压缩包,然后打开终端解压。终端下将官网支持的模型下载下来:

git clone https://gitee.com/mindspore/models.git

 然后可以切到1.7版本,我用的是这个版本,因为创建实例notebook时我选的镜像是mindspore1.7。

 3,查看配置文件,在config里的yaml,自己选择,然后终端开始训练

cd models/official/cv/resnet/scripts
bash run_standalone_train.sh /home/ma-user/work/images/cifar10/data/cifar-10-batches-bin /home/ma-user/work/models/official/cv/resnet/config/resnet50_cifar10_config.yaml

 会在scripts下生成train,并生成对应的log。右边状态栏上有monitor可以查看资源使用率。

log是隔一会儿更新一次,记得手动打开查看多次 

 

 4,验证

类似下面这样:

bash run_eval.sh ~/cifar10-10-verify-bin  /train/output/checkpoint/resnet-90_195.ckpt ../config/resnet50_cifar10_config.yaml

 然后会有对应的eval文件生成、以及log,也是隔一会儿更新,可以看到log最后一行的准确率:

至此,上面已经通过notebook实例在jupyterLab上完成了一次训练

训练方式2

1,上传jupyterLab上的内容到modelarts中

需要使用moxing:

import moxing as mox
	mox.file.copy('/home/ma-user/work/models/official/cv/resnet', 'obs://你自己创建的某个桶名')

这样就将刚刚的resnet模型训练内容传到了modelarts上。

2,modelarts上创建训练作业:创建训练作业_AI开发平台ModelArts_模型训练_完成一次训练_华为云 查看训练详情、日志等。

3,(麻烦,不做)训练的可视化 可视化训练作业介绍_AI开发平台ModelArts_模型训练_模型训练可视化_华为云

IDE调试

对于jupyterLab中的代码,可以用vscode/pycharm远程连接从而进行修改、调试、运行

参考 安装VS Code软件_AI开发平台ModelArts_开发环境_本地IDE_本地IDE(VS Code)_华为云

我是选的vscode,于是先安装,然后跟着教程 VS Code手动连接Notebook_AI开发平台ModelArts_开发环境_本地IDE_本地IDE(VS Code)_华为云 手动创建连接,然后就可以 在VS Code中远程调试代码_AI开发平台ModelArts_开发环境_本地IDE_本地IDE(VS Code)_华为云 调试修改代码了。

自动学习

modelarts有自动学习功能,即只需上传各个类别的样本,网页上标注好,设置训练时长,就可以开始自动训练了。

1,创建桶并上传样本图片

上传不同类别的图片到桶,一定要按照:桶名/文件夹名(我这里是train)/类别1名/图片 这种形式,即类别1名不能直接放在桶名下。

 我发现jupyterlab上传图片时总是会有这种报错:

但是不用在意。

2,创建数据集(旧版数据集比新版好用)

先说下,数据集我们哪怕用不同的文件夹上传的,最终创建数据集时还是会自动给我们混在一起,这点很烦。

 3,标签标注(两种方式:智能标注或手动)

A,先说智能标注

必须先每个类别手动标注5张,才能启动智能标注,即所谓的一键标注

 然后再返回数据集,启动智能标注

 

 但是我试了下,智能标注只针对很好区分的图片标注才快,否则非常慢或根本标注不出来。因为它系统内是将不同类图片混合在一起的,哪怕我们手动标了5张,对于难分类的图,智能标注基本无用。所以我是自己手动标注的。

B,手动标注

这里有一个筛选条件,我是直接筛选到目录即我的类别1下,将所有图片标注。这里竟然一次只能最多60个/100个,所以很烦。

 4,创建自动学习项目

导入我们之前标注好的数据集

 5,开始训练

6,训练结束

 试了几次,准确率不高。

7,数据处理

数据处理有几种方式,有数据清除、数据增强等等。我选择了对上面训练得不好的数据集/桶做数据增强。

a,需要先自己新建一个增强后的数据集/桶,

b,然后将之前已标注好的数据集/桶中的数据做增强,增强的输出路径为新建的这个数据集/桶,

c,然后再对增强输出结果进行标注。这点很烦,之前已经标注过的图,增强后生成对应的图片竟然要重新标注。

d,最后新建自动学习任务,导入标注好的增强图即可开始训练。

8,在线部署推理

自动学习的模型只可以一张一张在线推理,目前无法批量:

 9,模型导出

非自动学习的模型可以导出,如resnet:

我修改了划线的地方:

导出模型的名字任意命名: 

 download到本地磁盘:

参考网址:GitHub - Ascend/samples samples: CANN Samples - Gitee.com  昇腾社区-官网丨昇腾万里 让智能无所不及 samples: CANN Samples

########################以下是TensorRT###########################

tensorRT

首先阅读了大神的一些文章:

https://blog.csdn.net/weixin_45252450/article/details/123777166

https://zhuanlan.zhihu.com/p/547970261 了解tensorRT
https://zhuanlan.zhihu.com/p/547966550 了解tensorRT
https://zhuanlan.zhihu.com/p/555827562 tensorRT生态链

https://zhuanlan.zhihu.com/p/408220584 tensorRT C++部署
https://zhuanlan.zhihu.com/p/344810135 tensorRT C++部署
https://zhuanlan.zhihu.com/p/555829505 tensorRT runtime c++ API,反序列化引擎进行推理
https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#perform_inference_c
https://zhuanlan.zhihu.com/p/553367059 tensorRT性能分析与性能优化方法

https://zhuanlan.zhihu.com/p/552537009 在tensorRT中使用DLA(固定层加速引擎)
https://zhuanlan.zhihu.com/p/551268145 tensorRT自定义层
https://zhuanlan.zhihu.com/p/481960581 tensorRT动态batch
https://zhuanlan.zhihu.com/p/407563724 YOLOX网络的序列化 C++

tensorRT不能直接跨平台/显卡/tensorrt版本,如果序列化生成engine的平台/显卡/tensorrt版本与反序列化加载engine并进行推理的平台/显卡/tensorrt相同,则没问题;否则要在后者中重新序列化一次。

https://blog.csdn.net/wq_0708/article/details/121248152
https://blog.csdn.net/u013230291/article/details/119183416
https://blog.csdn.net/weixin_46659749/article/details/119980122

https://blog.csdn.net/qq_42944019/article/details/126857775

https://zhuanlan.zhihu.com/p/358135157 从论文复现网络

看过上面大神的文章后,知道我要做的就是如下图红色步骤:

然后我可能是在Jetson AGX Xavier服务器上实现,关于这个服务器可以Jetson AGX Xavier - 随笔分类 - 格格_gloria - 博客园 https://blog.csdn.net/huiyuanliyan/category_8689841.html 通过这两个大神的博客了解下。

~~~~~~~~~~~~~~~~~~~~~~ Jetson AGX Xavier安装CUDA~~~~~~~~~~~~~~~~~~~~~

使用JetPack SDK Manager刷机(通过另一台正常的ubuntu系统作为host,给这个Jetson平台刷系统)部分忽略,因为我拿到手时这台机已刷完ubuntu 18.04.6系统了。

然后我原本准备按之前我的记录ubuntu下tensorflow 2.0/2.5 c++动态库编译gpu版本_元气少女缘结神的博客-CSDN博客_ubuntu 查看c++版本给这台机装TF-GPU C++,发现不行,因为装CUDA时需要查看兼容性如下Release Notes :: CUDA Toolkit Documentation :可以看到要与系统内核匹配

 而通过命令uname -a 可以看到Jetson平台的kernel并不是x86_64而是 linux ubuntu 4.9.140-tegra,所以就不能按上面的平常的步骤去安装CUDA了。

~~~~~~~~~~~~~~~~~~Jetson AGX Xavier安装TF C++~~~~~~~~~~~~~~~~~~~~~~~~

参考Nvidia Jetson Xavier配置tensorflow1.13.1 C++ API_清~的博客-CSDN博客 来尝试:

~~~~~~~~~~~~~~~~~~ubuntu18.04.5 + AI卡~~~~~~~~~~~~~~~~~~~~~~~~~~

ubuntu18.04.5下AI推理

换到一台新机上,重头开始配置。

一、安装系统ubuntu18.04.5:

教程很多,忽略。注意系统内核别太高,否则后面装驱动会失败的,最好内核版本低一些,比如5.4.0-42-generic等等。我的本来是5.15.x,后面ubuntu18.04.4更换内核版本_ubuntu更新内核_小立爱学习的博客-CSDN博客 降低到了5.4.0-42就OK。 另外自动更新取消掉。

二、配置远程

Windows10通过VNC远程连接Ubuntu18.04 - 爱码网  以及 WinSCP 连接 Ubuntu,显示拒绝访问。-CSDN博客

三、安装驱动固件

Atlas 300I Pro 推理卡 5.1.RC2 NPU驱动和固件安装指南 04 - 华为

将驱动拷贝到/opt下,先check再full,安装驱动时发现竟然有下面的报错: https://support.huawei.com/enterprise/zh/doc/EDOC1100258097/e1541e4e

我看下日志后发现是版本问题,这个驱动与我的内核版本不一致:

 于是我重新下载Ascend HDK 系列 昇腾计算22.0.0 软件补丁下载 - 华为 一个版本安装,结果还是同样的问题。先用apt-get install dkms 把警告dkms的装了,咦竟然就可以安装了,看:

 固件也是一样步骤安装,先check再full,装完后现在重启。重启后输入npu-smi -v 可显示版本号表面正确安装,输入npu-smi info可以看到卡信息证明正确。

三、安装CANN的依赖

我是按照昇腾社区-官网丨昇腾万里 让智能无所不及 这个步骤在昇腾社区-官网丨昇腾万里 让智能无所不及 这里下载toolkit的版本进行安装。

先安装依赖:

apt-get install -y gcc g++ make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 libopenblas-dev

然后使用下面的检查是否正确:

gcc --version
g++ --version
make --version
cmake --version
dpkg -l zlib1g| grep zlib1g| grep ii
dpkg -l zlib1g-dev| grep zlib1g-dev| grep ii
dpkg -l libsqlite3-dev| grep libsqlite3-dev| grep ii
dpkg -l openssl| grep openssl| grep ii
dpkg -l libssl-dev| grep libssl-dev| grep ii
dpkg -l libffi-dev| grep libffi-dev| grep ii
dpkg -l unzip| grep unzip| grep ii
dpkg -l pciutils| grep pciutils| grep ii
dpkg -l net-tools| grep net-tools| grep ii
dpkg -l libblas-dev| grep libblas-dev| grep ii
dpkg -l gfortran| grep gfortran| grep ii
dpkg -l libblas3| grep libblas3| grep ii
dpkg -l libopenblas-dev| grep libopenblas-dev| grep ii

然后继续按照昇腾社区-官网丨昇腾万里 让智能无所不及流程安装python,如果遇到timeout报错就在对应的install前面加上--default-timeout=1000即可。

四、安装CANN

即按照 昇腾社区-官网丨昇腾万里 让智能无所不及 这个安装toolkit即可,默认会安装在/usr/local/Ascend/ascend-toolkit/下,然后将下面这句添加到/root/.bashrc下:

source /usr/local/Ascend/ascend-toolkit/set_env.sh

然后再source /root/.bashrc 使其生效,这样在任何一个终端下输入atc都会出现:

ATC start working now, please wait for a moment.

则表示安装成功。

五、安装cv及tf(可忽略)

根据自己的需求来安装opencv以及tensorflow:

pip3 --default-timeout=1000 install opencv-python
pip3 install tensorflow-cpu==2.5.0

这里我还下载了C++ opencv 4.5.2并像在ubuntu20.04.4中一样编译了,如果不用C的可以忽略:

1,apt install cmake-qt-gui
2,再下载opencv和对应contrib
3,终端cmake-gui
编译类型:Release 
填入:opencv_extra_module的路径
勾选:build_opencv_world,WITH_TBB,BUILD_TBB
取消勾选:WITH_ITT
4,make && make install
收集include和lib 

六、安装AI并行推理需要的库

先将下面这4句添加到/root/.bashrc的后面,然后source生效:

export CPU_ARCH='x86_64'
export INSTALL_DIR=/usr/local/Ascend/ascend-toolkit/latest
export install_path=/usr/local/Ascend/ascend-toolkit/latest
export THIRDPART_PATH=/usr/local/Ascend/thirdpart/${CPU_ARCH}

再在/usr/local/Ascend下新建一个thirdpart/x86_64文件夹,下载samples-master,然后将samples-master/common文件夹拷贝到步骤B的x86_64下面,再把samples-master/cplusplus/common/acllite文件夹拷贝到x86_64下面。然后按照samples/catenation_environmental_guidance_CN.md at master · Ascend/samples · GitHub 这个链接安装ffmpeg与x246插件这一步安装这两个东西。

七、工程配置:

按如下对工程配置即可运行起来:

 至此ubuntu18.04.5下的所有流程已结束。

今天突然要更换成MindSpore框架:

八、MindSpore

1,先参考MindSpore官网 查看匹配的版本,然后下载合适的版本如mindspore_ascend-1.8.0-cp37-cp37m-linux_x86_64.whl 然后按照安装步骤 MindSpore官网 安装。即pip install mindxxxxx.whl 如下:

2,有一些其他包的要求,参考 requirements.txt · MindSpore/mindspore - Gitee.com 这个,看自己pip list下哪些还没有装,就pip install -default_timeout=1000 xxxx==对应的版本即可。

3,设置环境变量

export GLOG_v=2
LOCAL_ASCEND=/usr/local/Ascend
export LD_LIBRARY_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/lib64:${LOCAL_ASCEND}/driver/lib64:${LOCAL_ASCEND}/ascend-toolkit/latest/opp/op_impl/built-in/op_impl/ai_core/tbe/op_tiling:${LD_LIBRARY_PATH}
export TBE_IMPL_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe
export ASCEND_OPP_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/opp
export ASCEND_AICPU_PATH=${ASCEND_OPP_PATH}/..
export PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/compiler/ccec_compiler/bin/:${PATH}
export PYTHONPATH=${TBE_IMPL_PATH}:${PYTHONPATH}

4,在/usr/local/Ascend/ascend-toolkit/latest/lib64下的几个.whl如果报错没有,那就分别pip install xxx.whl即可

5,验证是否安装成功:

python -c "import mindspore;mindspore.run_check()"

不出现报错就成功,但我的有报错:

原因如图中所示。710不支持这种方式验证mindspore是否安装成功,因为需要调用训练卡而我只有推理卡(大家如果有训练卡是不会报错的)。所以我直接按之前ModelArts的使用里面先在那上面训练,训练完毕后导出模型。

6,模型推理(离线服务器)

a,先将gitee下models_r1.7下载,解压到离线服务器

b,安装 对‘google::FlagRegisterer::FlagRegisterer<unsigned long>(char const*, char const*, )’未定义的引用_守青山的博客-CSDN博客 gflags

c,参考 utils/cpp_infer/README_CN.md · MindSpore/models - Gitee.com  utils/cpp_infer/README_CN.md · MindSpore/models - Gitee.com  这里搭建C++推理环境,然后参考 Ascend 310 AI处理器上使用MindIR模型进行推理 — MindSpore master documentation 这里执行推理。

d,将上面链接中说的build.sh、main.cc、Cmakelists.txt以及common_inc都拷贝到一个目录中,然后根据自己的情况修改main.cc文件如下,最后运行./build.sh编译成功,生成main的可执行文件与Makefile。但我在执行./main时报错说我给的测试数据与模型要求不一致,应该换成一致的数据即可。但这个datasize怎么是30730000这么奇怪的数字。

这上面估计是我用的master的代码,而实际模型是分支1.7下的,所以不一致。

e,于是我将离线代码也换成r1.7的,然后重来,但是  resnet50在mindspore下训练导出为mindir后推理报错 · Issue #I7DU88 · MindSpore/models - Gitee.com 看到依旧报错:/mindspore/models-r1.7/official/cv/resnet/ascend310_infer/src/main.cc:55: 对google::FlagRegisterer::FlagRegisterer未定义的引用

f,后面发现是将下面5句屏蔽就不会报错: 

 放开就报错:

 原因未知。

g,我想起d步虽然分支不一样,但好歹运行到了predict那里才报错。于是我将d步master分支下的build.sh、common_inc、main.cc、cmakelists替换到这个报错的r1.7的src下,这样就可以不用gflags了,编译发现没报错(中途又发现了官网下的这个文件的诸多小bug,我都懒得放上来了,陈述这些小bug都陈述吐了,解决方式就是自己看日志、分析、找原因、对症下药):

 然后现在是推理阶段报错,但至少预处理阶段已经运行过了。可以看到生成了处理后的数据img_data、label文件夹以及preprocess的日志:

 然后我又去查报错infer日志看到,这次的报错datasize尺寸就正常多了,应该是少了一个batchsize的32,说明我最开始给data的bin不正确:

h,于是我重新回到modelarts上,修改那个config.yaml文件的batchsize改成1,然后再导出模型.dir即:

python ./scripts/train/export.py --checkpoint_file_path=/home/ma-user/work/models/official/cv/resnet/scripts/train/output/checkpoint/resnet-45_1875.ckpt --file_name=/home/ma-user/work/models/official/cv/resnet/scripts/train/output/resnet50batchsize1model --file_format='MINDIR'

然后将这个yaml以及导出的dir模型download下载到本地磁盘,上传到离线服务器中,替换之前报错的模型与yaml。 

i,重新跑之前报错的run_infer_310.sh脚本:

看到已经全部推理成功!!!!!!!且生成了准确率的日志!!!!!!!

 我发誓这篇再也不更新了,刚刚看左下角竟然显示33000多字了,记录、记录、写写写快吐了。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

元气少女缘结神

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

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

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

打赏作者

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

抵扣说明:

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

余额充值