云服务器内容精选

  • 在ModelArts Standard上运行GPU训练作业的场景介绍 不同AI模型训练所需要的数据量和算力不同,在训练时选择合适的存储及训练方案可提升模型训练效率与资源性价比。ModelArts Standard支持单机单卡、单机多卡和多机多卡的训练场景,满足不同AI模型训练的要求。 ModelArts Standard提供了公共资源池和专属资源池,专属资源池不与其他用户共享资源,更加高效。针对企业多用户场景,推荐使用专属资源池开展AI模型训练。 本文提供了端到端案例指导,帮助您快速了解如何在ModelArts Standard上选择合适的训练方案并进行模型训练。 针对不同的数据量和算法情况,推荐以下训练方案: 单机单卡:小数据量(1G训练数据)、低算力场景(1卡Vnt1),存储方案推荐使用“OBS的并行文件系统(存放数据和代码)”。 单机多卡:中等数据量(50G左右训练数据)、中等算力场景(8卡Vnt1),存储方案推荐使用“SFS(存放数据和代码)”。 多机多卡:大数据量(1T训练数据)、高算力场景(4台8卡Vnt1),存储方案推荐使用“SFS(存放数据)+普通OBS桶(存放代码)”,采用分布式训练。 当使用SFS+OBS的存储方案可以实现存储加速,该方案的端到端实践案例请参见面向AI场景使用OBS+SFS Turbo的存储加速实践。 表1 不同场景所需服务及购买推荐 场景 OBS SFS SWR DEW ModelArts VPC E CS EVS 单机单卡 按需购买(并行文件系统) × 免费 免费 包月购买 免费 × 按需购买 单机多卡 × 包月购买 (HPC型500G) 免费 免费 包月购买 免费 包月购买 (Ubuntu 18.04,建议不小于2U8G,本地存储空间100G,带EIP全动态BGP,按流量10M带宽) × 多机多卡 按需购买 (普通OBS桶) 包月购买 (HPC型500G) 免费 免费 包月购买 免费 包月购买 (Ubuntu 18.04,建议不小于2U8G,本地存储空间100G,带EIP全动态BGP,按流量10M带宽) × 表2 开源数据集训练效率参考 算法及数据 资源规格 Epoch数 预计运行时长(hh:mm:ss) 算法:PyTorch官方针对ImageNet的样例 数据:ImageNet分类数据子集 1机1卡Vnt1 10 0:05:03 算法:YOLOX 数据:COCO2017 1机1卡Vnt1 10 03:33:13 1机8卡Vnt1 10 01:11:48 4机8卡Vnt1 10 0:36:17 算法:Swin-Transformer 数据:ImageNet21K 1机1卡Vnt1 10 197:25:03 1机8卡Vnt1 10 26:10:25 4机8卡Vnt1 10 07:08:44 表3 训练各步骤性能参考 步骤 说明 预计时长 镜像下载 首次下载镜像的时间(25G)。 8分钟 资源调度 点创建训练作业开始到变成运行中的时间(资源充足、镜像已缓存)。 20秒 训练列表页打开 已有50条训练作业,单击训练模块后的时间。 6秒 日志加载 作业运行中,已经输出1兆的日志文本,单击训练详情页面需要多久加载出日志。 2.5秒 训练详情页 作业运行中,没有用户日志情况下,在ModelArts控制台主页面单击训练详情页面后加载页面内容。 2.5秒 JupyterLab页面 进入JupyterLab页面后加载页面内容。 0.5秒 Notebook列表页 已有50个Notebook实例,在ModelArts控制台主页面单击开发环境后的时间。 4.5秒 镜像下载时间受节点规格、节点硬盘类型(高IO/普通IO)、是否SSD等因素影响,以上数据仅供参考。 父主题: 基于ModelArts Standard运行GPU训练作业
  • 请求示例 如下以创建名为“testConfig”,描述为“This is config”的训练作业参数为例。 POST https://endpoint/v1/{project_id}/training-job-configs { "config_name": "testConfig", "config_desc": "This is config", "worker_server_num": 1, "app_url": "/usr/app/", "boot_file_url": "/usr/app/boot.py", "parameter": [ { "label": "learning_rate", "value": "0.01" }, { "label": "batch_size", "value": "32" } ], "spec_id": 1, "dataset_id": "38277e62-9e59-48f4-8d89-c8cf41622c24", "dataset_version_id": "2ff0d6ba-c480-45ae-be41-09a8369bfc90", "engine_id": 1, "train_url": "/usr/train/", "log_url": "/usr/log/", "model_id": 1 }
  • 响应示例 成功响应示例 { "is_success": true, "job_id": "10", "job_name": "TestModelArtsJob", "status": "1", "create_time": "1524189990635", "version_id": "10", "version_name": "V0001", "resource_id": "jobafd08896" } 失败响应示例 { "is_success": false, "error_message": "Job name:TestModelArtsJob is existed", "error_code": "ModelArts.0103" }
  • 响应消息 响应参数如表9所示。 表9 响应参数 参数 参数类型 说明 is_success Boolean 请求是否成功。 error_message String 调用失败时的错误信息。 调用成功时无此字段。 error_code String 调用失败时的错误码,具体请参见错误码。 调用成功时无此字段。 job_id Long 训练作业的ID。 job_name String 训练作业的名称 status Int 训练作业的运行状态,详细作业状态列表请查看作业状态参考。 create_time Long 训练作业的创建时间,时间戳格式。 version_id Long 训练作业的版本ID。 resource_id String 训练作业的计费资源ID。 version_name String 训练作业的版本名称。
  • 请求示例 如下以创建名为“TestModelArtsJob”,描述为“This is a ModelArts job”为例。 POST https://endpoint/v1/{project_id}/training-jobs { "job_name": "TestModelArtsJob", "job_desc": "This is a ModelArts job", "workspace_id": "af261af2218841ec960b01ab3cf1a5fa", "config": { "worker_server_num": 1, "app_url": "/usr/app/", "boot_file_url": "/usr/app/boot.py", "parameter": [ { "label": "learning_rate", "value": "0.01" }, { "label": "batch_size", "value": "32" } ], "dataset_id": "38277e62-9e59-48f4-8d89-c8cf41622c24", "dataset_version_id": "2ff0d6ba-c480-45ae-be41-09a8369bfc90", "spec_id": 1, "engine_id": 1, "train_url": "/usr/train/", "log_url": "/usr/log/", "model_id": 1, "pool_id": "testpool" } } 如下以创建名为“TestModelArtsJob2”,创建 自定义镜像 训练。 POST https://endpoint/v1/{project_id}/training-jobs { "job_name": "TestModelArtsJob2", "job_desc": "This is a ModelArts job", "workspace_id": "af261af2218841ec960b01ab3cf1a5fa", "config": { "worker_server_num": 1, "data_url": "/usr/data/", "app_url": "/usr/app/", "boot_file_url": "/usr/app/boot.py", "parameter": [ { "label": "CUSTOM_PA RAM 1", "value": "1" } ], "spec_id": 1, "user_command": "bash -x /home/work/run_train.sh python /home/work/user-job-dir/app/mnist/mnist_softmax.py --data_url /home/work/user-job-dir/app/mnist_data", "user_image_url": "100.125.5.235:20202/jobmng/custom-cpu-base:1.0", "train_url": "/usr/train/", "log_url": "/usr/log/", "model_id": 1, "pool_id": "testpool", "engine_id": 1 } } 如下以创建名为“TestModelArtsJob3”,创建使用存储卷的训练。 POST https://endpoint/v1/{project_id}/training-jobs { "job_name": "TestModelArtsJob3", "job_desc": "This is a ModelArts job", "workspace_id": "af261af2218841ec960b01ab3cf1a5fa", "config": { "worker_server_num": 1, "app_url": "/usr/app/", "boot_file_url": "/usr/app/boot.py", "parameter": [ { "label": "learning_rate", "value": "0.01" }, { "label": "batch_size", "value": "32" } ], "dataset_id": "38277e62-9e59-48f4-8d89-c8cf41622c24", "dataset_version_id": "2ff0d6ba-c480-45ae-be41-09a8369bfc90", "spec_id": 1, "engine_id": 1, "train_url": "/usr/train/", "log_url": "/usr/log/", "model_id": 1, "pool_id": "testpool", "volumes": [ { "nfs": { "id": "43b37236-9afa-4855-8174-32254b9562e7", "src_path": "192.168.8.150:/", "dest_path": "/home/work/nas", "read_only": false } }, { "host_path": { "src_path": "/root/work", "dest_path": "/home/mind", "read_only": false } } ] } }
  • 查看训练日志 查看训练日志有2种方式,在OBS查看和在PyCharm ToolKit工具中查看。 在OBS查看训练日志 提交训练作业时,系统将自动在您配置的OBS Path中,使用作业名称创建一个新的文件夹,用于存储训练输出的模型、日志和代码。 例如“train-job-01”作业,提交作业时会在“test-modelarts2”桶下创建一个命名为“train-job-01”的文件夹,且此文件夹下分别新建了三个文件夹“output”、“log”、“code”,分别用于存储输出模型、日志和训练代码。“output”文件夹还会根据您的训练作业版本再创建子文件夹,结构示例如下。 test-modelarts2 |---train-job-01 |---output |---log |---code
  • 如何查看训练作业日志 在训练作业详情页,训练日志窗口提供日志预览、日志下载、日志中搜索关键字、系统日志过滤能力。 预览 系统日志窗口提供训练日志预览功能,如果训练作业有多个节点,则支持查看不同计算节点的日志,通过右侧下拉框可以选择目标节点预览。 图4 查看不同计算节日志 当日志文件过大时,系统日志窗口仅加载最新的部分日志,并在日志窗口上方提供全量日志访问链接。打开该链接可在新页面查看全部日志。 图5 查看全量日志 如果全部日志超过500M,可能会引起浏览页面卡顿,建议您直接下载日志查看。 预览链接在生成后的一小时内,支持任何人打开并查看。您可以分享链接至他人。 请注意日志中不能包含隐私内容,否则会造成信息泄露。 下载 训练日志仅保留30天,超过30天会被清理。如果用户需要永久保存日志,请单击系统日志窗口右上角下载按钮下载日志至本地保存,支持批量下载多节点日志。用户也可以在创建训练作业时打开永久保存日志按钮,保存训练日志至指定OBS路径。 针对使用Ascend规格创建的训练作业,部分系统日志暂不支持直接在训练日志窗口下载,请在创建训练作业时指定OBS路径用于保存训练日志。 图6 下载日志 搜索关键字 用户可以在系统日志右上角的搜索框搜索关键字,如图7所示。 图7 搜索关键字 系统支持高亮关键字并实现搜索结果间的跳转。搜索功能仅支持搜索当前页面加载的日志,如果日志加载不全(请关注页面提示)则需要下载或者通过打开全量日志访问链接进行搜索。全量日志访问链接打开的新页面可以通过Ctrl+F进行搜索。 系统日志过滤 图8 系统日志复选框 如果勾选了系统日志复选框,则日志中呈现系统日志和用户日志。如果去勾选,则只显示用户日志。
  • 训练日志定义 训练日志用于记录训练作业运行过程和异常信息,为快速定位作业运行中出现的问题提供详细信息。用户代码中的标准输出、标准错误信息会在训练日志中呈现。在ModelArts中训练作业遇到问题时,可首先查看日志,多数场景下的问题可以通过日志报错信息直接定位。 训练日志包括普通训练日志和Ascend相关日志。 普通日志说明:当使用Ascend之外的资源训练时仅产生普通训练日志,普通日志中包含训练进程日志、pip-requirement.txt安装日志和ModelArts平台日志。 Ascend场景日志说明:使用Ascend资源训练时会产生device日志、plog日志、proc log单卡训练日志、MindSpore日志、普通日志。 图1 ModelArts训练日志 只有MindSpore+Ascend训练场景下会产生单独的MindSpore日志。其他AI引擎的日志都包含在普通日志中,无法区分。
  • Ascend场景日志说明 使用Ascend资源运行训练作业时,会产生Ascend相关日志。Ascend训练场景下会生成device日志、plog日志、proc log单卡训练日志、MindSpore日志、普通日志。 其中,Ascend训练场景下的普通日志包括训练进程日志、pip-requirement.txt安装日志、ModelArts平台日志、ma-pre-start日志和davincirun日志。 Ascend日志结构举例说明如下: obs://dgg-test-user/snt9-test-cases/log-out/ # 作业日志路径 ├──modelarts-job-9ccf15f2-6610-42f9-ab99-059ba049a41e ├── ascend ├── process_log ├── rank_0 ├── plog # plog日志 ... ├── device-0 # device日志 ... ├── mindspore # MindSpore日志 ├──modelarts-job-95f661bd-1527-41b8-971c-eca55e513254-worker-0.log # 普通日志 ├──modelarts-job-95f661bd-1527-41b8-971c-eca55e513254-proc-rank-0-device-0.txt # proc log单卡训练日志 表2 Ascend场景下日志说明 日志类型 日志说明 日志文件名 device日志 HOST侧用户进程,在DEVICE侧产生的AICPU、HCCP的日志,回传到HOST侧(训练容器)。 如果出现如下情况,则device日志会获取不到。 节点异常重启 被主动停止的节点 在训练进程结束后,该日志会生成到训练容器中。其中,使用MindSpore预置框架训练的device日志会自动上传到OBS,使用其他预置框架和自定义镜像训练的device日志如果需要自动上传到OBS,则需要在代码中配置ASCEND_PRO CES S_ LOG _PATH,具体请参考如下示例。 # set npu plog env ma_vj_name=`echo ${MA_VJ_NAME} | sed 's:ma-job:modelarts-job:g'` task_name="worker-${VC_TASK_INDEX}" task_plog_path=${MA_LOG_DIR}/${ma_vj_name}/${task_name} mkdir -p ${task_plog_path} export ASCEND_PROCESS_LOG_PATH=${task_plog_path} “~/ascend/log/device-{device-id}/device-{pid}_{timestamp}.log” 其中,pid是HOST侧用户进程号。 样例: device-166_20220718191853764.log plog日志 HOST侧用户进程,在HOST侧产生的日志(例如:ACL /GE)。 plog日志会生成到训练容器中。其中,使用MindSpore预置框架训练的plog日志会自动上传到OBS,使用自定义镜像训练的plog日志如果需要自动上传到OBS,则需要在代码中配置ASCEND_PROCESS_LOG_PATH,具体请参考如下示例。 # set npu plog env ma_vj_name=`echo ${MA_VJ_NAME} | sed 's:ma-job:modelarts-job:g'` task_name="worker-${VC_TASK_INDEX}" task_plog_path=${MA_LOG_DIR}/${ma_vj_name}/${task_name} mkdir -p ${task_plog_path} export ASCEND_PROCESS_LOG_PATH=${task_plog_path} “~/ascend/log/plog/plog-{pid}_{timestamp}.log” 其中,pid是HOST侧用户进程号。 样例:plog-166_20220718191843620.log proc log proc log是单卡训练日志重定向文件,方便用户快速定位对应计算节点的日志。使用自定义镜像训练的作业不涉及proc log;使用预置框架训练的proc log日志会生成到训练容器中,且自动保存到OBS。 “[modelarts-job-uuid]-proc-rank-[rank id]-device-[device logic id].txt” device id为本次训练作业的NPU卡编号,取值单卡为0,8卡为0~7。 例如:Ascend规格为 8*Snt9时,device id取值为0~7;Ascend规格为 1*Snt9时,device id取值为0。 rank id为本次训练作业的全局NPU卡编号,取值为0~实例数*卡数-1,单个实例下,rank id与device id取值相同。 样例: modelarts-job-95f661bd-1527-41b8-971c-eca55e513254-proc-rank-0-device-0.txt MindSpore日志 使用MindSpore+Ascend训练时会产生单独的MindSpore日志。 MindSpore日志会生成到训练容器中。其中,使用MindSpore预置框架训练的plog日志会自动上传到OBS,使用自定义镜像训练的plog日志如果需要自动上传到OBS,则需要在代码中配置ASCEND_PROCESS_LOG_PATH,具体请参考如下示例。 # set npu plog env ma_vj_name=`echo ${MA_VJ_NAME} | sed 's:ma-job:modelarts-job:g'` task_name="worker-${VC_TASK_INDEX}" task_plog_path=${MA_LOG_DIR}/${ma_vj_name}/${task_name} mkdir -p ${task_plog_path} export ASCEND_PROCESS_LOG_PATH=${task_plog_path} MindSpore的日志介绍请参见MindSpore官网。 普通训练日志 普通训练日志会生成到训练容器的“/home/ma-user/modelarts/log”目录中,且自动上传到OBS。普通训练日志的类型如下所示。 ma-pre-start日志(Ascend场景特有):如果用户有定义ma-pre-start脚本,会产生该脚本执行日志。 davincirun日志(Ascend场景特有):Ascend训练进程通过davincirun.py文件启动,该启动文件产生的日志。 训练进程日志:用户训练代码的标准输出。 pip-requirement.txt安装日志:如果用户有定义pip-requirement.txt文件,会产生pip包安装日志。 ModelArts平台日志:ModelArts平台产生的系统日志,主要用于运维人员定位平台问题。 合并输出在日志文件modelarts-job-[job id]-[task id].log中。 task id表示实例ID,单节点时取值为worker-0,多节点时取值为worker-0、worker-1、...worker-{n-1},n为实例数。 样例: modelarts-job-95f661bd-1527-41b8-971c-eca55e513254-worker-0.log
  • 训练日志的时效性 从日志产生的时效性上可以分为以下3种情况: 实时日志:训练作业实时运行时产生,在ModelArts训练作业详情页面上可以查看。 历史日志:训练作业结束后,可以在ModelArts训练作业详情页面上查看历史日志,ModelArts系统自动保存30天。 永久日志:转存到OBS桶中的训练日志,在创建训练作业时,打开永久保存日志开关设置作业日志路径即可将日志转存至OBS路径。 图2 开启永久保存日志开关 实时日志和历史日志都是标准日志输出,内容上没有区别。Ascend训练场景下,永久日志中会包含Ascend日志,这部分日志内容在ModelArts界面上看不到。
  • 普通日志说明 普通日志中包含训练进程日志、pip-requirement.txt安装日志和ModelArts Standard平台日志。 表1 普通日志类型 日志类型 说明 训练进程日志 用户训练代码的标准输出。 pip-requirement.txt安装日志 如果用户有定义pip-requirement.txt文件,会产生pip包安装日志。 ModelArts平台日志 ModelArts平台产生的系统日志,主要用于运维人员定位平台问题。 普通日志的文件格式如下,其中task id为训练作业中的节点id。 统一日志格式:modelarts-job-[job id]-[task id].log 样例:log/modelarts-job-95f661bd-1527-41b8-971c-eca55e513254-worker-0.log 单机训练作业只会生成一个日志文件,单机作业的task id默认为worker-0。 分布式场景下有多个节点日志文件并存,通过task id区分不同节点,例如:worker-0,worker-1等。 训练进程日志、“pip-requirement.txt”安装日志和ModelArts平台日志都包含在普通日志文件“modelarts-job-[job id]-[task id].log”中。 ModelArts平台日志可以通过关键字在训练的普通日志文件“modelarts-job-[job id]-[task id].log”中筛查,筛查关键字有:“[ModelArts Service Log]”或“Platform=ModelArts-Service”。 类型一:[ModelArts Service Log] xxx [ModelArts Service Log][init] download code_url: s3://dgg-test-user/snt9-test-cases/mindspore/lenet/ 类型二:time=“xxx” level=“xxx” msg=“xxx” file=“xxx” Command=xxx Component=xxx Platform=xxx time="2021-07-26T19:24:11+08:00" level=info msg="start the periodic upload task, upload period = 5 seconds " file="upload.go:46" Command=obs/upload Component=ma-training-toolkit Platform=ModelArts-Service
  • 使用SDK调测单机训练作业 代码中涉及到的OBS路径,请用户替换为自己的实际OBS路径。 代码是以PyTorch为例编写的,不同的AI框架之间,整体流程是完全相同的,仅需修改6和10中的framework_type参数值即可,例如:MindSpore框架,此处framework_type=Ascend-Powered-Engine。 Session初始化。 代码如下:这里只列出最常用的一种方式,更多方式请参考《Session鉴权章节》 from modelarts.session import Session session = Session() 准备训练数据,这里支持三种形式,用户可根据自己的情况选择一种。 import os from modelarts.train_params import InputData base_bucket_path = "obs://modelarts-xxx-a0de02a6/dis-train/cifar10/" base_local_path = "/home/ma-user/work/cifar10/" # 形式1,数据在OBS上,且是一个压缩文件 obs_path = os.path.join(base_bucket_path, "dataset-zip/dataset.zip") data_local = os.path.join(base_local_path, "dataset/") input_data = InputData(obs_path=obs_path, local_path=data_local, is_local_source=False) # 形式2,数据在OBS上,且是一个目录 #obs_path = os.path.join(base_bucket_path, "dataset/") #data_local = os.path.join(base_local_path, "dataset/") #input_data = InputData(obs_path=obs_path, local_path=data_local, is_local_source=False) # 形式3,数据在Notebook中,且是一个目录,一般是使用SFS挂载磁盘的场景 #obs_path = os.path.join(base_bucket_path, "dataset-local/") #data_local = os.path.join(base_local_path, "dataset/") #input_data = InputData(obs_path=obs_path, local_path=data_local, is_local_source=True) 参数解释: is_local_source:可选参数,默认为False,指定训练数据的保存位置。 False:训练数据保存在参数obs_path指定的位置中; True:训练数据保存在notebook中,由local_path指定。 obs_path:obs地址。根据is_local_source值的变化,有不同的含义。 is_local_source=False,此时是必选参数,代表训练数据位置,支持文件夹和压缩文件。 is_local_source=True,此时是可选参数。如果用户填写了该参数,则开始训练时会将Notebook中的训练数据压缩并上传到该位置,不可重复上传。如果第一次上传后,建议将is_local_source修改为False,obs_path指向刚才上传的压缩数据文件位置;如果用户没有填写,则不会进行压缩上传。 local_path:必选参数,Notebook中的路径。用户的训练脚本需要从该目录中读取数据,完成训练任务。根据is_local_source值的变化,有不同的含义。 is_local_source=True,此时代表训练数据位置,仅支持文件夹。 is_local_source=False,训练过程中SDK会帮助用户将数据下载到该位置,如果训练数据是压缩文件,下载完成后会进行解压缩。 准备训练脚本。 from modelarts.train_params import TrainingFiles code_dir = os.path.join(base_local_path, "train/") # 这里提前将训练脚本放在了obs中,实际上训练脚本可以是任何来源,只要能够放到Notebook里边就行 session.obs.download_file(os.path.join(base_bucket_path, "train/test-pytorch.py"), code_dir) training_file = TrainingFiles(code_dir=code_dir, boot_file="test-pytorch.py", obs_path=base_bucket_path + 'train/') 参数解释: code_dir:必选参数,训练脚本所在的目录。在训练任务调测的情况下,必须是notebook中的目录,不能是OBS目录。 boot_file:必选参数,训练启动文件路径,路径格式为基于code_dir目录的相对路径,如实例代码中boot_file的完整路径为/home/ma-user/work/cifar10/train/test-pytorch.py,这里就只需要填写test-pytorch.py。 obs_path:可选参数,一个OBS目录。仅在本地单机调试时不需要该参数,提交远程训练时必选,会将训练脚本压缩并上传到该路径。 准备训练输出,如果用户不需要将训练输出上传到OBS,可以省略这一步。 from modelarts.train_params import OutputData output = OutputData(local_path=os.path.join(base_local_path, "output/"), obs_path=os.path.join(base_bucket_path, 'output/')) local_path:必选参数,一个notebook中的路径,训练脚本需要将输出的模型或其他数据保存在该目录下。 obs_path:必选参数,一个OBS目录。SDK会将local_path中的模型文件自动上传到这里。 查看训练支持的AI框架。 from modelarts.estimatorV2 import Estimator Estimator.get_framework_list(session) 参数session即是第一步初始化的数据。如果用户知道要使用的AI框架,可以略过这一步。 Estimator初始化。 from modelarts.estimatorV2 import Estimator parameters = [] parameters.append({"name": "data_url", "value": data_local}) parameters.append({"name": "output_dir", "value": os.path.join(base_local_path, "output/")}) parameters.append({"name": "epoc_num", "value": 2}) estimator = Estimator(session=session, training_files=training_file, outputs=[output], parameters=parameters, framework_type='PyTorch', train_instance_type='local', train_instance_count=1, script_interpreter="/home/ma-user/anaconda3/envs/PyTorch-1.4/bin/python", log_url=base_bucket_path + 'log/', job_description='This is a image net train job') 参数解释: session:必选参数,1中初始化的参数。 training_files:必选参数,3中初始化的训练文件。 outputs:可选参数,这里传入的是一个list,每个元素都是4中初始化的训练输出。 parameters:可选参数,一个list,每个元素都是一个字典,包含"name"和"value"两个字段,以"--name=value"的形式传递给训练启动文件。value支持字符串,整数,布尔等类型。对于布尔类型,建议用户在训练脚本中使用action='store_true'的形式来解析。 framework_type:必选参数,训练作业使用的AI框架类型,可参考步骤5查询的返回结果。 train_instance_type:必选参数,训练实例类型,这里指定'local'即为在notebook中进行训练。 train_instance_count:必选参数,训练使用的worker个数,单机训练时为1,训练作业只在当前使用的notebook中运行。 script_interpreter:可选参数,指定使用哪个python环境来执行训练任务,如果未指定,会默认使用当前的kernel。 log_url:可选参数,一个OBS地址,训练过程中,SDK会自动将训练的日志上传到该位置。但是如果训练任务运行在Ascend上,则是必选参数。 job_description:可选参数,训练任务的描述。 开始训练。 estimator.fit(inputs=[input_data], job_name="cifar10-dis") 参数解释: inputs:可选参数,一个list,每个元素都是2生成的实例。 job_name:可选参数,训练任务名,便于区分和记忆。 本地单机调试训练任务开始后,SDK会依次帮助用户完成以下流程: 初始化训练作业,如果2指定的训练数据在OBS上,这里会将数据下载到local_path中。 执行训练任务,用户的训练代码需要将训练输出保存在4中指定的local_path中。 将训练任务得到的输出上传到4指定的obs_path中,日志上传到第六步指定的log_url中。 同时,可以在任务名后增加时间后缀,区分不同的任务名称。 from datetime import datetime, timedelta import time base_name = "cifar10-dis" job_name = base_name + '-' + (datetime.now() + timedelta(hours=8)).strftime('%Y%m%d-%H%M%S') estimator.fit(inputs=[input_data], job_name=job_name) 多次调试。 上一步执行过程中,训练脚本的日志会实时打印到控制台,如果用户的代码或者参数有误的话,可以很方便的看到。在Notebook中经过多次调试,得到想要的结果后,可以进行下一步。 查询训练支持的计算节点类型和最大个数。 from modelarts.estimatorV2 import Estimator Estimator.get_spec_list(session=session) 参数session即是1初始化的数据。返回的是一个字典,其中flavors值是一个列表,描述了训练服务支持的所有规格的信息。每个元素中flavor_id是可直接用于远程训练任务的计算规格,max_num是该规格的最大节点数。如果用户知道要使用的计算规格,可以略过这一步。 提交远程训练作业。 from modelarts.estimatorV2 import Estimator parameters = [] parameters.append({"name": "data_url", "value": data_local}) parameters.append({"name": "output_dir", "value": os.path.join(base_local_path, "output/")}) parameters.append({"name": "epoch_num", "value": 2}) estimator = Estimator(session=session, training_files=training_file, outputs=[output], parameters=parameters, framework_type='PyTorch', train_instance_type='modelarts.vm.cpu.8u', train_instance_count=1, script_interpreter="/home/ma-user/anaconda3/envs/PyTorch-1.4/bin/python", log_url=base_bucket_path + 'log/', job_description='This is a image net train job') estimator.fit(inputs=[input_data], job_name="cifar10-dis") 在本地调测完成的基础上,只需要Estimator初始化时将参数train_instance_type修改为训练服务支持的规格即可(即第10步查询出来的flavor_id的值)。执行fit函数后,即可提交远程训练任务。 训练任务提交后,SDK会依次帮助用户完成以下流程: 将训练脚本打包成zip文件,上传到3中指定的obs_path中。 当训练数据保存在Notebook中,则将其打包成zip文件并上传到指定的obs_path中。 向ModelArts训练服务提交自定义镜像训练作业,使用的镜像为当前Notebook的镜像,这样保证了远程训练作业和在Notebook中的训练作业使用的运行环境一致。 训练任务得到的输出上传到4指定的obs_path中,日志上传到这一步log_url指定的位置中。 在这一步中需要注意的一个问题: 如果用户在自己的训练脚本中要创建新的目录或文件,请在以下几种目录中创建: /home/ma-user/work; /cache; inputs或者outputs中指定的local_path,如在步骤2中初始化InputData时,填写了local_path="/home/ma-user/work/xx/yy/",则在该目录下也可以创建新目录或文件。 父主题: 训练作业调测
  • 处理方法 请您对作业代码进行排查分析,确认是否对训练代码和参数进行过修改。 检查资源分配情况(cpu/mem/gpu/snt9/infiniband)是否符合预期。 通过CloudShell登录到Linux工作页面,检查GPU工作情况: 通过输入“nvidia-smi”命令,查看GPU工作是否异常。 通过输入“nvidia-smi -q -d TEMPERATURE”命令, 查看TEMP参数是否存在异常, 如果温度过高,会导致训练性能下降。
  • 处理步骤 进入训练作业详情页,在左侧获取SFS Turbo的名称。 图1 获取SFS Turbo的名称 登录弹性文件服务SFS控制台,在SFS Turbo列表找到训练作业挂载的SFS Turbo,单击名称进入详情页。获取VPC信息、安全组信息和endpoint信息。 VPC信息:SFS Turbo详情页的“虚拟私有云”。 安全组信息:SFS Turbo详情页的“安全组”。 endpoint信息:SFS Turbo详情页的“共享路径”,去除“:/”即为sfs-turbo-endpoint。例如共享路径为“4ab556b5-d689-44f1-9302-24c09daxxxxc.sfsturbo.internal:/”,则sfs-turbo-endpoint为“4ab556b5-d689-44f1-9302-24c09daxxxxc.sfsturbo.internal”。 查看SFS Turbo的VPC网段是否满足如下2个条件。 条件一:SFS Turbo网段不能与192.168.20.0/24重叠,否则会和专属资源池的网段发生冲突,因为专属资源池的默认网段为192.168.20.0/24。专属资源池实际使用的网段可以在资源池的详情页面查看“网络”获取。 条件二:SFS Turbo网段不能与172网段重叠,否则会和容器网络发生冲突,因为容器网络使用的是172网段。 如果不满足条件,则修改SFS Turbo的VPC网段,推荐网段为10.X.X.X。具体操作请参见修改虚拟私有云网段。 如果满足条件,则继续下一步。 查看SFS Turbo的VPC网段的安全组是否被限制了。 在所选专属资源池中新建一个未挂载的SFS Turbo的训练作业,当训练作业处于“运行中”时,通过Cloud Shell功能登录训练作业worker-0实例,使用curl {sfs-turbo-endpoint}:{port}命令检查port是否正常打开,SFS Turbo所需要入方向的端口号为111、445、2049、2051、2052、20048,具体请参见创建文件系统的“安全组”参数。Cloud Shell功能的操作指导请参见使用CloudShell登录训练容器。 是,则修改安全组的配置,具体操作请参见修改安全组规则。 否,则继续下一步。 确认SFS Turbo是否存在异常。 新建一个和SFS Turbo在同一个网段的ECS,用ECS去挂载SFS Turbo,如果挂载失败,则表示SFS Turbo异常。 是,联系SFS服务的技术支持处理。 否,联系ModelArts的技术支持处理。
  • 处理步骤 查询训练作业的日志和监控信息,是否存在明确的OOM报错信息。 是,训练作业的日志里存在OOM报错,执行2。 否,训练作业的日志里没有OOM报错,但是存在监控指标异常,执行3。 排查训练代码是否存在不断占用资源的代码,使得资源未被合理使用。 是,优化代码,等待作业运行正常。 否,提高训练作业使用的资源规格或者联系技术支持。 重启训练作业,使用CloudShell登录训练容器监控内存指标,确认是否有突发性的内存增加现象。 是,排查内存突发增加的时间点附近的训练作业日志,优化对应的代码逻辑,减少内存申请。 否,提高训练作业使用的资源规格或者联系技术支持。