更新时间:2024-10-24 GMT+08:00

已有镜像迁移至ModelArts用于训练模型

场景描述

本地已有镜像,需要做云上适配,用于ModelArts模型训练。

操作步骤

  1. 参考如下Dockerfile,修改已有镜像,使其符合模型训练的自定义镜像规范。
    FROM {已有镜像}
    
    USER root
    
    # 如果已存在 gid = 100 用户组,则删除 groupadd 命令。
    RUN groupadd ma-group -g 100
    # 如果已存在 uid = 1000 用户,则删除 useradd 命令。
    RUN useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user
    
    # 修改镜像中相关文件权限,使得 ma-user, uid = 1000 用户可读写。
    RUN chown -R ma-user:100 {Python软件包路径}
    
    # 设置容器镜像预置环境变量。
    # 请务必设置 PYTHONUNBUFFERED=1, 以免日志丢失。
    ENV PYTHONUNBUFFERED=1
    
    # 设置容器镜像默认用户与工作目录。
    USER ma-user
    WORKDIR /home/ma-user

    Dockerfile需要重点关注以下几点:

    1. 为镜像增加模型训练的默认用户组ma-group,“gid = 100”

      如果已存在“gid = 100”用户组,可能会报错“groupadd: GID '100' already exists”。可通过命令“cat /etc/group | grep 100”查询是否已存在gid = 100用户组。

      如果已存在“gid = 100”用户组,则该步骤跳过,下文Dockerfile中删除“RUN groupadd ma-group -g 100”命令。

    2. 为镜像增加模型训练的默认用户ma-user,“uid = 1000”

      如果已存在“uid = 1000”用户,可能会报错“useradd: UID 1000 is not unique”。可通过命令“cat /etc/passwd | grep 1000”查询是否已存在uid = 1000用户。

      如果已存在“uid = 1000”用户,则该步骤跳过,下文Dockerfile中删除“RUN useradd -d /home/ma-user -m -u 1000 -g 100 -s /bin/bash ma-user”命令。

    3. 修改镜像中相关文件权限,使得ma-user,“uid = 1000”用户可读写。
  2. 编写好Dockerfile后,通过执行如下所示命令进行新镜像构建。
    docker build -f Dockerfile . -t {新镜像} 
  3. 构建成功后将新镜像上传至SWR(参考6)。
  4. 在ModelArts上创建训练作业。
    1. 登录ModelArts管理控制台。
    2. 在左侧导航栏中,选择模型训练 > 训练作业进入训练作业列表。
    3. 单击“创建训练作业”,进入创建训练作业页面,填写作业信息,创建方式参考表1,其他参数填写请参考创建训练作业
      表1 创建训练作业的创建方式(使用自定义镜像)

      参数名称

      说明

      创建方式

      必选,选择“自定义算法”

      启动方式

      必选,选择“自定义”

      镜像

      必填,单击右边的“选择”,从容器镜像中选择上一步上传到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到此目录下执行启动文件。