推理实践丨如何使用MindStudio进行Pytorch模型离线推理

Posted 华为云开发者联盟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推理实践丨如何使用MindStudio进行Pytorch模型离线推理相关的知识,希望对你有一定的参考价值。

摘要:本教程所示例的任务是Ascend Pytorch离线推理,即对给定的已经训练好的模型参数和推理脚本,在Ascend 310/710和Tesla设备上进行推理应用。

本文分享自华为云社区《​​使用MindStudio进行Pytorch模型离线推理​​》,作者: 袁一博。

本教程所示例的任务是Ascend Pytorch离线推理,即对给定的已经训练好的模型参数和推理脚本,在Ascend 310/710和Tesla设备上进行推理应用。具体来说,本教程推理的模型是RegNetY-1.6GF,即论文《​Designing Network Design Spaces​》提出的一个模型。RegNetY-1.6GF是使用网络结构搜索(NAS)技术对搜索空间进行搜索得到的模型。该模型解决的任务是图像分类任务,训练和测试数据集是ImageNet1k数据集。本案例将在ImageNet1k的测试集上实现推理流程。在执行该任务之前,给定的模型和脚本文件如下:

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_MindStudio

关于该任务具体流程和要求可参考官方推理指导文档:​​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和Deployment

在MindStudio的远程服务中,定义了SSH 配置和Deployment两个概念。前者SSH 配置类似MobaxTerm中的Session的概念,用户可以保存多个远程服务器的连接配置。后者Deployment管理远程开发时的本地文件与远程文件的同步。配置好Deployment后,我们就可以像使用本地python环境一样去使用远程的python环境了。

点击File -> Settings -> Tools,即可看到两个设置的入口,下面分别介绍如何配置他们。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_Ascend_02

首先配置SSH。1.点击SSH Configurations;2.点击+,新增一个SSH连接;3输入主机IP地址和端口号;4输入登陆用户名;5输入密码;6点击测试连接。

测试成功点击Apply即可保存配置,以后就可以一键连接啦!如图红色方框中是我的三个远程SSH连接。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_离线推理_03

Deployment配置实际上是更精准地连接远程服务,它需要选择一个SSH连接定位远程主机,然后设置本地与远程项目目录的对应关系。如下图所示创建一个新的Deployment.

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_Ascend_04

如图test是我新创建的Deployment名字,首先选择连接哪一个SSH服务,然后测试连接是否可用。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_MindStudio_05

下一步,设置项目目录映射关系,点击Mappings,然后选择本地的项目目录和远程的项目目录(最好提前创建好文件夹),接下来跑代码的时候MindStudio会保证这两个目录文件的同步。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_离线推理_06

配置好Mappings后,强烈建议配置排除路径,即配置Excluded Paths,因为MindStudio的默认同步行为会把Mappings对应目录的文件保持完全相同,这意味着只存在于远程的数据集文件夹会被删除(如果本地没有数据集)。在此我配置了几个需要排除的文件夹目录。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_环境变量_07

注:这是MindStudio比较坑的地方,我第一次运行脚本后在远程生成了test.onnx文件,这个文件并没有download到本地,而我再次运行脚本的时候,MindStudio的同步机制会把test.onnx删除掉,因为我本地没有这个文件....对于这个缺陷,建议把Deployment目录与数据及生成的中间文件隔离开。

配置远程python解释器

现在,SSH和Deployment的映射关系已经配置好了,但是MindStudio还不知道调用哪个程序执行代码,具体来说就是还不知道python解释器的位置。因此,下面将介绍如何配置python解释器。

点击File -> Project Structure->SDKs可以看到如图所示的界面。点击+号,可以新增python SDK和JDK。这里只演示Python的添加方法。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_离线推理_08

点击Add Python SDK后,将弹出下图所示的界面,注意,这里不只是添加远程python环境,本地的虚拟环境和conda环境也是在这里配置添加的。

此时我们需要连接远程环境,点击左侧的SSH Interpreter,如下图所示,首先选择使用哪一个Deployment,这是刚刚我们配置过的。然后选择python解释器的路径。图中的路径是MindStudio自动检测出来的,但一般需要自己找自己的Python环境安装目录。如果是conda环境,可以使用whereis conda找到conda的安装路径。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_环境变量_09

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_MindStudio_10

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_Ascend_11

然后点击Project,选择刚才添加到MindStudio中的python解释器,将其作为本项目使用的解释器。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_离线推理_12

图中显示的是所有我添加的python解释器,这里有两个名字一模一样的解释器无法区分,对于这种情况,可以点击SDKs在SDK管理界面自定义每个python解释器的名字。

