本次实验在MindStudio上进行,请先按照教程配置环境,安装MindStudio。
MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,其功能涵盖面广,可以进行网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。MindStudio除了具有工程管理、编译、调试、运行等一般普通功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。 除此以上官方的说明文档之外,我个人觉得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:
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后跳转到以下界面,然后点击“+”,添加远程服务器。
-
添加远程服务器
填写相关远程服务器信息后并测试,测试连接成功
-
服务器连接成功后,选择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
2. 打开远程终端服务器的文件地址和激活环境,进行模型的简化
3. 从远程终端获取简化后的模型
-
onnx 转om:使用ATC工具进行模型的转换,其中分为两步:
-
首先配置环境变量:需要通过服务器上进行
-
利用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 运行数据预处理