从零教你使用 MindStudio 进行 Pytorch 离线推理全流程
![从零教你使用MindStudio进行Pytorch离线推理全流程](https://static001.geekbang.org/infoq/fd/fd887e5bb2e14e620e70c4bcd63f6174.jpeg)
本文分享自华为云社区《使用MindStudio进行Pytorch离线推理全流程》,作者:yd_281378454。
1 MindStudio 环境搭建
本次实验在 MindStudio 上进行,请先按照教程 配置环境,安装 MindStudio。
MindStudio 的是一套基于华为自研昇腾 AI 处理器开发的 AI 全栈开发工具平台,该 IDE 上功能很多,涵盖面广,可以进行包括网络模型训练、移植、应用开发、推理运行及自定义算子开发等多种任务。MindStudio 除了具有工程管理、编译、调试、运行等一般普通功能外,还能进行性能分析,算子比对,可以有效提高工作人员的开发效率。除此之外,MindStudio 具有远端环境,运行任务在远端实现,对于近端的个人设备的要求不高,用户交互体验很好,可以让我们随时随地进行使用。
2 VPN 安装和配置
安装好 MindStudio 后,需要配置远程环境。请按照教程 进行 VPN 客户端的安装与配置。安装好 VPN 后,可以先在终端用 ssh 指令测试连接。(这一步是验证网络连接是否可用,也可以跳过)
![](https://static001.geekbang.org/infoq/0c/0c97717c49c92417b3d14f56703ffe19.png)
3 创建推理工程
打开 MindStudio,点击 New Project,进入新建工程界面。选择 Ascend APP。填入项目名 spnasnet_100。首次新建训练工程时,需要配置 CANN 的版本。点击 Change。
![](https://static001.geekbang.org/infoq/d3/d32878f82ad89771fafaf4c53d17686c.png)
点击 + 配置远程连接,然后根据选项填入自己服务器的 ip 地址、端口号、用户名和密码等。
![](https://static001.geekbang.org/infoq/aa/aa0e8e0779f338abaf3dda585e4e90db.png)
![](https://static001.geekbang.org/infoq/47/4739b5d852c6fb13ecf93286bb4f4eb0.png)
配置 Remote CANN location。该参数需要填入 ascend-toolkit 在服务器上的路径地址。在这里,我们 toolkit 的路径如下:/usr/local/Ascend/ascend-toolkit/5.1.RC1。点击 finishing 进行配置。初次配置时时间稍长,请耐心等待。
![](https://static001.geekbang.org/infoq/e8/e8d7ffaada6412287f2aff6bfd54c07e.png)
点击 Next,选择 Pytorch Project。
![](https://static001.geekbang.org/infoq/08/08b49e51d71acaaca9a7c770c2ae610c.png)
点击 Finish,完成工程创建,进入工程主界面。
4 配置 SSH 和 Deployment
在 MindStudio 的远程服务中,定义了 SSH 配置和 Deployment 两个概念。前者 SSH 配置类似 MobaxTerm 中的 Session 的概念,用户可以保存多个远程服务器的连接配置。后者 Deployment 管理远程开发时的本地文件与远程文件的同步。配置好 Deployment 后,我们就可以像使用本地 python 环境一样去使用远程的 python 环境了。点击 File -> Settings -> Tools,即可看到两个设置的入口,下面分别介绍如何配置他们。
![](https://static001.geekbang.org/infoq/44/44b7a0d2faf5d2acce350f6be7fc6107.png)
4.1 配置 SSH
首先点击 SSH Configurations,再点击 + 配置远程连接,然后根据选项填入自己服务器的 ip 地址、端口号、用户名和密码等。测试成功点击 Apply 即可保存配置,以后就可以一键连接啦!
![](https://static001.geekbang.org/infoq/1b/1b909e154b6204a8f1689b0824966064.png)
4.2 配置 Deployment
Deployment 配置能够更精准地连接远程服务,它需要选择一个 SSH 连接定位远程主机,然后设置本地与远程项目目录的对应关系。如下图所示创建一个新的 Deployment。
![](https://static001.geekbang.org/infoq/f5/f53c41edefaf4c017eb7bc4ac4455580.png)
如图 310 是我创建的 Deployment 名字,首先选择连接哪一个 SSH 服务,然后测试连接是否可用。
![](https://static001.geekbang.org/infoq/0f/0f18f16a265dd8b24510b652719e246a.png)
下一步,设置项目目录映射关系,点击 Mappings,然后选择本地的项目目录和远程的项目目录(最好是提前创建好文件夹),接下来跑代码的时候 MindStudio 会保证这两个目录文件的同步。
![](https://static001.geekbang.org/infoq/9c/9c4a6af97af8aecd6e78c2f9aecc2f4c.png)
配置好 Mappings 后,建议配置 Excluded Paths,因为 MindStudio 的默认同步行为会把 Mappings 对应目录的文件保持完全相同,这意味着只存在于远程的数据集文件夹会被删除(如果本地没有数据集)。在此我配置了几个需要排除的文件夹目录。
![](https://static001.geekbang.org/infoq/dc/dcfcd4d69ad4c48e6f4a86120c80457e.png)
5 配置远程 python 解释器
现在,SSH 和 Deployment 的映射关系已经配置好了,但是 MindStudio 还不知道 python 解释器的位置。因此,下面将介绍如何配置 python 解释器。
点击 File -> Project Structure->SDKs 可以看到如图所示的界面。点击+号,可以新增 python SDK 和 JDK。这里只演示 Python 的添加方法。
![](https://static001.geekbang.org/infoq/75/75635169a0447e1d3821403df5972539.png)
点击 Add Python SDK 后,将弹出下图所示的界面,点击左侧的 SSH Interpreter,如下图所示,首先选择使用哪一个 Deployment,这是刚刚我们配置过的。然后选择 python 解释器的路径。图中的路径是 MindStudio 自动检测出来的,但一般需要自己找自己的 Python 环境安装目录。如果是 conda 环境,可以使用 which python 找到 python 的安装路径。
![](https://static001.geekbang.org/infoq/5e/5e063521601ae82ecc1d0f503962799e.png)
![](https://static001.geekbang.org/infoq/a6/a674869189f9bcd54ba9d065871e6dfd.png)
然后点击 Project,选择刚才添加到 MindStudio 中的 python 解释器,将其作为本项目使用的解释器。
![](https://static001.geekbang.org/infoq/26/267b064ea7e4ed351fe80519af35541d.png)
6 数据集准备
6.1 数据预处理
上传好数据集以后,执行 preprocess_spnasnet_100_pytorch.py 脚本,生成数据集预处理后的 bin 文件。
![](https://static001.geekbang.org/infoq/ff/ffd9098d44b3456234b0bd80ad3fcb85.png)
第一个参数为原始数据验证集(.jpeg)所在路径,第二个参数为输出的二进制文件(.bin)所在路径。每个图像对应生成一个二进制文件。
MindStudio 会首先上传本地文件到远程服务器,将本地的文件同步到远程这个过程可能很慢,同步完成后开始运行 Python 代码,MindStudio 会实时地在控制台打印输出:
![](https://static001.geekbang.org/infoq/12/120e073faef9e90b8152dce38a5e1ec0.png)
6.2 生成数据集 info 文件
执行 get_info.py 脚本,生成数据集信息文件。
![](https://static001.geekbang.org/infoq/b6/b6997fa4ed4fa1dbe1b9a8a97aa93e09.png)
第一个参数为模型输入的类型,第二个参数为生成的 bin 文件路径,第三个为输出的 info 文件,第四、第五个为宽高信息。执行结果:
![](https://static001.geekbang.org/infoq/25/25dfc48d2c74b7bd82a4b2f4591bd12a.png)
7 模型转换
本模型基于开源框架 PyTorch 训练的 spnasnet_100 进行模型转换。先使用 PyTorch 将模型权重文件.pth 转换为.onnx 文件,再使用 ATC 工具将.onnx 文件转为离线推理模型文件.om 文件。
首先获取权重文件。单击Link 在 PyTorch 开源框架获中取经过训练的 spnasnet_100 权重文件 model_best.pth.tar,源码中已提供下载权重文件。
7.1 导出 onnx 文件
使用 pthtar2onnx.py 脚本将.pth 文件转换为.onnx 文件
![](https://static001.geekbang.org/infoq/3e/3e7e36cda7523cd3b60b3ec30ef77f3e.png)
![](https://static001.geekbang.org/infoq/67/670b94545942b844e6c753f8fb0b1f9b.png)
7.2 导出 om 文件
从 onnx 转为 om 需要用 atc 工具,MindStudio 提供了 atc 工具的窗口化应用,它会根据用户选择自动生成 atc 指令。Model Converter 的入口如图所示:
![](https://static001.geekbang.org/infoq/75/7591026fe8b866b89a20a43691b485b6.png)
选择 onnx 模型路径,模型输出名称,目标设备,输入格式和 batchsize 等信息。
![](https://static001.geekbang.org/infoq/f4/f442f481f0427d64f0896cf55d56a36d.png)
MindStudio 自动生成如下 atc 指令,用户可以在此做最后的校验,点击 Finish 即可开始进行模型转换。
![](https://static001.geekbang.org/infoq/cb/cb48287315b51026842311c699e61bde.png)
模型转换成功:
![](https://static001.geekbang.org/infoq/b8/b816c75a69bc805418d7cad5daeee869.png)
8 模型推理
使用 benchmark 工具进行推理。这个和前面的 python 脚本不同,它在 MindStudio 中属于 ACL 应用,可以如图所示创建应用:
点击 + 号,再点击 Ascend App:
![](https://static001.geekbang.org/infoq/ed/edadb56883f76ad12acd1233a8d09539.png)
然后进行如下配置:
![](https://static001.geekbang.org/infoq/7f/7ffab9279733d7ddb8a07cfe14ca4b08.png)
参数详情请参见《CANN推理benchmark工具用户指南》 。推理后的输出默认在当前目录 result 下。
执行结果:
![](https://static001.geekbang.org/infoq/52/52646a19efe8e8b75391e39951459090.png)
运行出错:error while loading shared libraries: libascendcl.so: cannot open shared object file: No such file or directory.
这个错误是因为没有配置好环境变量。因为我们在终端运行它时,一般要先执行一下:source /usr/local/Ascend/ascend-toolkit/set_env.sh,这一步操作在 MindStudio 中可以通过如图所示的方法配置环境变量解决:
![](https://static001.geekbang.org/infoq/a7/a77516e4c34b7da549fd02d1078fdc52.png)
变量内容就是/usr/local/Ascend/ascend-toolkit/set_env.sh 的内容,读者可以直接复制使用。
LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/lib64:/usr/local/Ascend/ascend-toolkit/latest/lib64/plugin/opskernel:/usr/local/Ascend/ascend-toolkit/latest/lib64/plugin/nnengine:$LD_LIBRARY_PATH;PYTHONPATH=/usr/local/Ascend/ascend-toolkit/latest/python/site-packages:/usr/local/Ascend/ascend-toolkit/latest/opp/op_impl/built-in/ai_core/tbe:$PYTHONPATH;PATH=/usr/local/Ascend/ascend-toolkit/latest/bin:/usr/local/Ascend/ascend-toolkit/latest/compiler/ccec_compiler/bin:$PATH;ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest;ASCEND_OPP_PATH=/usr/local/Ascend/ascend-toolkit/latest/opp;TOOLCHAIN_HOME=/usr/local/Ascend/ascend-toolkit/latest/toolkit;ASCEND_HOME_PATH=/usr/local/Ascend/ascend-toolkit/latest
设置变量后,再次启动运行,可以在控制台看到,在执行 benchmark 前,会首先 export 环境变量。
![](https://static001.geekbang.org/infoq/02/02bea5757ea945e09bd771c006b3f2c3.png)
修改后代码运行成功:
![](https://static001.geekbang.org/infoq/e7/e7f3ffdcb42e84e21776fe89fcb7906d.png)
可以获得 batch16 310 单卡吞吐率为 1379.94×4 = 5519.76 fps
![](https://static001.geekbang.org/infoq/e4/e4895ed551a16cccc6f1dd355e91e61e.png)
9 精度验证
调用 vision_metric_ImageNet.py 脚本与数据集标签 val_label.txt 比对,可以获得 Accuracy Top5 数据,结果保存在 result.json 中。
![](https://static001.geekbang.org/infoq/79/79d954d3175b8bc3057b63f16d44dd1b.png)
第一个参数为生成推理结果所在路径,第二个参数为标签数据,第三个参数为生成结果文件路径,第四个参数为生成结果文件名称。
获得精度数据如下:310 Top1 accuracy 为 74.2%,Top5 accuracy 为 91.94%。
![](https://static001.geekbang.org/infoq/59/59abb6388695c949eca48518178191d0.png)
![](https://static001.geekbang.org/infoq/0e/0e0b39e741ee462621162d529ffa022b.png)
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/983b76f09ed7384d80dde3746】。文章转载请联系作者。
评论