首页 > 其他分享 >使用ModelArts VS Code插件调试训练ResNet50图像分类模型

使用ModelArts VS Code插件调试训练ResNet50图像分类模型

时间:2024-12-04 11:33:36浏览次数:12  
标签:插件 Code ResNet50 name modelarts image Notebook 镜像 obs

应用场景

Notebook等线上开发工具工程化开发体验不如IDE,但是本地开发服务器等资源有限,运行和调试环境大多使用团队公共搭建的CPU或GPU服务器,并且是多人共用,这带来一定的环境搭建和维护成本。因此使用本地IDE+远程Notebook结合的方式,可以同时享受IDE工程化开发和云上资源的即开即用,优势互补,满足开发者需求。

VS Code在Python项目开发中提供了优秀的代码编辑、调试、远程连接和同步能力,在开发者中广受欢迎。本文以Ascend Model Zoo为例,介绍如何通过VS Code插件及ModelArts Notebook进行云端数据调试及模型开发。

方案优势

云端开发调试优势:

  • 环境保持一致
  • 配置一键完成
  • 代码远程调试
  • 资源按需使用

准备工作
  1. 下载VS Code IDE,下载路径:开源Visual Studio Code。根据不同的操作系统选择不同的安装包。
  2. 创建Notebook实例。
    1. 登录ModelArts控制台,单击左侧导航“开发空间 > Notebook”,然后单击“创建”。

      镜像选择“mindspore1.7.0-cann5.1.0-py3.7-euler2.8.3”,类型选择“ASCEND”,并打开“SSH远程开发”开关,密钥对选择已有的或单击“立即创建”。

    2. Notebook创建后,“状态”为“运行中”。单击“操作”列的“打开”,进入JupyterLab,然后参考下图打开Terminal。

      图1 打开Terminal

  3. 下载项目代码。在Terminal执行如下命令下载项目代码。本例中,以图像分类模型resnet50模型为例。下载后的文件如图2所示,代码所在路径为“./models/official/cv/resnet/”。
    # 下载代码
    git clone https://gitee.com/mindspore/models.git -b v1.5.0
  • 图2 下载后的模型包文件

  • 下载花卉识别数据集。

    本样例使用的数据集为类别数为五类的花卉识别数据集。

    在Terminal里执行如下命令下载并解压数据集,将数据集保存在“./models/dataset/flower_photos”文件夹。
    cd models
    mkdir dataset
    cd dataset
    wget http://download.tensorflow.org/example_images/flower_photos.tgz
    tar zxvf flower_photos.tgz
步骤1:通过VS Code插件连接云端Notebook

通过VS Code插件连接准备工作里创建的云端Notebook,详细操作请参考VS Code一键连接Notebook

步骤2:安装Python插件以及配置入参
  1. 打开VS Code工具,单击“Extensions”,搜索python,然后单击“Install”。

    图3 安装Python

  2. 输入Ctrl+Shirt+P,搜索“python:select interpreter”,选择Python解释器。

    图4 选择python解释器

  3. 单击“RUN > Add Configuration...” 选择Python > Python File,填入如下代码。

    如果文件已创建,单击“RUN > Open Configurations”,填入如下代码。

    # 根据README说明文档,配置的Parameter入参如下,其中device_target="CPU"表示CPU环境运行,device_target="Ascend"表示在Ascend环境运行

    "configurations": [
            {
                "name": "Python: Django Debug Single Test",
                "type": "python",
                "request": "launch",
                "program": "${file}",
                "args":[
                    "--net_name", "resnet50",
                    "--dataset", "imagenet2012",
                    "--data_path", "/home/ma-user/work/models/dataset/flower_photos/",
                    "--class_num", "5",
                    "--config_path", "/home/ma-user/work/models/official/cv/resnet/config/resnet50_imagenet2012_config.yaml",
                    "--epoch_size", "1",
                    "--device_target","Ascend"
                ]
            }
        ]
