使用ModelArts PyCharm插件调试训练ResNet50图像分类模型
本案例介绍如何将本地开发好的MindSpore模型代码,通过PyCharm ToolKit连接到ModelArts进行云上调试和训练。
开始使用样例前,请仔细阅读准备工作罗列的要求,提前完成准备工作。本案例的步骤如下所示:
步骤3:使用ModelArts Notebook进行开发调试
准备工作
- 本地已安装2019.2-2023.2之间(包含2019.2和2023.2)版本的PyCharm专业版工具,推荐Windows版本,社区版或专业版均可,请单击PyCharm工具下载地址获取工具并在本地完成安装。
- 使用PyCharm ToolKit远程连接Notebook开发环境,仅限PyCharm专业版。
- 使用PyCharm ToolKit提交训练作业,社区版和专业版都支持。
- 已注册华为账号并开通华为云,且在使用ModelArts前检查账号状态,账号不能处于欠费或冻结状态。
- 已创建当前使用账号的访问密钥,并获得对应的AK和SK。如果未创建,请参见创建访问密钥(AK和SK)。
- 当前账号已完成访问授权的配置。如未完成,请参考使用委托授权。
环境说明
- Python 3.7.6
- PyCharm 2023.1.3 (Professional Edition)
本案例使用PyCharm版本为PyCharm 2023.1.3 (Professional Edition),不同版本PyCharm之间部分界面可能不同,仅供参考。
步骤1:安装和登录PyCharm ToolKit
- 安装PyCharm ToolKit。
- 登录PyCharm ToolKit。
- 打开“Edit Credential”界面。
安装完插件后,会在IDE菜单栏出现“ModelArts”,单击后选择“Edit Credential”。
如果菜单栏中找不到“ModelArts > Edit Credential”,可能是PyCharm版本过高,PyCharm toolkit未适配2023.2之后版本的PyCharm工具。请下载2019.2-2023.2之间(包含2019.2和2023.2)版本的PyCharm专业版工具。
- 验证登录信息。
将创建访问密钥(AK和SK)输入到ToolKit对应位置,单击OK按钮进行登录,出现下图提示即为登录成功。
如果未创建,请参见创建访问密钥(AK和SK)
图2 成功登录提示
- 打开“Edit Credential”界面。
步骤2:使用PyCharm进行本地开发调试
- 下载代码至本地。
- 配置本地PC开发环境。
执行pip命令安装:
# 在PyCharm的Terminal安装mindspore pip install mindspore==1.7.0 --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple # 在PyCharm的Terminal安装resnet依赖 pip install -r .\official\cv\resnet\requirements.txt --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple
图4 安装resnet依赖
- 准备数据集。
本样例使用的数据集为类别数为五类的花卉识别数据集,下载数据集并解压数据到工程目录。新建dataset文件夹,将解压后数据集保存在dataset文件夹下。
图5 准备数据集
- 配置PyCharm解释器和入参。
单击右上角“Current File”,选择“Edit Configuration”,打开“Run/Debug Configuration”对话框。在对话框中单击“+”,选择“Python”。图6 前往PyCharm解释器
“Script path”选择train.py文件,“Parameters”命令如下所示,并选择Python解释器,然后单击“OK”:
--net_name=resnet50 --dataset=imagenet2012 --data_path=../../../dataset/flower_photos/ --class_num=5 --config_path=./config/resnet50_imagenet2012_config.yaml --epoch_size=1 --device_target="CPU"
图7 配置PyCharm解释器
根据README说明文档,配置Parameter参数device_target="CPU"表示CPU环境运行,device_target="Ascend"表示在Ascend环境运行。
- 本地代码开发调测。
一般本地CPU算力较低并且内存较小,可能出现内存溢出的报错,因此可以把“models/official/cv/resnet/config/resnet50_imagenet2012_config.yaml”的“batch_size”由“256”改为“32”,使得训练作业可以快速运行。
图8 修改batch_size
AI开发过程中的数据集开发及模型开发是和硬件规格无关的,而且这一部分的开发耗时是最长的,因此可以先在本地PC的CPU环境进行数据集和模型开发调试。
本例中,因为样例代码已经支持在CPU上进行训练,因此用户能够在CPU上完成整个训练流程。如果代码只支持在GPU或者Ascend上训练,那么可能会报错,需要使用Notebook进行云端调试。
设置断点后单击“调试”,可实现代码逐步调试,查看中间变量值。
图9 “调试”按钮
图10 通过设置断点实现代码调试
可单击“运行”按钮,通过日志观察是否能正常训练。
图11 “运行”按钮
图12 训练日志
步骤3:使用ModelArts Notebook进行开发调试
使用ModelArts Notebook进行开发调试具有如下优势:
- 环境保持一致
- 配置一键完成
- 代码远程Debug
- 资源按需使用
只有PyCharm专业版支持本章节,社区版可以直接跳转至步骤4:使用PyCharm提交训练作业至ModelArts完成创建训练作业。
- 连接Notebook开发环境。
- 创建或打开云端Ascend规格的Notebook。创建Notebook详细操作请参见创建Notebook实例,Notebook规格相关信息如下所示:
“镜像”:tensorflow1.15-mindspore1.7.0-cann5.1.0-euler2.8-aarch64。
“资源选择”:公共资源池。
“类型”:ASCEND。
“规格”:选Ascend类型的,以界面实际可选值为准。
“存储配置”:EVS存储。
“SSH远程开发”:开启。
“密钥对”:选择已有密钥对,或单击密钥对右侧的“立即创建”创建密钥对。
- 通过ToolKit连接云端Notebook。
- 在IDE菜单栏中选择“ModelArts>Notebook>Remote Config”,在打开的界面中选择要连接的Notebook实例。
此处如果看不到Connect to Remote选项,请先参考创建Notebook实例章节,创建Notebook实例,并开启该实例的SSH远程开发功能。
也可能是PyCharm ToolKit的版本不正确,请按照文档要求下载新版本的PyCharm ToolKit。
下载前请先清除浏览器缓存,如果之前下载过老版本的PyCharm ToolKit,浏览器会有缓存,可能会导致新版本下载失败。
- 在KeyPair中选择该Notebook实例对应的密钥,选择完成后,单击Apply进行远程Notebook一键配置,等待一段时间后,会出现重启IDE的确认框,单击确认重启,重启后即可生效。
图13 ToolKit连接Notebook配置界面
- KeyPair: 需要选择保存在本地的Notebook对应的keypair认证。即创建Notebook时创建的密钥对文件,创建时会直接保存到浏览器默认的下载文件夹中。
- PathMappings: 该参数为本地IDE项目和Notebook对应的同步目录,默认为“/home/ma-user/work/project”,可根据自己实际情况更改。
- 在IDE菜单栏中选择“ModelArts>Notebook>Remote Config”,在打开的界面中选择要连接的Notebook实例。
- 同步代码和数据至云端Notebook。
- 将代码同步至Notebook。
选择resnet文件夹,右键选择“Deployment>Upload to”上传代码至Notebook。
图14 同步代码至Notebook
- 将数据同步至Notebook。
- 当数据集比较大达到数GB时,建议先将数据集先上传至OBS再通过OBS上传至Notebook,PyCharm只适合做小文件的同步上传。
- 调试时建议使用较小的数据集子集,方便数据同步与数据加载。
- 将代码同步至Notebook。
- 配置云端Python解释器。
- 云端Notebook安装依赖。
打开“Tool>Start SSH Section”,安装依赖软件。
# 进入MindSpore环境 source /home/ma-user/anaconda3/bin/activate MindSpore # 安装resnet依赖 pip install -r work/models/official/cv/resnet/requirements.txt
图18 云端Notebook安装依赖
- 云端调试与运行。
配置完云端的解释器后,PyCharm可以直接使用远端Notebook中的python解释器和硬件规格,满足用户在本地体验到真实的硬件环境并进行全流程的调试和验证。
基于Ascend的样例中,可能会抛出异常。
ModuleNotFoundError: No module named 'te'
原因是:PyCharm的PYTHONPATH会将Notebook中的环境变量中指定的“PYTHONPATH”进行覆盖,因此,还需要将te包所在的路径添加到PyCharm的“PYTHONPATH”中。
te包的路径通过“pip show te”查看,例如te包返回对应的路径为:“/usr/local/Ascend/nnae/5.0.3/compiler/python/site-package”,则“PYTHONPATH”对应的“Value”为“$PYTHONPATH:/usr/local/Ascend/nnae/5.0.3/compiler/python/site-package”图19 将te包所在的路径添加到PyCharm的PYTHONPATH中
- 保存开发环境镜像。
成功完成Notebook调测后,此时的Notebook已经包含了模型训练所有的依赖环境,因此可以将已经调测完成的开发环境保存成一个镜像,选择“Notebook>更多>保存镜像”。此时Notebook会冻结,需要等待几分钟(只需要保存一次)。
保存后的镜像可以在“ModelArts>镜像管理”中进行查看,对应完整的镜像名称为“详情->SWR地址”。
图20 查看保存后的镜像
Notebook在代码调试完成及保存镜像后就可以关闭了,减少资源浪费。
- 连接、停止、启动和断开Notebook实例。
- 连接Notebook实例。
当Notebook实例为绿色三角形状态时,表示该实例运行中(但未与PyCharm连接)。此时单击该实例名称,实例会变为绿色勾状态,表示PyCharm已与实例连接成功。
图21 实例运行中状态
- 停止Notebook实例。
当Notebook实例为绿色勾状态时,表示该实例运行中且与PyCharm连接成功。此时单击该实例名称,实例会变为黄色感叹号状态,表示停止Notebook实例。
图22 实例运行中且与PyCharm连接成功状态
- 启动Notebook实例。
当Notebook实例为黄色感叹号状态时,表示该实例已停止。此时单击该实例名称,实例会变为绿色勾状态,表示启动Notebook实例且与PyCharm连接成功(默认启动时间为4小时)。
图23 实例已停止状态
- 断开PyCharm ToolKit中的Notebook实例SSH连接。
选择“File>Settings>Tool>SSH Configurations”,单击需要断开的实例,选择“-”,单击“OK”,则IDE菜单栏“ModelArts>Notebook”中的Notebook实例连接断开。
该步骤会使Notebook实例不在PyCharm ToolKit中呈现,但Notebook实例仍然存在于控制台。如果想删除Notebook实例以释放资源,请登录ModelArts管理控制台,在Notebook管理页面进行删除。
图24 断开PyCharm ToolKit中的Notebook实例SSH连接
- 连接Notebook实例。
步骤4:使用PyCharm提交训练作业至ModelArts
ModelArts训练平台提供了海量的算力规格和训练优化,支持将本地调试好的代码以及之前保存的开发环境镜像直接在PyCharm中提交训练作业。
- 创建OBS桶并上传数据。
由于训练作业是在ModelArts端运行,因此需要把训练数据和训练代码上传至云端Notebook。可借助OBS Browser+把下载好的训练数据上传至OBS,具体安装步骤请见安装OBS Browser+。
新建data-flower桶,把训练数据flower_photos文件夹通过OBS Browser+上传至对应的OBS,并新建train文件夹用来存放训练作业相关数据。
图25 上传数据至OBS
- 创建训练作业。
创建训练作业界面各参数名称及含义如下表所示。
表1 参数名称及含义 参数名称
含义
JobName
训练作业的名称,默认为当前的时间。
AI Engine
训练引擎,这里选择“mindspore_1.7.0-cann_5.1.0-py_3.7-euler_2.8.3-aarch64”
Boot File Path
本地训练启动代码。
Code Directory
本地代码目录
Image Path(optional)
可选项,输入自定义镜像swr路径地址(使用的自定义镜像和预置的训练镜像引擎一致)
Data OBS Path
OBS上的数据集路径(需要提前把数据上传到OBS中)
Training OBS Path
OBS路径(该路径必须是存在的),用于保存代码和训练模型及日志的输出
Running Parameters
训练脚本接收的参数。
Specifications
计算规格,这里选择Ascend类型的,以界面实际可选值为准。
Compute Node
节点数(单机训练默认为1)
PyCharm中支持两种方式创建训练作业:使用预置镜像训练作业、自定义镜像创建训练作业。
- 使用预置镜像创建训练作业。
在RunningParameters中填入如下训练参数,其余参数按实际路径填写。
--net_name=resnet50 --dataset=imagenet2012 --enable_modelarts=True --class_num=5 --config_path=/home/ma-user/modelarts/user-job-dir/resnet/config/resnet50_imagenet2012_config.yaml --epoch_size=10 --device_target=Ascend
填写完训练作业参数后,单击“Apply and Run”即完成训练作业创建。
图27 使用预置镜像创建训练作业
- 使用自定义镜像创建训练作业。
使用自定义镜像创建训练作业和使用预置镜像创建训练作业的差别,在于Image Path处填入了自定义镜像的地址。填写完训练作业参数后,单击“Apply and Run”即完成训练作业创建。
在选择AI Engine预置镜像时,需要和自定义镜像保持一致,该设置的作用为通过预置镜像的启动命令启动自定义镜像。
例如自定义镜像中用到Mindspore,则预置镜像中可选择包含Mindspore的镜像。
图28 使用自定义镜像创建训练作业
- 使用预置镜像创建训练作业。
- 查看训练日志。
- 终止训练作业。
如果想要在中途终止训练,可以在PyCharm中单击“ModelArts>Training Job>Stop”,或者直接在网页端单击终止。
图30 终止训练作业