推理实践丨如何使用 MindStudio 进行 Pytorch 模型离线推理
本文分享自华为云社区《使用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 源,没有太多坑。
也可参考华为云社区提供的安装教程: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,即可看到两个设置的入口,下面分别介绍如何配置他们。
首先配置 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 configure for the module”
这篇教程有详细的解决方案:https://bbs.huaweicloud.com/forum/thread-187863-1-1.html
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/64ae9c3a47efd2cb27ae2030f】。文章转载请联系作者。
评论