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

x33g5p2x  于2022-07-10 转载在 其他  
字(5.4k)|赞(0)|评价(0)|浏览(544)

**摘要:**本教程所示例的任务是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的测试集上实现推理流程。在执行该任务之前,给定的模型和脚本文件如下:

关于该任务具体流程和要求可参考官方推理指导文档: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源,没有太多坑。也可参考华为云社区提供的安装教程:简介_MindStudio 版本:2.0.0(beta1)_用户指南_安装_华为云

或参考第三方教程:【经验分享】华为昇腾 docker 内配置 MindStudio - 知乎

配置SSH和Deployment

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

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

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

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

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

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

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

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

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

配置远程python解释器

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

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

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

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

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

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

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

执行推理过程

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

1.数据预处理。

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

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

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

数据预处理

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

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

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

模型转换

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

2、由.onnx转为.om

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

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

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

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

模型推理

使用benchmark工具进行推理。

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

然后进行如下配置:

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

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

修改后代码运行成功:

精度验证

执行 vision_metric_ImageNet.py脚本。

FAQ

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

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

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

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

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

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

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

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

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

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

相关文章