**摘要:**本教程所示例的任务是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进行推理应用程序开发的同学也会有一定的参考价值。
昇腾深度学习生态包括算子开发,MindSpore模型训练,模型推理,MindX和ACL应用开发等组件。从算子开发到应用开发,组件功能覆盖范围较广,涉及的编程语言也不只一种,而市场上并没有一个通用的开发环境软件,因此MindStudio应运而生。MindStudio提供了一站式AI开发环境,支持Python,Java和C语言的开发,并提供了众多性能调优工具,应用开发中提供了插件化扩展机制,打造了高效、便捷的全流程开发工具链。有了MindStudio基本上可以做到完全脱离命令行界面。
本案例中使用的环境为:本地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 - 知乎。
在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目录与数据及生成的中间文件隔离开。
现在,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脚本。
在启动一个远程程序之前,MindStudio会首先将本地目录到远程目录进行同步,如果本地目录内容与远程差异较大,比如pth模型文件和数据集,同步到远程这个过程将会很慢。
可以在File Tranfer界面观察MindStudio正在进行哪些同步行为。
如果这里出现Delete操作,说明存在一些远程存在但本地没有的文件或文件夹,这时候MindStudio将会把远程的文件删除以达到同步。这种情况比较危险,应尽量避免,可以通过设置同步时的排除路径解决,如下图所示,我设置了prep_dataset和ILAVRC2012_img_val文件夹为排除路径,这样即使我本地目录没有这两个文件夹,同步过程中也不会被MindStudio删除了。
这个错误是因为没有配置好环境变量。我们在执行非Python程序的时候,需要先设置环境变量,在命令行通常是执行设置好的环境变量脚本进行设置,但在远程控制的情况下,默认是直接执行对应的程序,不会预先执行某个shell脚本,因此缺少了环境变量的配置这一步骤。
解决方案: Run Configuration虽然不能指定运行某个shell脚本,但可以带上环境变量,如图所示,只需把shell脚本里的环境变量写到Environment Variables中即可实现相同的作用。
这篇教程有详细的解决方案:https://bbs.huaweicloud.com/forum/thread-187863-1-1.html
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://huaweicloud.blog.csdn.net/article/details/125674039
内容来源于网络,如有侵权,请联系作者删除!