使用MindStudio进行PNAS模型ONNX推理

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

MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,其功能涵盖面广,可以进行网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。MindStudio除了具有工程管理、编译、调试、运行等一般普通功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。 除此以上官方的说明文档之外,我个人觉得MindStudio给用户提供了一个简单方便快捷的使用工具,能够让我们能够很顺畅的进行代码的开发、运行和调试。如其可以和远端服务器进行连接,在MindStudio上对代码进行修改可以很方便的同步到远程服务器上,不需要再借助xftp软件进行文件的传输;关于远端服务器上的代码运行也不需要再借助xshell等软件,可以很方便的通过MindStudio自带的工具进行。MindStudio将文件传输和运行代码集中在一起,在一定程度上提高了我们开发代码的效率。

  1. 概述

PNAS是一种学习卷积神经网络(CNN)结构的方法,该方法比现有的基于强化学习和进化算法的技术更有效。使用了基于序列模型的优化(SMBO)策略,在这种策略中,按照增加的复杂性对结构进行搜索,同时学习代理模型(surrogate model)来引导在结构空间中的搜索。这种方法类似于 A* 算法(也被称为分支限界法),其中从简单到复杂搜索模型空间,并在前进过程中剪枝处理掉没有前途的模型。这些模型(单元)按照它们所包含的模块的数量进行排序。从考量带有一个模块的单元开始。评估这些单元(通过训练它们并在一个验证集上计算它们的损失),然后使用观察得到的奖励来训练一个基于 RNN 的启发式函数(也被称为代理函数),其可以预测任何模型的奖励。接着可以使用这个学习到的启发式函数来决定应该评估哪些带有 2 个模块的单元。在对它们进行了评估之后,再对这个启发式函数进行更新,重复这一过程,直到我们找到带有所想要的模块数量的优良单元。

  1. 服务器端推理环境准备

  2. 获取Pytorch框架下的PNAS推理项目源代码

该推理项目源代码通过华为方提供的网页链接进行下载,下载到本地电脑之后会得到一个ATC PNASNet5Large(FP16) from Pytorch - Ascend310.zip的压缩包,然后将压缩包通过xftp软件传输到服务器上面并进行解压操作。

  1. 解压完之后,会形成当前的目录结构

现在对主要用到的一些相关文件进行说明:

  • benchmark.x86-64:推理工具

  • env.sh:配置环境变量

  • requirements.txt:配置python环境所需要的依赖包相关说明

  • get_info.py:生成推理输入的数据集二进制info文件

  • vision_metric_ImageNet.py:用于推理结果的验证,比对benchmark输出的分类和标签,给出Accuracy。

  • imagenet_torch_preprocess.py:数据集预处理脚本:将JPEG格式的图像转换成bin格式的文件。

  • Pnasnet5large_onnx.py:用于转换pth模型文件到onnx模型文件

  1. 获取数据集及标签

本模型使用ImageNet2012数据集中的五万张图片作为测试集。上传数据集到服务器任意目录,其中数据及标签分别存放的路径为/home/HUAWEIUSER/dataset/val与/home/HUAWEIUSER/dataset/val_label.txt.

其中val文件的内容格式为以下形式:

其中label标签的形式为:图片名称及对应的类别标签。如下图展示:

  1. 配置conda环境、安装依赖包

默认的python版本为3.7.5

下表列出来所需的依赖包:

依赖名称版本
ONNX1.9.0
Torch1.8.1
TorchVision0.9.1
numpy1.20.1
Pillow8.2.0
opencv-python4.5.2.52

安装以上依赖包可通过requirements.txt文件进行安装,安装命令格式为:pip install -r requirements.txt

  1. 获取PNAS模型

由于源代码问题,加载下载好的权重文件会报错,所以我们这边选择根据脚本自动下载权重文件。

  1. PNAS模型代码在timm里,所以首先通过以下命令安装timm:

    git clone GitHub - rwightman/pytorch-image-models: PyTorch image models, scripts, pretrained weights -- ResNet, ResNeXT, EfficientNet, EfficientNetV2, NFNet, Vision Transformer, MixNet, MobileNet-V3/V2, RegNet, DPN, CSPNet, and more

    cd pytorch-image-models

    python3.7 setup.py install

    cd ..

    ② 安装timm以后,修改timm开源代码仓代码,修改Python安装路径下的“lib/python3.7/site-packages/timm/models/pnasnet.py”文件:将其第349行改为 model_kwargs = dict(pad_type='', **kwargs)。修改成功为以下界面:

③导出onnx模型并自动获取权重

导出onnx时,会自动加载权重文件pnasnet5large-bf079911.pth。执行以下命令:

python3.7 pnasnet5large_onnx.py pnasnet5large.onnx

此时运行pnasnet5large_onnx.py脚本生成会自动生成pnasnet5large.onnx模型文件。

  1. 客户端Mindstudio

  2. 安装和配置环境

按照Mindstudio用户手册中的安装指南—>安装操作来安装Mindstudio。

推理环境在远端服务器上已经配置完成。

  1. 创建工程

    (1)按照下图标的顺序创建工程。

(2)选择Ascend App 项目

  • 填写项目名称,

  • 点击Change,选择远程服务器的CANN版本。

  • 点击Change后跳转到以下界面,然后点击“+”,添加远程服务器。

  • 添加远程服务器

    填写相关远程服务器信息后并测试,测试连接成功

  • 服务器连接成功后,选择CANN目录。

  • 点击Finish。

  • 等待本地同步远端服务器CANN文件。

  • 同步成功后,选择ACL Project(python)项目,点击完成,完成新建项目。