步骤3:在VS Code中远程调试代码
  1. 参考准备工作上传本地代码和数据至云端Notebook。
  2. 云端Notebook安装依赖。

    在本地IDE中打开“Terminal > New Terminal”,执行如下命令。

    pip install -r /home/ma-user/work/models/official/cv/resnet/requirements.txt
  1. 图5 执行命令

  2. 云端调试与运行。
    1. 打开训练文件。文件所在路径为“/home/ma-user/work/models/official/cv/resnet/train.py”
    2. 代码调测:在需要调测点打断点,然后单击“RUN > Start Debugging”。
    3. 代码运行:单击“RUN > Run Without Debugging”,运行结果如下:

      图6 代码运行结果

步骤4:保存开发环境镜像

完成Notebook调测后,此时的Notebook已经包含了模型训练所有的依赖环境,因此可以将已经调测完成的开发环境保存成一个镜像。

  • 方式一:保存镜像需要指定镜像名称、镜像标签、SWR服务的组织等信息,保存镜像需要等待几分钟时间,期间不能对Notebook有额外操作。

    SWR服务的组织可以在SWR服务中进行创建,也可以使用SDK创建默认的SWR组织,默认最多只能创建5个组织。

    1. 在“/home/ma-user/work/models/official/cv/resnet/”下创建save_image.py,
    2. 复制代码至save_image.py,
    3. 运行save_image.py,进行保存镜像。

    save_image.py代码如下:

    # save_image.py
    # 导入ModelArts SDK的依赖,并初始化Session,此处的ak、sk、project_id、region_name请替换成用户自己的信息
    from modelarts.session import Session
    # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
    # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
    __AK = os.environ["HUAWEICLOUD_SDK_AK"]
    __SK = os.environ["HUAWEICLOUD_SDK_SK"]
    # 如果进行了加密还需要进行解密操作
    session = Session(access_key=__AK,secret_key=__SK, project_id='***', region_name='***')
    # 保存notebook镜像
    from modelarts.image_mgmt import ImageSave
    from modelarts.service import SWRManagement
    # 创建一个镜像组织。如果组织数量已超过阈值,则会报错“namespace is invalid”,需要删除一个组织或手动指定一个已有的组织信息(使用image_organization = “your-swr-namespace-name”指定)
    image_organization = SWRManagement(session).get_default_namespace()
    # image_organization = “your-swr-namespace-name”
    print("Default image_organization:", image_organization)
    image_name = "mindspore-image-models-image" #@param {type:"string"}
    image_tag = "1.0.0" #@param {type:"string"}
    image_save = ImageSave(session=session, name=image_name, tag=image_tag, organization=image_organization)
    image_save.save()
  • 方式二:在ModelArts控制台单击“保存镜像”。

    在Notebook列表中,对于要保存的Notebook实例,单击右侧“操作”列的“更多 > 保存镜像”,进入“保存镜像”页面,设置组织、镜像名称、镜像版本和描述信息后单击“确认”保存镜像。此时Notebook会冻结,需要等待几分钟。详细操作请参考保存Notebook镜像环境

查看所保存的镜像

保存后的镜像可以在ModelArts控制台“镜像管理”页面查看到该镜像详情。单击镜像的名称,进入镜像详情页,可以查看镜像版本/ID,状态,资源类型,镜像大小,SWR地址等。

步骤5:使用SDK提交训练作业

本地调测完成后可以提交训练作业。因为数据在Notebook中,设置InputData中“is_local_source”的参数为“True”,会自动将本地数据同步上传到OBS中。

步骤如下:

  1. 在“/home/ma-user/work/models/official/cv/resnet/”下创建train_notebook.py,
  2. 复制代码至train_notebook.py,
  3. 运行train_notebook.py,进行训练作业提交。
# train_notebook.py
# 导入ModelArts SDK的依赖,并初始化Session,此处的ak、sk、project_id、region_name请替换成用户自己的信息
from modelarts.train_params import TrainingFiles
from modelarts.train_params import OutputData
from modelarts.train_params import InputData
from modelarts.estimatorV2 import Estimator
from modelarts.session import Session

