推理实践丨如何使用 MindStudio 进行 Pytorch 模型离线推理
![推理实践丨如何使用MindStudio进行Pytorch模型离线推理](https://static001.geekbang.org/infoq/74/74e116b948835e0e30ec89e74ea47347.jpeg)
本文分享自华为云社区《使用MindStudio进行Pytorch模型离线推理》,作者: 袁一博。
本教程所示例的任务是 Ascend Pytorch 离线推理,即对给定的已经训练好的模型参数和推理脚本,在 Ascend 310/710 和 Tesla 设备上进行推理应用。具体来说,本教程推理的模型是 RegNetY-1.6GF,即论文《Designing Network Design Spaces》提出的一个模型。RegNetY-1.6GF 是使用网络结构搜索(NAS)技术对搜索空间进行搜索得到的模型。该模型解决的任务是图像分类任务,训练和测试数据集是 ImageNet1k 数据集。本案例将在 ImageNet1k 的测试集上实现推理流程。在执行该任务之前,给定的模型和脚本文件如下:
![](https://static001.geekbang.org/infoq/d4/d4adcd958b83f40a3f0a523ace4e5e47.png)
关于该任务具体流程和要求可参考官方推理指导文档:Ascend-PyTorch离线推理指导/PyTorch离线推理-离线推理指导.md。
本教程更侧重于使用 MindStudio 完成该项任务,而不是该任务的详细步骤,因此会详细介绍 MindStudio 的环境配置、脚本运行以及可能遇到的难题,所以对其他使用 MindStudio 进行推理应用程序开发的同学也会有一定的参考价值。
MindStudio 环境搭建
昇腾深度学习生态包括算子开发,MindSpore 模型训练,模型推理,MindX 和 ACL 应用开发等组件。从算子开发到应用开发,组件功能覆盖范围较广,涉及的编程语言也不只一种,而市场上并没有一个通用的开发环境软件,因此 MindStudio 应运而生。MindStudio 提供了一站式 AI 开发环境,支持 Python,Java 和 C 语言的开发,并提供了众多性能调优工具,应用开发中提供了插件化扩展机制,打造了高效、便捷的全流程开发工具链。有了 MindStudio 基本上可以做到完全脱离命令行界面。
安装 MindStudio + Ascend-cann-toolkit
本案例中使用的环境为:本地 Ubuntu18.04 安装的 MindStudio5.0.RC1 + Ascend-cann-toolkit5.0.2 + 远程昇腾 AI 运行环境。
MindStudio 和 Ascend-cann-toolkit 可参考官方安装指南:
https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg ,安装过程中请注意依赖版本和 pip 源,没有太多坑。
也可参考华为云社区提供的安装教程:https://support.huaweicloud.com/usermanual-mindstudioc73/atlasmindstudio_02_0008.html
或参考第三方教程:https://zhuanlan.zhihu.com/p/388116455。
配置 SSH 和部署
在 MindStudio 的远程服务中,定义了 SSH 配置和 Deployment 两个概念。前者 SSH 配置类似 MobaxTerm 中的 Session 的概念,用户可以保存多个远程服务器的连接配置。后者 Deployment 管理远程开发时的本地文件与远程文件的同步。配置好 Deployment 后,我们就可以像使用本地 python 环境一样去使用远程的 python 环境了。
点击 File -> Settings -> Tools,即可看到两个设置的入口,下面分别介绍如何配置他们。
![](https://static001.geekbang.org/infoq/9b/9beb743a5a5654b583867d8ca8293dea.png)
首先配置 SSH。1.点击 SSH Configurations;2.点击+,新增一个 SSH 连接;3 输入主机 IP 地址和端口号;4 输入登陆用户名;5 输入密码;6 点击测试连接。
测试成功点击 Apply 即可保存配置,以后就可以一键连接啦!如图红色方框中是我的三个远程 SSH 连接。
![](https://static001.geekbang.org/infoq/f8/f8dcfc151ab792b08254373b4dda2c87.png)
Deployment 配置实际上是更精准地连接远程服务,它需要选择一个 SSH 连接定位远程主机,然后设置本地与远程项目目录的对应关系。如下图所示创建一个新的 Deployment.
![](https://static001.geekbang.org/infoq/53/533008a15f26cabe081ba9bace3ed173.png)
如图 test 是我新创建的 Deployment 名字,首先选择连接哪一个 SSH 服务,然后测试连接是否可用。
![](https://static001.geekbang.org/infoq/20/2058d4a347500369e01032f0f1a5762e.png)
下一步,设置项目目录映射关系,点击 Mappings,然后选择本地的项目目录和远程的项目目录(最好提前创建好文件夹),接下来跑代码的时候 MindStudio 会保证这两个目录文件的同步。
![](https://static001.geekbang.org/infoq/77/7756eb55d321eca1e8b48d52d87f3add.png)
配置好 Mappings 后,强烈建议配置排除路径,即配置 Excluded Paths,因为 MindStudio 的默认同步行为会把 Mappings 对应目录的文件保持完全相同,这意味着只存在于远程的数据集文件夹会被删除(如果本地没有数据集)。在此我配置了几个需要排除的文件夹目录。
![](https://static001.geekbang.org/infoq/0b/0b5e7d3bb93bd53b34abbaa32778db1e.png)
注:这是 MindStudio 比较坑的地方,我第一次运行脚本后在远程生成了 test.onnx 文件,这个文件并没有 download 到本地,而我再次运行脚本的时候,MindStudio 的同步机制会把 test.onnx 删除掉,因为我本地没有这个文件....对于这个缺陷,建议把 Deployment 目录与数据及生成的中间文件隔离开。
配置远程 python 解释器
现在,SSH 和 Deployment 的映射关系已经配置好了,但是 MindStudio 还不知道调用哪个程序执行代码,具体来说就是还不知道 python 解释器的位置。因此,下面将介绍如何配置 python 解释器。
点击 File -> Project Structure->SDKs 可以看到如图所示的界面。点击+号,可以新增 python SDK 和 JDK。这里只演示 Python 的添加方法。
![](https://static001.geekbang.org/infoq/fa/fa42329d94d5b3a24570ee8a09720790.png)
点击 Add Python SDK 后,将弹出下图所示的界面,注意,这里不只是添加远程 python 环境,本地的虚拟环境和 conda 环境也是在这里配置添加的。
此时我们需要连接远程环境,点击左侧的 SSH Interpreter,如下图所示,首先选择使用哪一个 Deployment,这是刚刚我们配置过的。然后选择 python 解释器的路径。图中的路径是 MindStudio 自动检测出来的,但一般需要自己找自己的 Python 环境安装目录。如果是 conda 环境,可以使用 whereis conda 找到 conda 的安装路径。
![](https://static001.geekbang.org/infoq/44/443c447eb5e9cf810bc319a797af9aa2.png)
![](https://static001.geekbang.org/infoq/96/961bdeccfd577146f2fd7b9a4df226b3.png)
![](https://static001.geekbang.org/infoq/68/6862e71fffc84bb9beee0c3709b09b41.png)
然后点击 Project,选择刚才添加到 MindStudio 中的 python 解释器,将其作为本项目使用的解释器。
![](https://static001.geekbang.org/infoq/46/46aac2b416f97df3d0dc337a5a29af22.png)
图中显示的是所有我添加的 python 解释器,这里有两个名字一模一样的解释器无法区分,对于这种情况,可以点击 SDKs 在 SDK 管理界面自定义每个 python 解释器的名字。
这个时候 python 解释器就配置好了,在 Run Configurations 界面选择配置好的解释器即可。
![](https://static001.geekbang.org/infoq/45/45e5b85dcd5bb04f3240601e5594204d.png)
执行推理过程
推理过程可分为以下步骤:
1.数据预处理。
2.模型转换:先将 pth 模型转化为 onnx 模型,再将 onnx 模型转化为 om 模型。
3.执行推理:使用 benchmark 进行推理。
4.精度验证:将推理结果和标签比对,计算准确率。
![](https://static001.geekbang.org/infoq/80/80ec30c713e2eccaf798cf102b8510eb.png)
数据预处理
上传好数据集后,运行编写好的 imagenet_torch_preprocess.py 脚本进行数据预处理。
![](https://static001.geekbang.org/infoq/b9/b9c3554a6366eece79cf887863f0991b.png)
MindStudio 会首先上传本地文件到远程服务器,将本地的文件同步到远程这个过程可能很慢,同步完成后开始运行 Python 代码,MindStudio 会实时地在控制台打印输出:
![](https://static001.geekbang.org/infoq/54/542e555f705878b8c21cde689c6a11c5.png)
生成数据集 info 文件,执行 get_info.py,同上配置好脚本参数和远程解释器即可。
![](https://static001.geekbang.org/infoq/f1/f1df4010bd7b8f6fd18d5421c4b3bea0.png)
模型转换
在本案例中,模型转化包括两个步骤:
1、由.pth 转为.onnx
2、由.onnx 转为.om
pth 转 onnx 是使用 pytorch 实现的。执行编写好的 python 脚本即可。远程运行 python 脚本之前 MindStudio 会进行同步操作,将本地的文件同步到远程,这个过程可能很慢。
![](https://static001.geekbang.org/infoq/d0/d07f78ddc5cff7cb7c856c74def23c82.png)
从 onnx 转为 om 需要用 atc 工具,MindStudio 提供了 atc 工具的窗口化应用,它会根据用户选择自动生成 atc 指令。Model Converter 的入口如图所示,或点击 Ascend->Model Converter:
![](https://static001.geekbang.org/infoq/60/606ec1146510243734fde78a04fc2c42.png)
选择 onnx 模型路径,模型输出名称,目标设备,输入格式和 batchsize 等信息。
![](https://static001.geekbang.org/infoq/ef/efb94936314edeb3d40f2b42b2d8e046.png)
MindStudio 自动生成如下 atc 指令,用户可以在此做最后的校验,点击 Finish 即可开始进行模型转换。
![](https://static001.geekbang.org/infoq/74/749e877ca343a3c4754204c3661102cd.png)
![](https://static001.geekbang.org/infoq/ee/ee2bf173f99a6481b1c504196b32ed9b.png)
模型推理
使用 benchmark 工具进行推理。
这个和前面的 python 脚本不同,它在 MindStudio 中属于 ACL 应用,可以如图所示创建应用:
![](https://static001.geekbang.org/infoq/cd/cdbe768a25e812c21e7f609aad2de607.png)
然后进行如下配置:
![](https://static001.geekbang.org/infoq/27/274856d51c2d0ba483d6a9aa98d20eb5.png)
![](https://static001.geekbang.org/infoq/2a/2a5e93a0113c9318d9c3e6f13610bff7.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/b6/b6848d22fb6654ba87f205637353b87b.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/8d/8dfd9c1ed58772f2c243bac488ed06dc.png)
修改后代码运行成功:
![](https://static001.geekbang.org/infoq/2a/2a0ad7b2c76aa855e2cdc71fe78ce5ea.png)
精度验证
执行 vision_metric_ImageNet.py 脚本。
![](https://static001.geekbang.org/infoq/de/de375037810fa167a61ba6f874d1c1a9.png)
![](https://static001.geekbang.org/infoq/cc/cca2ef1d5462914add62938e136d7fad.png)
FAQ
配置好 Run Configuration 启动执行后,很长时间终端无响应
在启动一个远程程序之前,MindStudio 会首先将本地目录到远程目录进行同步,如果本地目录内容与远程差异较大,比如 pth 模型文件和数据集,同步到远程这个过程将会很慢。
可以在 File Tranfer 界面观察 MindStudio 正在进行哪些同步行为。
![](https://static001.geekbang.org/infoq/b5/b573bf30454e23840eeb80d2aa7f150c.png)
如果这里出现 Delete 操作,说明存在一些远程存在但本地没有的文件或文件夹,这时候 MindStudio 将会把远程的文件删除以达到同步。这种情况比较危险,应尽量避免,可以通过设置同步时的排除路径解决,如下图所示,我设置了 prep_dataset 和 ILAVRC2012_img_val 文件夹为排除路径,这样即使我本地目录没有这两个文件夹,同步过程中也不会被 MindStudio 删除了。
![](https://static001.geekbang.org/infoq/0b/0b5e7d3bb93bd53b34abbaa32778db1e.png)
远程执行控制台报错:error while loading shared libraries: libascendcl.so: cannot open shared object file: No such file or directory
这个错误是因为没有配置好环境变量。我们在执行非 Python 程序的时候,需要先设置环境变量,在命令行通常是执行设置好的环境变量脚本进行设置,但在远程控制的情况下,默认是直接执行对应的程序,不会预先执行某个 shell 脚本,因此缺少了环境变量的配置这一步骤。
![](https://static001.geekbang.org/infoq/2a/2a5e93a0113c9318d9c3e6f13610bff7.png)
解决方案: Run Configuration 虽然不能指定运行某个 shell 脚本,但可以带上环境变量,如图所示,只需把 shell 脚本里的环境变量写到 Environment Variables 中即可实现相同的作用。
![](https://static001.geekbang.org/infoq/b6/b6848d22fb6654ba87f205637353b87b.png)
MindStudio 导入应用工程后,提示“No Python interpreter configure for the module”
这篇教程有详细的解决方案:https://bbs.huaweicloud.com/forum/thread-187863-1-1.html
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/64ae9c3a47efd2cb27ae2030f】。文章转载请联系作者。
评论