xmind折叠收起功能(使用MindStudio进行PNAS模型ONNX推理)
xmind折叠收起功能(使用MindStudio进行PNAS模型ONNX推理)默认的python版本为3.7.5。其中label标签的形式为:图片名称及对应的类别标签。如下图展示:现在对主要用到的一些相关文件进行说明:本模型使用ImageNet2012数据集中的五万张图片作为测试集。上传数据集到服务器任意目录,其中数据及标签分别存放的路径为/home/HUAWEIUSER/dataset/val与/home/HUAWEIUSER/dataset/val_label.txt.其中val文件的内容格式为以下形式:
本次实验在MindStudio上进行,请先按照教程配置环境 安装MindStudio。
MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,其功能涵盖面广,可以进行网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。除此以外,我个人觉得MindStudio给用户提供了一个简单方便快捷的使用工具,能够让我们能够很顺畅的进行代码的开发、运行和调试。如其可以和远端服务器进行连接,在MindStudio上对代码进行修改可以很方便的同步到远程服务器上,不需要再借助xftp软件进行文件的传输;关于远端服务器上的代码运行也不需要再借助xshell等软件,可以很方便的通过MindStudio自带的工具进行。MindStudio将文件传输和运行代码集中在一起,在一定程度上提高了我们开发代码的效率。
- 概述
PNAS是一种学习卷积神经网络(CNN)结构的方法,该方法比现有的基于强化学习和进化算法的技术更有效。使用了基于序列模型的优化(SMBO)策略,在这种策略中,按照增加的复杂性对结构进行搜索,同时学习代理模型(surrogate model)来引导在结构空间中的搜索。这种方法类似于 A* 算法(也被称为分支限界法),其中从简单到复杂搜索模型空间,并在前进过程中剪枝处理掉没有前途的模型。这些模型(单元)按照它们所包含的模块的数量进行排序。从考量带有一个模块的单元开始。评估这些单元(通过训练它们并在一个验证集上计算它们的损失),然后使用观察得到的奖励来训练一个基于 RNN 的启发式函数(也被称为代理函数),其可以预测任何模型的奖励。接着可以使用这个学习到的启发式函数来决定应该评估哪些带有 2 个模块的单元。在对它们进行了评估之后,再对这个启发式函数进行更新,重复这一过程,直到我们找到带有所想要的模块数量的优良单元。
- 服务器端推理环境准备
- 获取Pytorch框架下的PNAS推理项目源代码
该推理项目源代码通过华为方提供的网页链接进行下载,下载到本地电脑之后会得到一个ATC PNASNet5Large(FP16) from Pytorch - Ascend310.zip的压缩包,然后将压缩包通过xftp软件传输到服务器上面并进行解压操作。
- 解压完之后,会形成当前的目录结构
现在对主要用到的一些相关文件进行说明:
- 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模型文件
- 获取数据集及标签
本模型使用ImageNet2012数据集中的五万张图片作为测试集。上传数据集到服务器任意目录,其中数据及标签分别存放的路径为/home/HUAWEIUSER/dataset/val与/home/HUAWEIUSER/dataset/val_label.txt.
其中val文件的内容格式为以下形式:
其中label标签的形式为:图片名称及对应的类别标签。如下图展示:
- 配置conda环境、安装依赖包
默认的python版本为3.7.5。
下表列出来所需的依赖包:
依赖名称 |
版本 |
ONNX |
1.9.0 |
Torch |
1.8.1 |
TorchVision |
0.9.1 |
numpy |
1.20.1 |
Pillow |
8.2.0 |
opencv-python |
4.5.2.52 |
安装以上依赖包可通过requirements.txt文件进行安装 安装命令格式为:pip install -r requirements.txt
- 获取PNAS模型
由于源代码问题,加载下载好的权重文件会报错,所以我们这边选择根据脚本自动下载权重文件。
- PNAS模型代码在timm里,所以首先通过以下命令安装timm:
git clone https://github.com/rwightman/pytorch-image-models
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模型文件。
- 客户端Mindstudio
- 安装和配置环境
按照Mindstudio用户手册中的安装指南—>安装操作来安装Mindstudio。
推理环境在远端服务器上已经配置完成。
- 创建工程
(1)按照下图标的顺序创建工程。
(2)选择Ascend App 项目
- 填写项目名称,
- 点击Change 选择远程服务器的CANN版本。
- 点击Change后跳转到以下界面,然后点击“ ”,添加远程服务器。
在Remote Connection 中填写账号名称和相应的IP地址。
- 添加远程服务器
填写相关远程服务器信息后并测试,测试连接成功
- 服务器连接成功后,选择CANN目录。
- 点击Finish。
- 等待本地同步远端服务器CANN文件。
- 同步成功后,选择ACL Project(python)项目,点击完成,完成新建项目。
(3)配置项目结构
- 选择add python SDK
② 选择ssh interpreter
③ 添加远程服务器,点击Deploy后面的“...”进行添加
④ 远程服务器连接成功后,选择对应的python解释器
⑤ Python SDK添加成功后显示以下界面形式,test为给python解释器起的别名。
(4)配置本地文件夹与远程服务器映射
填写右侧的Mappings相关信息,点击 Apply,最后点击ok,即本地与远程服务器映射成功。最终映射结果如下图所示:
(5)获取远端服务器的相关代码
注意:由于所用的数据集太大,为了减少传输时间,我们在这里只传输相关重要文件,关于数据集在这里我们不再通过MindStudio从远程服务器获取,我们直接自己从ImageNet官网进行下载即可。
- 1. 获取重要文件代码
- 2. 拉取代码成功后,显示如下界面内容:
- 3. 数据集获取
- 远程服务器获取
在远程服务器的/opt/npu/imageNet的路径下存储有相关数据集和标签文件,所以在这里通过以下命令传输到远程服务器的文件中:
- 数据集:
cp -r /opt/npu/imageNet/val /home/NEU_ZC/pnasnet5large/
- 标签:
cp -r /opt/npu/imageNet/val_label.txt /home/NEU_ZC/pnasnet5large/
此时远程服务器的文件目录为:
- 本地文件
我们需要自己去官网下载数据集到本地文件中。
本地目录为以下形式:
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!
- 开启ssh session
- 打开远程终端服务器的文件地址和激活环境,进行模型的简化
- 从远程终端获取简化后的模型
- onnx 转om:使用ATC工具进行模型的转换,其中分为两步:
- 首先配置环境变量:需要通过服务器上进行
- 利用ATC开始进行转换,点击Ascend-->Model Conveter开始转换
- 点击Mobile File后面的文件夹图标,选择要转换的模型
- 选择要转换的模型成功后,点击ok,会显示模型正在自动解析
- 模型解析成功后出现如下界面,接着点击Next
- 点击next后,会出现以下界面,最后点击Finish,即模型转换成功。
- 模型转换成功后在output中会显如下内容
- 转换om模型成功后,使用mindstudio remote终端执行benchmark推理
启动ssh session,切换conda环境、工作目录
- 使用Benchmark工具进行推理,配置benchmark工具需要的环境
- 执行benchmark命令
推理结果完成以后显示以下内容:
推理完成后,结果会自动保存在远程服务器的文件目录下的result/dumpOutput_device0/文件夹下面。所以在我们进行精度验证前需要先把推理结果同步到本地上。下图就展示了同步完成的结果:
- 最后调用vision_metric_ImageNet.py脚本推理结果与label比对,可以获得Accuracy Top5数据,结果保存在result_bs1.json中。
其中第一个参数为生成推理结果所在路径,第二个参数为标签数据,第三个参数为生成结果文件路径,第四个参数为生成结果文件名称。
- 精度验证结果显示
- 310执行完毕,经该模型迁移至710,将上述流程在Ascend710上可按照以上步骤再执行一遍。
四 Q&A
问题1. 在进行数据预处理的时候找不到远程服务器配置的conda环境,导致运行报错
解决方案:
利用Remote Terminal 运行数据预处理