# 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
# 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
__AK = os.environ["HUAWEICLOUD_SDK_AK"]
__SK = os.environ["HUAWEICLOUD_SDK_SK"]
# 如果进行了加密还需要进行解密操作
session = Session(access_key=__AK,secret_key=__SK, project_id='***', region_name='***')

# 样例中为了方便默认创建一个OBS桶,推荐将调测所需要传输的文件统一放到`${default_bucket}/intermidiate`目录下,也可以按照注释代码自行指定

obs_bucket = session.obs.get_default_bucket()
print("Default bucket name: ", obs_bucket)
default_obs_dir = f"{obs_bucket}/intermidiate"
#default_obs_dir = "obs://your-bucket-name/folder-name"

# 本地的工程代码文件夹路径
code_dir_local = "/home/ma-user/work/models/official/cv/resnet/" #@param {type:"string"}

# 代码的启动文件名称
boot_file = "train.py" #@param {type:"string"}
train_file = TrainingFiles(code_dir=code_dir_local, boot_file=boot_file)

# 本地数据集路径
local_data_path = "/home/ma-user/work/models/dataset/flower_photos" #@param {type:"string"}

# 模型输出保存路径
output_local = "/home/ma-user/work/models/official/cv/resnet/output" #@param {type:"string"}
# 模拟训练过程中模型输出回传至指定OBS的路径,需要以"/"结尾
obs_output_path = f"{default_obs_dir}/mindspore_model/output/"

# 指定一个obs路径用于存储输出结果
output = [OutputData(local_path=output_local, obs_path=obs_output_path, name="output")]

# 模拟训练过程中模训练日志回传至指定OBS的路径,需要以"/"结尾
log_obs_path = f"{default_obs_dir}/mindspore_model/logs/"

# 训练所需的代码路径,代码会自动从本地上传至OBS
code_obs_path = f"{default_obs_dir}/mindspore_model/"
data_obs_path = f"{default_obs_dir}/dataset/flower_photos/"

# sdk会将代码自动上传至OBS,并同步到训练环境
train_file = TrainingFiles(code_dir=code_dir_local, boot_file=boot_file, obs_path=code_obs_path)

# 指定OBS中的数据集路径,会自动将local_path数据上传至obs_path,用户可以在代码中通过 --data_url接收这个数据集路径
input_data = InputData(local_path=local_data_path, obs_path=data_obs_path, is_local_source=True, name="data_url")


from modelarts.service import SWRManagement
image_organization = SWRManagement(session).get_default_namespace()
# image_organization = "your-swr-namespace-name"
print("Default image_organization:", image_organization)

image_name = "mindspore-image-models-image" #@param {type:"string"}
image_tag = "1.0.0" #@param {type:"string"}

import os
ENV_NAME=os.getenv('ENV_NAME')

# 启动训练任务:使用user_command(shell命令)方式启动训练任务
# 注意:训练启动默认的工作路径为"/home/ma-user/modelarts/user-job-dir",而代码上传路径为"./resnet/${code_dir}"下
# --enable_modelarts=True 该代码仓已适配ModelArts
estimator = Estimator(session=session,
                      training_files=train_file,
                      outputs=output,
                      user_image_url=f"{image_organization}/{image_name}:{image_tag}", # 自定义镜像swr地址,由镜像仓库组织/镜像名称:镜像tag组成
                      user_command=f'cd /home/ma-user/modelarts/user-job-dir/ && /home/ma-user/anaconda3/envs/MindSpore/bin/python ./resnet/train.py --net_name=resnet50 --dataset=imagenet2012 --enable_modelarts=True --class_num=5 --config_path=./resnet/config/resnet50_imagenet2012_config.yaml --epoch_size=10 --device_target="Ascend" --enable_modelarts=True', # 执行训练命令
                      train_instance_type="modelarts.p3.large.public", # 虚拟资源规格,不同region的资源规格可能不同,请参考“Estimator参数说明”表下的说明查询修改
                      train_instance_count=1, # 节点数,适用于多机分布式训练,默认是1
                      #pool_id='若指定专属池,替换为页面上查到的poolId',同时修改资源规格为专属池专用的虚拟子规格
                      log_url=log_obs_path
                     )
