使用MindStudio进行PCB模型ONNX推理

基于MindStudio的PCB模型在Ascend310与310P的迁移推理

  • 写在前面

本次实验在MindStudio上进行,请先按照教程配置环境,安装MindStudio。

MindStudio提供您在AI开发所需的一站式开发环境,支持模型开发、算子开发以及应用开发三个主流程中的开发任务依靠模型可视化、算力测试、IDE本地仿真调试等功能,MindStudio能够帮助您在一个工具上就能高效便捷地完成AI应用开发

在此次模型推理工作中,MindStudio提供模型压缩工具、模型转换工具和模型可视化工具。模型转换工具将开源框架的网络模型 (如Caffe、TensorFlow等)转换成昇腾AI处理器支持的离线模型,模型转换过程中可以实现算子调度的优化、权值数据重排、内存使用优化等。我们使用到了Mindstudio的Model Converter和Remote终端来可视化完成Atc工具转换模型和Bechmark工具进行精度、性能测试的任务。

  • 任务介绍

①任务场景:模型推理与迁移。

②任务描述:实现模型从 pytorch 1.5 迁移到 pytorch 1.8 的推理功能,实现模型推理功能,精度达到合同要求。

③任务目标:在Ascend310上的精度和性能不差于论文官方结果;在Ascend710上的推理性能达到Ascend310的1.2倍,T4的1.6倍。

④环境信息:昇腾设备:Ascend310、Ascend710;OS:CentOS Linux;CANN版本:5.0.2。

  • 安装依赖

3.1模型依赖

依赖名称

版本

OONX

1.9.0

Pytorch

1.8.1

TorchVision

0.8.1

Numpy

1.19.2

Pillow

8.2.0

Opencv-python

4.5.2.54

scikit-learn

0.24.1

skl2onnx

1.8.0

h5py

3.3.0

3.2环境依赖

3.2.1安装python依赖

下载链接:Python Release Python 3.7.5 | Python.org

首先在官方网站下载安装安装Python3.7.5到Windows本地。在Windows 10操作系统的“控制面板 > 系统和安全 > 系统”中选择“高级系统设置”,如下图所示。

这里我们要将Python安装环境下的Scipts路径添加到Path里,最后点击确认,完成环境变量设置。

“Win + R”快捷键打开系统命令行,输入“Python -V”,如下图所示表示安装成功。

Python安装完成后,安装Python依赖:

pip install xlrd==1.2.0

pip install absl-py

pip install numpy

pip install requests

3.2.2安装MinGW依赖

下载链接MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net

根据电脑配置,下载适合的依赖,例如64位可以选择x86_64-posix-seh。然后解压MinGW安装包到自定义路径。如上文配置Python时进入环境变量编辑页面,点击新建然后添加刚刚安装MinGW的路径即可。

打开系统命令行,输入gcc -v命令,若下图所示表示安装成功。

3.2.3 安装Java依赖

下载地址:Java Downloads | Oracle

下载下来后安装到本地,然后参照其他依赖设置Java环境变量

打开系统命令,输入java --version,如显示Java版本信息,则表示安装成功

3.2.4 安装Cmake

下载地址:Download | CMake

①单击快捷键“win+R”,输入cmd,单击快捷键“Ctrl+Shift+Enter”,进入管理员权限命令提示符。若弹出“用户帐户控制”提示窗口,单击“是”。

②执行以下命令,安装软件包:

msiexec /package {path}\{name}.msi

打开安装包后选择自己要安装的路径,但是要将安装路径添加到环系统境里

         

3.2.5 安装MindStudio

下载地址:MindStudio下载-昇腾社区 (hiascend.com)

你可以选择.zip文件,也可以选择.exe文件。我这里选择.exe文件安装,安装简单无须赘述,只需一直next,然后在此处根据需求勾选即可。

Create Desktop Shortcut:创建桌面快捷方式,用户可根据系统配置选择“32-bit launcher”或者“64-bit launcher”。

Update PATH variable(restart needed):将MindStudio的启动文件路径加入环境变量PATH中,可从系统命令行直接启动MindStudio。如果勾选此项,MindStudio安装配置完成后会重启操作系统。

Update context menu:勾选“Add "Open Folder as Project"”后,右键单击文件夹,可以作为MindStudio工程打开。

Create Associations:默认不勾选。

最后下载jbr,下载地址https://cache-redirector.jetbrains.com/intellij-jbr/jbr_dcevm-11_0_10-windows-x64-b1341.35.tar.gz

解压到MindStudio安装根目录,与bin目录同级,如下图所示。

  • 推理迁移

4.1 onnx简介

