• 推理实践丨如何使用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的测试集上实现推理流程。在执行该任务之前,给定的模型和脚本文件如下:

     1.jpg

    关于该任务具体流程和要求可参考官方推理指导文档: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,即可看到两个设置的入口,下面分别介绍如何配置他们。

    2.jpg

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

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

    3.png

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

    4.png

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

    5.png

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

    6.png

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

    7.png

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

    配置远程python解释器

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

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

    8.png

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

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

    9.png

    10.png

    11.png

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

    12.png

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

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

    13.png

    执行推理过程

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

    1.数据预处理。

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

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

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

    14.png

    数据预处理

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

    15.png

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

    16.png

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

    17.png

    模型转换

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

    2、由.onnx转为.om

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

    18.png

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

    19.png

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

    20.png

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

    21.png

    22.png

    模型推理

    使用benchmark工具进行推理。

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

    23.png

    然后进行如下配置:

    24.png

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

    26.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环境变量。

    27.png

    修改后代码运行成功:

    28.png

    精度验证

    执行 vision_metric_ImageNet.py脚本。

    29.png

    30.png

    FAQ

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

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

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

    31.png

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

    32.png

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

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

    33.png

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

    34.png

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

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

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

  • 相关阅读:
    图片灰度化,并且resize图片
    C语言学习笔记
    路飞学城14天集训营作业2—三级菜单
    路飞学城14天集训营作业4—员工信息表
    路飞学城14天集训营作业3—购物车
    路飞学城14天集训营作业1—登陆认证
    js钩子函数
    APP2.0后台控件API
    KindEditor 插件API使用说明
    TreeView插件 API
  • 原文地址:https://www.cnblogs.com/huaweiyun/p/16457683.html
Copyright © 2020-2023  润新知