更新时间:2024-11-22 GMT+08:00

使用预置镜像制作自定义镜像用于训练模型

使用预置框架构建自定义镜像原理介绍

如果先前基于预置框架且通过指定代码目录和启动文件的方式来创建的训练作业;但是随着业务逻辑的逐渐复杂,您期望可以基于预置框架修改或增加一些软件依赖的时候,可以使用预置框架构建自定义镜像,即在创建训练作业页面选择预置框架名称后,在预置框架版本下拉列表中选择“自定义”。

该方式的训练流程与直接基于预置框架创建的训练作业相同,例如:

  • 系统会自动注入一系列环境变量,如下所示。
    • PATH=${MA_HOME}/anaconda/bin:${PATH}
    • LD_LIBRARY_PATH=${MA_HOME}/anaconda/lib:${LD_LIBRARY_PATH}
    • PYTHONPATH=${MA_JOB_DIR}:${PYTHONPATH}
  • 选择的启动文件将会被系统自动以python命令直接启动,因此请确保镜像中的Python命令为您预期的Python环境。通过系统自动注入的PATH环境变量,可以参考下述命令确认训练作业最终使用的Python版本。
    • export MA_HOME=/home/ma-user; docker run --rm {image} ${MA_HOME}/anaconda/bin/python -V
    • docker run --rm {image} $(which python) -V
  • 系统会自动添加预置框架关联的超参。

使用预置框架构建训练镜像

ModelArts平台提供了Tensorflow,PyTorch,MindSpore等常用深度学习任务的基础镜像,镜像里已经安装好运行任务所需软件。当基础镜像里的软件无法满足您的程序运行需求时,您可以基于这些基础镜像制作一个新的镜像并进行训练。

您可以参考如下步骤基于训练基础镜像来构建新镜像。

  1. 安装Docker。如果docker images命令可以执行成功,表示Docker已安装,此步骤可跳过。

    以linux x86_64架构的操作系统为例,获取Docker安装包。您可以使用以下指令安装Docker。

    curl -fsSL get.docker.com -o get-docker.sh
    sh get-docker.sh
  2. 准备名为context的文件夹。
    mkdir -p context
  3. 准备可用的pip源文件pip.conf 。
    [global]
    index-url = https://repo.huaweicloud.com/repository/pypi/simple
    trusted-host = repo.huaweicloud.com
    timeout = 120
  4. 参考如下Dockerfile文件内容来基于ModelArts提供的训练基础镜像来构建一个新镜像。将编写好的Dockerfile文件放置在context文件夹内。训练基础镜像地址请参见训练专属预置镜像列表
    FROM {ModelArts提供的训练基础镜像地址}
    
    # 配置pip
    RUN mkdir -p /home/ma-user/.pip/
    COPY --chown=ma-user:ma-group pip.conf /home/ma-user/.pip/pip.conf
    
    # 设置容器镜像预置环境变量
    # 将python解释器路径加入到PATH环境变量中
    # 请务必设置PYTHONUNBUFFERED=1, 以免日志丢失
    ENV PATH=${ANACONDA_DIR}/envs/${ENV_NAME}/bin:$PATH \
        PYTHONUNBUFFERED=1
    
    RUN /home/ma-user/anaconda/bin/pip install --no-cache-dir numpy
  5. 构建新镜像。在Dockerfile文件所在的目录执行如下命令构建容器镜像training:v1。
    docker build . -t training:v1
  6. 将构建好的新镜像上传至SWR。
    1. 登录容器镜像服务控制台,选择区域。
    2. 单击右上角“创建组织”,输入组织名称完成组织创建。您可以自定义组织名称,本示例使用“deep-learning”,实际操作时请重新命名一个组织名称。后续所有命令中使用到组织名称deep-learning时,均需要替换为此处实际创建的组织名称。
    3. 单击右上角“登录指令”,获取登录访问指令。以root用户登录ECS环境,输入登录指令。
      图1 在ECS中执行登录指令
    4. 登录SWR后,使用docker tag命令给上传镜像打标签。下面命令中的组织名称deep-learning,请替换为a.登录容器镜像服务控制台,选择区域。中实际创建的组织名称,以下所有命令中的deep-learning都需要替换。
      sudo docker tag tf-1.13.2:latest swr.实际域名.com/deep-learning/tf-1.13.2:latest
    5. 使用docker push命令上传镜像。
      sudo docker push swr.实际域名.com/deep-learning/tf-1.13.2:latest
    6. 完成镜像上传后,在“容器镜像服务控制台>我的镜像”页面可查看已上传的自定义镜像。

      “swr.<region>.myhuaweicloud.com/deep-learning/tf-1.13.2:latest”即为此自定义镜像的“SWR_URL”。

  7. 在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”目录中。

      启动文件

      必填,选择代码目录中训练作业的Python启动脚本。

      ModelArts只支持使用Python语言编写的启动文件,因此启动文件必须以“.py”结尾。