ONNX (Open Neural Network Exchange)- 开放神经网络交换格式,是一种在各个主流深度学习框架中迁移模型的中间表达格式作为框架共用的一种模型交换格式,例如将 Pytorch 或者 TensorFlow 模型转化为 ONNX 模型,然后再将 ONNX模型转化为我们使用不同框架部署需要的类型,ONNX 相当于一个中间者、翻译者。

4.2 创建工程

打开MindStudio, 选择File -> New -> Project

选择Ascend Operator,填写工程名字,点击Next下一步

点击change 然后点击+号远程配置服务器

 

Add添加并配置服务器。

输入用户名和密码配置即可。

Test connection可以在输入完成后测试是否可以连接,输入无误则会提示连接成功。

如果有多个服务器可以右击选择Rename进行备注方便之后选择。

配置完成后定位CANN包的位置,我们这里选择的是 usr/local/Ascend/ascend-toolkit/latest

Finish完成配置

点击Next 选择onnx

这样就完成工程创建了

  • 数据集获取与处理

源码包下载链接:ATC PCB (FP16)-昇腾社区 (hiascend.com)中点击立即下载即可

5.1获取原始数据集

Market1501数据集,自行获取该数据集,上传并解压数据集到服务器任意目录(如我上传到了/opt/npu)。

5.2数据预处理

目标:将原始数据转化为二进制文件(.bin)。

①下载PCB_RPP_for_reID开源代码,并将PCB_RPP_for_reID/reid/datasets移到ModelZoo源码包根路径下。

git clone https://github.com/syfafterzy/PCB_RPP_for_reID.git

cd PCB_RPP_for_reID

git reset --hard e29cf54486427d1423277d4c793e39ac0eeff87c

cd ..

cp -r PCB_RPP_for_reID/reid/datasets ./

②执行PCB_pth_preprocess.py脚本。运行成功后生成query_preproc_data_Ascend310和gallery_preproc_data_Ascend310文件夹。

python3.7 PCB_pth_preprocess.py -d market -b 1 --height 384 --width 128 --data-dir /home/HwHiAiUser/datasets/market1501/ 

-d:数据集

-b:batchsize

---height:图像输入高

--width:图像输入宽

--data-dir:数据集路径

③生成数据集info文件

使用benchmark推理需要输入二进制数据集的info文件,用于获取数据集。使用get_info.py脚本,输入已经得到的二进制文件,输出生成二进制数据集的info文件。运行get_info.py脚本。

python3.7 get_info.py bin ./query_preproc_data_Ascend310 ./query_preproc_data_Ascend310.info 128 384

python3.7 get_info.py bin ./gallery_preproc_data_Ascend310 ./gallery_preproc_data_Ascend310.info 128 384

第一个参数为生成的数据集文件格式,第二个参数为预处理后的数据文件路径,第三个参数为输出的info文件,第四个和第五个参数分别为模型输入的宽度和高度。

运行成功后,在当前目录中生成query_preproc_data_Ascend310.info和gallery_preproc_data_Ascend310.info。

  • 模型转换

6.1 .pth转.onnx

使用PyTorch将模型权重文件.pth转换为.onnx文件,再使用ATC工具将.onnx文件转为离线推理模型文件.om文件。

①获取权重文件,在源码包中有权重文件PCB_3_7.pt。在Modelzoo获取的源码包中创建models文件夹,并将权重文件放入该文件夹。

mkdir models

mv PCB_3_7.pt ./models/PCB_3_7.pt

②导出onnx文件,添加pth2onnx.py搜索路径

import sys    

sys.path.append('PCB_RPP_for_reID')

import torch

import argparse

from torch.autograd import Variable

修改模型文件

cd PCB_RPP_for_reID/reid/models

patch -p0 < ../../../resnet.diff

cd -

执行pth2onnx脚本,在models目录下生成onnx模型文件PCB.onnx。

python3.7 pth2onnx.py

6.2 .onnx转.om

得到静态ONNX模型后,使用ATC工具将.onnx文件转换为.om文件,导出.onnx模型文件时需设置算子版本为11。

ATC工具功能架构如下图所示。从图中可以看出,用户可以将开源框架网络模型或Ascend IR定义的单算子描述文件(json格式)通过ATC工具转换成适配昇腾AI处理器的离线模型。

6.2.1 命令行使用atc工具

使用ATC工具将ONNX模型转OM模型,设置环境变量

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

使用atc将onnx模型转换为om模型文件

atc --framework=5 --model=.onnx文件地址 --output=PCB --input_format=NCHW --input_shape="input_1:1,3,384,128" --log=debug --soc_version=Ascend310

--model:为ONNX模型文件。

--framework:5代表ONNX模型。

--output:输出的OM模型。