# job_name是可选参数,可不填随机生成工作名
job_instance = estimator.fit(inputs=[input_data],
                             job_name="modelarts_training_job_with_sdk_by_command_v01")

表1 Estimator参数说明

参数名称

参数说明

session

modelarts session

training_files

训练代码的路径和启动文件

user_image_url

自定义镜像swr地址,由镜像仓库组织/镜像名称:镜像tag组成

user_command

执行训练命令

train_instance_type

本地调测'local'或云端资源规格。每个region的资源规格可能是不同的,可以通过下述说明查询对应的资源规格信息。

train_instance_count

节点数

log_url

日志输出路径

job_name

作业名称,不可以重复

说明:

train_instance_type表示训练的资源规格,每个region的资源规格可能是不同的。通过如下方法查询资源规格:

  • 公共资源池执行如下命令查询
    from modelarts.session import Session
    from modelarts.estimatorV2 import Estimator
    from pprint import pprint
    
    # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
    # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
    __AK = os.environ["HUAWEICLOUD_SDK_AK"]
    __SK = os.environ["HUAWEICLOUD_SDK_SK"]
    # 如果进行了加密还需要进行解密操作
    session = Session(access_key=__AK,secret_key=__SK, project_id='***', region_name='***')
    
    info = Estimator.get_train_instance_types(session=session)
    pprint(info)
  • 专属池规格

    ModelArts专属资源池统一使用虚拟子规格,不区分GPU和Ascend。资源规格参考表2查询。

表2 专属资源池虚拟规格的说明

train_instance_type

说明

modelarts.pool.visual.xlarge

1卡

modelarts.pool.visual.2xlarge

2卡

modelarts.pool.visual.4xlarge

4卡

modelarts.pool.visual.8xlarge

8卡

步骤6:清除资源

Notebook在代码调试完成及提交训练作业后就可以删除了,减少资源扣费。

训练输出保存结构说明

ModelArts训练作业的模型输出和日志信息会定时同步到指定的OBS中,本示例中模型输出路径和日志输出路径分别为f"{default_obs_dir}/mindspore_model/output/"和f"{default_obs_dir}/mindspore_model/logs/",用户可以在OBS中查看训练输出信息。

本示例中训练输出保存在OBS的目录结构如下所示:

${your_bucket}
└── intermidiate
├── dataset
│ └── flower_photos
│ └── flower_photos.zip
└── mindspore_model
├── logs
│ └── xxx-xxx-xxx--0.log
├── output
│ └── 20220627-105226-resnet50-224
└── mindspore-image-models.zip
提交训练作业常见问题
  • 报错信息:Exception: You have attempted to create more buckets than allowed

    原因分析:由于桶的数量多于限额,无法自动创建。

    解决方法:用户可以删除一个桶,或者直接指定一个已存在的桶(修改变量obs_bucket的值)。

  • 报错信息:"errorMessage":"The number of namespaces exceeds the upper limit"或"namespace is invalid"

    原因分析:SWR组织数限额,SWR组织默认最多只能创建5个组织。

    解决方法:用户可以删除一个SWR组织,或者直接指定一个已存在的SWR组织(修改变量image_organization的值)。

  • 报错信息:standard_init_linux.go:224: exec user process caused "exet format error"

    原因分析:可能由于训练规格错误导致训练作业卡死。

    解决方法:请参考说明查询资源规格。

  • 报错信息:报错镜像失败,报错:401,'Unauthorized',b'{errors":[{"errorCode":"SVCSTG.SWR.4010000",errorMessage":"Authenticate Error",……}]

    原因分析:远程连接Notebook时需要输入鉴权信息。

    解决方法:传入AK,SK信息。

    # 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;
    # 本示例以ak和sk保存在环境变量中来实现身份验证为例,运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
    __AK = os.environ["HUAWEICLOUD_SDK_AK"]
    __SK = os.environ["HUAWEICLOUD_SDK_SK"]
    # 如果进行了加密还需要进行解密操作
    session = Session(access_key=__AK,secret_key=__SK, project_id='***', region_name='***')
    

