使用自定义镜像创建训练作业(CPU/GPU)
模型训练是一个不断迭代和优化的过程。在训练模块的统一管理下,方便用户试验算法、数据和超参数的各种组合,便于追踪最佳的模型与输入配置,您可以通过不同版本间的评估指标比较,确定最佳训练作业。
前提条件
- 已将用于训练的数据上传至OBS目录。
- 已在OBS创建至少1个空的文件夹,用于存储训练输出的内容。
- 已按照ModelArts规范制作自定义镜像包,自定义镜像包规范请参见训练作业自定义镜像规范。
- 已将自定义镜像上传至SWR服务,操作指导可参见如何登录并上传镜像到SWR。
创建训练作业
- 登录ModelArts管理控制台,在左侧导航栏中选择“模型训练 > 训练作业”,进入“训练作业”列表。
- 单击“创建训练作业”,进入创建训练作业页面,填写训练作业相关参数。
表1 创建训练作业的创建方式(使用自定义镜像) 参数名称
说明
创建方式
必选,选择“自定义算法”。
启动方式
必选,选择“自定义”。
镜像
必填,填写容器镜像的地址。
容器镜像地址的填写支持如下方式。- 选择自有镜像或他人共享的镜像:单击右边的“选择”,从容器镜像中选择用于训练的容器镜像。所需镜像需要提前上传到SWR服务中。
- 选择公开镜像:直接输入SWR服务中公开镜像的地址。地址直接填写“组织名称/镜像名称:版本名称”,不需要带域名信息,系统会自动拼接域名地址。
代码目录
选择训练代码文件所在的OBS目录。如果自定义镜像中不含训练代码则需要配置该参数,如果自定义镜像中已包含训练代码则不需要配置。
- 需要提前将代码上传至OBS桶中,目录内文件总大小要小于或等于5GB,文件数要小于或等于1000个,文件深度要小于或等于32。
- 训练代码文件会在训练作业启动的时候被系统自动下载到训练容器的“${MA_JOB_DIR}/demo-code”目录中,“demo-code”为存放代码目录的最后一级OBS目录。例如,“代码目录”选择的是“/test/code”,则训练代码文件会被下载到训练容器的“${MA_JOB_DIR}/code”目录中。
运行用户ID
容器运行时的用户ID,该参数为选填参数,建议使用默认值1000。
如果需要指定uid,则uid数值需要在规定范围内,不同资源池的uid范围如下:
- 公共资源池:1000-65535
- 专属资源池:0-65535
启动命令
必填,镜像的启动命令。
运行训练作业时,当“代码目录”下载完成后,“启动命令”会被自动执行。- 如果训练启动脚本用的是py文件,例如“train.py”,则启动命令如下所示。
python ${MA_JOB_DIR}/demo-code/train.py
- 如果训练启动脚本用的是sh文件,例如“main.sh”,则启动命令如下所示。
bash ${MA_JOB_DIR}/demo-code/main.sh
启动命令支持使用“;”和“&&”拼接多条命令,命令中的“demo-code”为存放代码目录的最后一级OBS目录,以实际情况为准。
说明:为保证数据安全,请勿输入敏感信息,例如明文密码。
本地代码目录
指定训练容器的本地目录,启动训练时系统会将代码目录下载至此目录。
此参数可选,默认本地代码目录为“/home/ma-user/modelarts/user-job-dir”。
工作目录
训练时,系统会自动cd到此目录下执行启动文件。
表2 创建训练作业的训练参数 参数名称
子参数
说明
输入
参数名称
算法代码需要通过“输入”的“参数名称”去读取训练的输入数据。
建议设置为“data_url”,和训练代码中解析输入数据的参数保持一致。此处可以设置多条训练输入参数。训练输入参数名称不可以重名。
例如,训练代码中使用argparse解析data_url为输入数据超参,则在此处需要配置输入数据代码参数名称为data_url。
import argparse # 创建解析 parser = argparse.ArgumentParser(description="train mnist", formatter_class=argparse.ArgumentDefaultsHelpFormatter) # 添加参数 parser.add_argument('--train_url', type=str, help='the path model saved') parser.add_argument('--data_url', type=str, help='the training data') # 解析参数 args, unknown = parser.parse_known_args()
数据集
单击“数据集”,在ModelArts数据集列表中勾选目标数据集并选择对应的版本。
训练启动时,系统将自动下载输入路径中的数据到训练运行容器。
说明:ModelArts数据管理模块在重构升级中,对未使用过数据管理的用户不可见。建议新用户将训练数据存放至OBS桶中使用。
数据存储位置
单击“数据存储位置”,从OBS桶中选择训练输入数据的存储位置。
训练启动时,系统将自动下载输入路径中的数据到训练运行容器。
获取方式
以参数名称为“data_path”的训练输入为例,说明获取方式的作用。
- 当参数的“获取方式”为“超参”时,可以参考如下代码来读取数据。
import argparse parser = argparse.ArgumentParser() parser.add_argument('--data_path') args, unknown = parser.parse_known_args() data_path = args.data_path
- 当参数的“获取方式”为“环境变量”时,可以参考如下代码来读取数据。
import os data_path = os.getenv("data_path", "")
输出
参数名称
算法代码需要通过“输出”的“参数名称”去读取训练的输出目录。
建议设置为“train_url”,和训练代码中解析输出数据的参数保持一致。此处也可以设置多条训练输出参数。训练输出参数名称不可以重名。
数据存储位置
单击“数据存储位置”,从OBS桶中选择训练输出数据的存储位置。训练过程中,系统将自动从训练容器的本地代码目录下同步文件到数据存储位置。
说明:数据存储位置仅支持OBS路径。为避免数据存储冲突,建议选择一个空目录用作“数据存储位置”。
获取方式
以参数名称为“train_url”的训练输出为例,说明获取方式的作用。
- 当参数的“获取方式”为“超参”时,可以参考如下代码来读取数据。
import argparse parser = argparse.ArgumentParser() parser.add_argument('--train_url') args, unknown = parser.parse_known_args() train_url = args.train_url
- 当参数的“获取方式”为“环境变量”时,可以参考如下代码来读取数据。
import os train_url = os.getenv("train_url", "")
预下载至本地目录
选择是否将输出目录下的文件预下载至本地目录。
- 不下载:表示启动训练作业时不会将输出数据的存储位置中的文件下载到训练容器的本地代码目录中。
- 下载:表示系统会在启动训练作业时自动将输出数据的存储位置中的所有文件下载到训练容器的本地代码目录中。下载时间会随着文件变大而变长,为了防止训练时间过长,请及时清理训练容器的本地代码目录中的无用文件。如果要使用断点续训练和增量训练,则必须选择“下载”。
超参
-
可选,超参用于训练调优。
环境变量
-
根据业务需求增加环境变量。训练容器中预置的环境变量请参见查看训练容器环境变量。
自动重启
-
打开开关后,可以设置重启次数和是否启用无条件自动重启。
打开自动重启开关后,当由于环境问题导致训练作业异常时,系统将自动修复异常或隔离节点,并重启训练作业,提高训练成功率。为了避免丢失训练进度、浪费算力,开启此功能前请确认代码已适配断点续训。
重启次数的取值范围是1~128,缺省值为3。创建训练后不支持修改重启次数,请合理设置次数。
勾选无条件自动重启后,只要系统检测到训练异常,就无条件重启训练作业。为了避免无效重启浪费算力资源,系统最多只支持连续无条件重启3次。
当训练过程中触发了自动重启,则系统会记录重启信息,在训练作业详情页可以查看故障恢复详情。
- 选择训练资源的规格。训练参数的可选范围与已有自定义镜像的使用约束保持一致。根据需要选择公共资源池或专属资源池,参数说明请参创建训练作业。
- 单击“提交”,完成训练作业的创建。
训练作业一般需要运行一段时间。
要查看训练作业实时情况,您可以前往训练作业列表,单击训练作业的名称,进入训练作业详情页,查看训练作业的基本情况。