--input_format:输入数据的格式。

--input_shape:输入数据的shape。

--log:日志级别。

--soc_version:处理器型号。

运行成功后生成PCB.om模型文件。

6.2.2 MS可视化操作

Mindstudio已经嵌入ATC工具,在菜单栏选择“Ascend > Model Converter”,如下图所示。

选择onnx模型文件

可以打开output path选择保存在本地的输出地址

填写对应shape,我们只要更改第一维数据,即更改不同的batch size来转换成适合不同bs输入的om模型,服务于之后的性能测试 。

下图为转换过程中的截图

 

Model converted successfully转换成功!

  • Benchmark推理

CANN当前版本为5.1.RC1,CANN 5.1.RC1和MindStudio 5.0.RC1版本不发布benchmark工具,若需要在MindStudio环境下使用该工具,请安装CANN 5.0.3版本下的benchmark工具以及3.0.3版本的MindStudio。所以我们使用Mindstudio客户端的远程终端Remote Terminal进行benchmark工具的使用。在菜单栏选择“Tools> Start SSH Session”,选择我们配置好的远程连接,

为便于不同batch size的性能测试,我们可以先使用Model converter转换出1,4,8,16,32,64bs的om模型,并将它们放在同一个文件夹内。

重命名与移动

若提示重复,可以直接replace即可

我们把不同bs的om文件存放在如下目录

以下只展示用PCB_bs1.om进行测试,其他bs方法相同

①测试精度

python3.7 ./PCB_pth_postprocess.py -q ./result/dumpOutput_device0_query -g ./result/dumpOutput_device0_gallery -d market --data-dir /opt/npu/market1501

TopN精度表格如下

CMC Scores

market1501

Top-1

92.1%

Top-5

96.9%

Top-10

98.1%

将得到的om离线模型推理TopN精度与该模型github代码仓上公布的精度对比,精度下降在1%范围之内,故精度达标。

②测试吞吐率

./benchmark.x86_64 -model_type=vision -device_id=0 -batch_size=1 -om_path=/home/zyc/om/PCB_bs1.om -input_text_path=./query_preproc_data_Ascend710.info -input_width=128 -input_height=384 -output_binary=True -useDvpp=False

在此之前要先配置环境变量

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

 

结果如下图所示

运行结果参数说明如下表所示:

参数

说明

[e2e]

throughputRate

latency

端到端总吞吐率。公式为sample个数/时间。

端到端时延,即从处理第一个sample到最后一个sample的完成时间。

[data read]

[preprocess]

throughputRate

当前模块的吞吐率。

[post]

moduleLatency

执行一次当前模块的时延。

[infer]

throughputRate

moduleLatency

Interface throughputRate

推理模块整体吞吐率,包含线程启动、数据等待、实际推理等时间。

推理模块的平均时延。公式为执行一次推理的时间/batch size,其中执行一次推理的时间包含了内存申请、内存拷贝以及推理等时间。

aclmdlExecute接口的吞吐率。公式为sample个数/aclmdlExecute接口的平均执行时间。

我们关注interface throughRate,结果为369.953,若是310模型则需乘以4,若为310P则无需相乘。

后面我们在310和310P上均进行了精度测试,全部达标。

  • 优化方法

如果性能不能达标,我们提供了一些可以参考的优化方法,如

①aoe优化

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

export LD_LIBRARY_PATH=${ASCEND_HOME_PATH}/tools/aoe/lib64:$LD_LIBRARY_PATH

aoe --framework=5 --model=./models/PCB.onnx --job_type=2  --output=./om/PCB_aoe_bs1.om --input_format=NCHW --input_shape="input:1,3,384,128" --device=0

 

等待读条结束即可

②onnxsim工具

通过Netron查看onnx的模型结构图发现有一些常量算子可以折叠,固定模型输入的batch size,并结合onnxsim工具对onnx模型进行优化

pip install onnx-simplifier == 0.3.6

  • FAQ

Q:出现如下benchmark无法使用的问题如何解决?

A:这是你忘记了配置环境变量,只需运行如下代码

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

Q:使用benchmark提示没有权限怎么办?

A:chmod u+x benchmark.x86_64

Q:安装环境缓慢如何解决?

A:可以尝试换源,例如使用豆瓣源,以下以安装pytorch为例

pip install -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple torch==1.8.1

  • 从昇腾社区获得更多帮助

开发者在使用 MindStudio 或进行算子开发过程中遇到任何问题,都可以来昇腾社区获得更多的帮助。

昇腾官网:https://www.hiascend.com/

昇腾社区:https://bbs.huaweicloud.com/

昇腾论坛:https://bbs.huaweicloud.com/forum/forum-726-1.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值