这个时候python解释器就配置好了,在Run Configurations界面选择配置好的解释器即可。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_环境变量_13


执行推理过程

推理过程可分为以下步骤:

1.数据预处理。

2.模型转换:先将pth模型转化为onnx模型,再将onnx模型转化为om模型。

3.执行推理:使用benchmark进行推理。

4.精度验证:将推理结果和标签比对,计算准确率。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_MindStudio_14


数据预处理

上传好数据集后,运行编写好的imagenet_torch_preprocess.py脚本进行数据预处理。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_环境变量_15

MindStudio会首先上传本地文件到远程服务器将本地的文件同步到远程这个过程可能很慢,同步完成后开始运行Python代码,MindStudio会实时地在控制台打印输出:

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_Ascend_16

生成数据集info文件,执行get_info.py,同上配置好脚本参数和远程解释器即可。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_python_17


模型转换

在本案例中,模型转化包括两个步骤:
1、由.pth转为.onnx

2、由.onnx转为.om

pth转onnx是使用pytorch实现的。执行编写好的python脚本即可。远程运行python脚本之前MindStudio会进行同步操作,将本地的文件同步到远程,这个过程可能很慢。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_Ascend_18

onnx转为om需要用atc工具,MindStudio提供了atc工具的窗口化应用,它会根据用户选择自动生成atc指令。Model Converter的入口如图所示,或点击Ascend->Model Converter:

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_离线推理_19

选择onnx模型路径,模型输出名称,目标设备,输入格式和batchsize等信息。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_MindStudio_20

MindStudio自动生成如下atc指令,用户可以在此做最后的校验,点击Finish即可开始进行模型转换。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_python_21

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_MindStudio_22

模型推理

使用benchmark工具进行推理。

这个和前面的python脚本不同,它在MindStudio中属于ACL应用,可以如图所示创建应用:

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_Ascend_23

然后进行如下配置:

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_离线推理_24

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_Ascend_25

运行出错: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中可以通过如图所示的方法配置环境变量解决:

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_环境变量_26

变量内容就是/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环境变量。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_MindStudio_27

修改后代码运行成功:

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_Ascend_28

精度验证

执行 vision_metric_ImageNet.py脚本。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_python_29

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_环境变量_30

FAQ

配置好Run Configuration启动执行后,很长时间终端无响应

在启动一个远程程序之前,MindStudio会首先将本地目录到远程目录进行同步,如果本地目录内容与远程差异较大,比如pth模型文件和数据集,同步到远程这个过程将会很慢。

可以在File Tranfer界面观察MindStudio正在进行哪些同步行为。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_MindStudio_31

如果这里出现Delete操作,说明存在一些远程存在但本地没有的文件或文件夹,这时候MindStudio将会把远程的文件删除以达到同步。这种情况比较危险,应尽量避免,可以通过设置同步时的排除路径解决,如下图所示,我设置了prep_dataset和ILAVRC2012_img_val文件夹为排除路径,这样即使我本地目录没有这两个文件夹,同步过程中也不会被MindStudio删除了。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_MindStudio_32

远程执行控制台报错:error while loading shared libraries: libascendcl.so: cannot open shared object file: No such file or directory

这个错误是因为没有配置好环境变量。我们在执行非Python程序的时候,需要先设置环境变量,在命令行通常是执行设置好的环境变量脚本进行设置,但在远程控制的情况下,默认是直接执行对应的程序,不会预先执行某个shell脚本,因此缺少了环境变量的配置这一步骤。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_环境变量_33

解决方案: Run Configuration虽然不能指定运行某个shell脚本,但可以带上环境变量,如图所示,只需把shell脚本里的环境变量写到Environment Variables中即可实现相同的作用。

推理实践丨如何使用MindStudio进行Pytorch模型离线推理_python_34

MindStudio导入应用工程后,提示“No Python interpreter configured for the module”

这篇教程有详细的解决方案:​https://bbs.huaweicloud.com/forum/thread-187863-1-1.html​​


点击关注,第一时间了解华为云新鲜技术~

以上是关于推理实践丨如何使用MindStudio进行Pytorch模型离线推理的主要内容,如果未能解决你的问题,请参考以下文章

从零教你使用MindStudio进行Pytorch离线推理全流程

从零教你使用MindStudio进行Pytorch离线推理全流程

开发实践丨昇腾CANN的推理应用开发体验

开发实践丨昇腾CANN的推理应用开发体验

基于U-Net网络的图像分割的MindStudio实践

基于U-Net网络的图像分割的MindStudio实践