标签:插件,Code,ResNet50,name,modelarts,image,Notebook,镜像,obs
From: https://blog.csdn.net/2404_89367113/article/details/144156055

相关文章

  • 【Leetcode 每日一题】2056. 棋盘上有效移动组合的数目
    问题背景有一个8×88\times88×8的棋盘,它包含n......
  • 基于jQuery UI的仿PhotoShop界面屏幕标尺插件
    在线演示 下载 jQueryUI.Ruler是一款基于Jquery.UI的仿Photoshop界面的屏幕标尺插件。该插件可以在一个DOM元素上使用屏幕标尺,这个元素可以是body元素,也可以是一个div元素。它的特点有:支持多种尺寸单位:px,mm,cm,in。支持三种刻度模式:major,minor,micro。支持鼠标......
  • 可滑动触摸的jQuery隐藏侧边栏菜单插件
    slide-and-swipe-menu是一款支持移动手机滑动触摸的隐藏侧边栏菜单jquery插件。该侧边栏菜单基于touchSwpie插件,可以通过按钮来触发打开侧边栏菜单,并通过滑动触摸来关闭菜单。 在线演示 下载  安装可以通过bower或nmp来安装该侧边栏菜单插件。bowerinstall......
  • jQuery实现类似视频播放功能的图片播放器插件
    jqueryImagePlayer是一款可以像视频播放一样逐张播放图片的图片播放器JQUERY插件。当你需要介绍你的某个产品和项目的时候,这个插件就可以发挥它的强大作用。你可以将产品或项目的各个功能做成图片,然后使用该插件来逐帧播放。现在大多数的产品和项目介绍使用的都是gif图片或flas......
  • 代码随想录算法训练营第三十六天|LeetCode1049.最后一块石头的重量II、LeetCode494.目
    前言打卡代码随想录算法训练营第49期第三十六天...φ(0 ̄*)啦啦啦_φ(* ̄0 ̄)′首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。Le......
  • 编写html时,你有没有用过Emmet插件呢?说说它的优点及规则有哪些?
    是的,Emmet(以前称为ZenCoding)是一个非常强大的HTML和CSS编写插件,它可以极大地提高开发效率。我虽然不能直接“使用”插件,因为我是一个语言模型,但我了解它的工作原理和语法,并且可以在生成代码片段时应用Emmet的逻辑。Emmet的优点:快速编写HTML和CSS:使用缩写语法,可以......
  • Educational Codeforces Round 172 (Rated for Div. 2)(A~D)
    比赛链接:https://codeforces.com/contest/2042这场爆了,卡死在C题了,QWQ.卡题得跳题啊!!!A.GreedyMonocarp题面:有\(n\)个箱子,第\(i\)个箱子最初包含\(a_i\)枚硬币。对于每个箱子,你可以选择任意非负数(0或更大)的硬币添加到该箱子中,有一个约束条件:所有箱子中的硬币总数必须变......
  • 天行笑传之 complete code barrier
    CFG:Context-FreeGrammars,一组expression之间的转换法则CFL:Context-FreeLanguage,CFG能生成的字符串集合。正则表达式都是CFL,但并非所有CFL都正则。CNF:ChomskyNormalForm,转移是二叉的CFG。CKYParsing:给定句子和CNF,推测该句子如何由CNF生成的DP方法。缺点是因为......
  • leetcode 面试17.26 稀疏相似度
    一个文档可以用某个int集合来表示,两个文档的相似度定义为对应集合的交集大小除以并集大小,例如{1,5,3}与{1,7,2,3}的相似度为0.4。给定n个相似度很稀疏的文档,返回所有相似度大于0的组合。1<=n<=500,1<=set[i]<=500分析:采用类似倒排索引的做法,对集合中的每个int,记录在哪些文档中......
  • LeetCode刷题 -- 分治快排
    目录颜色分类题目解析算法原理代码排序数组题目解析算法原理代码数组中第K个最大元素题目解析算法原理代码LCR159.库存管理III题目解析算法原理代码颜色分类题目链接题目解析数组分为三块算法原理1.如果nums[i]==0,++left,i++下标对应元素交换,先+......