(3)配置项目结构

  1. 选择add python SDK

② 选择ssh interpreter

③ 添加远程服务器,点击Deploy后面的“...”进行添加

④ 远程服务器连接成功后,选择对应的python解释器

⑤ Python SDK添加成功后显示以下界面形式,test为给python解释器起的别名。

(4)配置本地文件夹与远程服务器映射

填写右侧的Mappings相关信息,点击 Apply,最后点击ok,即本地与远程服务器映射成功。最终映射结果如下图所示:

(5)获取远端服务器的相关代码

注意:由于所用的数据集太大,为了减少传输时间,我们在这里只传输相关重要文件,关于数据集在这里我们不再通过MindStudio从远程服务器获取,我们直接自己从ImageNet官网进行下载即可。

  • 1. 获取重要文件代码

  • 2. 拉取代码成功后,显示如下界面内容:

  • 3. 数据集获取

  1. 远程服务器获取

    在远程服务器的/opt/npu/imageNet的路径下存储有相关数据集和标签文件,所以在这里通过以下命令传输到远程服务器的文件中:

  2. 数据集:

    cp -r /opt/npu/imageNet/val /home/NEU_ZC/pnasnet5large/

  3. 标签:

    cp -r /opt/npu/imageNet/val_label.txt /home/NEU_ZC/pnasnet5large/

    此时远程服务器的文件目录为:

  4. 本地文件

    我们需要自己去官网下载数据集到本地文件中。

    本地目录为以下形式:

3. 运行项目

1. 数据预处理

①数据预处理将原始数据集转换为模型输入的数据,使用imagenet_torch_preprocess.py,将JPEG图像格式的数据转换为bin文件。

第一个参数./val为原始数据验证集(.jpeg)所在路径,第二个参数./pre_dataset为输出的二进制文件(.bin)所在路径。每个图像对应生成一个二进制文件。

但是,运行此脚本文件的时候会报错,报错的原因是因为未找到在远程服务器我所设置的conda虚拟环境,具体的报错信息如下图所示:

对应的远程服务器运行此脚本所显示的内容如下图所示:

在MindStudio中,我所设置的python解释器如下图所示:

从以上三张图中可以看出问题就在于未正确找到conda环境。

所以在这里用远程终端进行数据预处理:

在远程终端输入以下命令运行脚本文件:

运行结束后,在远程终端文件夹下会生成pre_dataset文件夹如下图所示,用来存放生成的bin文件。

② 生成JPEG图片输入info文件,使用benchmark推理需要输入图片数据集的info文件,用于获取数据集。使用gen_info.py脚本,输入已经获得的图片文件,输出生成图片数据集的info文件。

第一个参数为模型输入的类型,第二个参数为生成的bin文件路径,第三个为输出的info文件,第四、第五个为宽高信息。

由于生成的bin文件过大,从远程服务器获取的话需要较少时间,所以我们继续利用远程服务器进行此次数据的处理步骤:

脚本运行结束后,会在远程服务器生成imagenet_prep_bin.info文件

将生成的imagenet_prep_bin.info文件通过Xftp获取到本地文件夹中,以便后续处理。

  • 运行pnasnet5large_onnx.py文件导出为onnx文件

转换成功后,会在左侧生成pnasnet5large.onnx文件

  • 简化模型:需要通过连接的服务器进行简化,简化成功后显示Finish!

  1. 开启SSH session

2. 打开远程终端服务器的文件地址和激活环境,进行模型的简化

3. 从远程终端获取简化后的模型

  • onnx 转om:使用ATC工具进行模型的转换,其中分为两步:

  1. 首先配置环境变量:需要通过服务器上进行

  1. 利用ATC开始进行转换,点击Ascend-->Model Conveter开始转换

  • 点击Mobile File后面的文件夹图标,选择要转换的模型

  • 选择要转换的模型成功后,点击ok,会显示模型正在自动解析

  • 模型解析成功后出现如下界面,接着点击Next

  • 点击next后,会出现以下界面,最后点击Finish,即模型转换成功。

  • 模型转换成功后在output中会显如下内容

  • 转换om模型成功后,使用mindstudio remote终端执行benchmark推理

启动ssh session,切换conda环境、工作目录

  • 使用Benchmark工具进行推理,配置bemchmark工具需要的环境

  • 执行benchmark命令

推理结果完成以后显示以下内容:

推理完成后,结果会自动保存在远程服务器的文件目录下的result/dumpOutput_device0/文件夹下面。所以在我们进行精度验证前需要先把推理结果同步到本地上。下图就展示了同步完成的结果:

  • 最后调用vision_metric_ImageNet.py脚本推理结果与label比对,可以获得Accuracy Top5数据,结果保存在result_bs1.json中。

其中第一个参数为生成推理结果所在路径,第二个参数为标签数据,第三个参数为生成结果文件路径,第四个参数为生成结果文件名称。

  • 精度验证结果显示

  • 310执行完毕,经该模型迁移至710,将上述流程在Ascend710上可按照以上步骤再执行一遍。

四 Q&A

问题1. 在进行数据预处理的时候找不到远程服务器配置的conda环境,导致运行报错

解决方案:

利用Remote Terminal 运行数据预处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值