更新时间:2024-12-24 gmt 08:00

从0制作自定义镜像用于创建训练作业(pytorch ascend)-九游平台

本章节介绍如何从0到1制作镜像,并使用该镜像在modelarts平台上进行训练。镜像中使用的ai引擎是pytorch,训练使用的资源是专属资源池的ascend芯片。

准备工作

准备一套可以连接外部网络,装有linux系统并安装18.09.7及以上版本docker的虚拟机或物理机用作镜像构建节点,以下称“构建节点”。

可以通过执行docker pull、apt-get update/upgrade和pip install命令判断是否可正常访问外部可用的开源软件仓库,若可以正常访问表示环境已连接外部网络。

  • 上述的虚拟机或物理机需要为arm64架构。
  • 建议构建节点安装的linux系统版本为ubuntu 18.04。
  • 本指导使用/opt目录作为构建任务承载目录,请确保该目录下可用存储空间大于30gb。
  • docker的安装可以参考官方文档:。miniconda与tflite安装包为第三方安装包,modelarts不对其安全相关问题进行负责,如用户有安全方面的需求,可以对该安装包进行加固后发布成同样名称的文件上传到构建节点。

制作自定义镜像

  1. 确认docker engine版本。执行如下命令。
    docker version | grep -a 1 engine
    命令回显如下。
    engine:   
     version: 18.09.0

    推荐使用大于等于该版本的docker engine来制作自定义镜像。

  2. 准备名为context的文件夹。
    mkdir -p context
  3. 准备可用的pip源文件pip.conf 。本示例使用华为开源镜像站提供的pip源,其pip.conf文件内容如下。
    [global]
    index-url = 
    https://repo.huaweicloud.com/repository/pypi/simple
    trusted-host = 
    repo.huaweicloud.com
    timeout = 120

    在华为中,搜索pypi,可以查看pip.conf文件内容。

  4. 准备可用的apt源文件ubuntu-ports-bionic.list。本示例使用华为开源镜像站提供的apt源,执行如下命令获取apt源文件。
    wget -o ubuntu-ports-bionic.list --no-check-certificate 
    https://repo.huaweicloud.com/repository/conf/ubuntu-ports-bionic.list

    在华为中,搜索ubuntu-ports,可以查看获取apt源文件的命令。

  5. 下载ascend-cann-nnae_7.0.0_linux-aarch64.run与torch-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl以及torch_npu-2.1.0.post7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl安装文件。
    • 下载ascend-cann-nnae_7.0.0_linux-aarch64.run文件:请根据您的用户类型打开下方对应的链接。版本过滤选择cann7,筛选后版本单击cann7.0.0链接,然后页面中找到ascend-cann-nnae_7.0.0_linux-aarch64.run并下载。
      • 企业用户:。
      • 运营商用户:。
    • 下载torch-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl文件:请单击下载。
    • 下载torch_npu-2.1.0.post7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl文件:请单击下载。

    modelarts当前仅支持cann商用版本,不支持社区版。

  6. 下载miniconda3安装文件。

    使用地址,下载miniconda3-py39_24.5.0-0安装文件(对应python 3.9)。

    如果需要其他版本的python,可以从下载,需注意mindspore要下载对应其python版本的包,上下文版本替换要保持一致。

  7. 将上述pip源文件、*.list文件、*.run文件、 *.whl文件、miniconda3安装文件放置在context文件夹内,context文件夹内容如下。
    context 
    ├── ascend-cann-nnae_7.0.0_linux-aarch64.run 
    ├── torch-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl 
    ├── miniconda3-py39_24.5.0-0-linux-aarch64.sh 
    ├── torch_npu-2.1.0.post7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
    ├── pip.conf 
    └── ubuntu-ports-bionic.list
  8. 编写容器镜像dockerfile文件。
    在context文件夹内新建名为dockerfile的空文件,并将下述内容写入其中。
    # 容器镜像构建主机需要连通公网
    from ubuntu:18.04 as builder
    # 基础容器镜像的默认用户已经是 root
    # user root
    # 安装 os 依赖(使用华为开源镜像站)
    copy ubuntu-ports-bionic.list /tmp
    run cp -a /etc/apt/sources.list /etc/apt/sources.list.bak && \
        mv /tmp/ubuntu-ports-bionic.list /etc/apt/sources.list && \
        echo > /etc/apt/apt.conf.d/00skip-verify-peer.conf "acquire { https::verify-peer false }" && \
        apt-get update && \
        apt-get install -y \
        # utils
        ca-certificates vim curl \
        # cann 7.0.0
        gcc g   make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 libopenblas-dev \
        # mindspore 2.2.0
        libgmp-dev && \
        apt-get clean && \
        mv /etc/apt/sources.list.bak /etc/apt/sources.list && \
        # 修改 cann 7.0.0 安装目录的父目录权限,使得 ma-user 可以写入
        chmod o w /usr/local
    run useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user
    # 设置容器镜像默认用户与工作目录
    user ma-user
    workdir /home/ma-user
    # 使用华为开源镜像站提供的 pypi 配置
    run mkdir -p /home/ma-user/.pip/
    copy --chown=ma-user:100 pip.conf /home/ma-user/.pip/pip.conf
    # 复制待安装文件到基础容器镜像中的 /tmp 目录
    copy --chown=ma-user:100 miniconda3-py39_24.5.0-0-linux-aarch64.sh /tmp
    # https://conda.io/projects/conda/en/latest/user-guide/install/linux.html#installing-on-linux
    # 安装 miniconda3 到基础容器镜像的 /home/ma-user/miniconda3 目录中
    run bash /tmp/miniconda3-py39_24.5.0-0-linux-aarch64.sh -b -p /home/ma-user/miniconda3
                                                                                                                                                                                                                                                                                                                                                                
    env path=$path:/home/ma-user/miniconda3/bin
    # 安装 cann 7.0.0 python package 依赖
    run pip install numpy~=1.19.2 decorator~=4.4.0 sympy~=1.5.1 cffi~=1.12.3 protobuf~=3.13.0 \
        attrs pyyaml pathlib2 scipy requests psutil absl-py
    # 安装 cann 7.0.0 至 /usr/local/ascend 目录
    copy --chown=ma-user:100 ascend-cann-nnae_7.0.0_linux-aarch64.run /tmp
    run chmod  x /tmp/ascend-cann-nnae_7.0.0_linux-aarch64.run && \
        echo y|/tmp/ascend-cann-nnae_7.0.0_linux-aarch64.run --install --install-path=/usr/local/ascend
    # 安装 pytorch 2.1.0
    copy --chown=ma-user:100 torch-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl /tmp
    run chmod  x /tmp/torch-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl && \
        pip install /tmp/torch-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
    # 安装 touch-npu
    copy --chown=ma-user:100 torch_npu-2.1.0.post7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl /tmp
    run chmod  x /tmp/torch_npu-2.1.0.post7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl && \
        pip install /tmp/torch_npu-2.1.0.post7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
    # 构建最终容器镜像
    from ubuntu:18.04
    # 安装 os 依赖(使用华为开源镜像站)
    copy ubuntu-ports-bionic.list /tmp
    run cp -a /etc/apt/sources.list /etc/apt/sources.list.bak && \
        mv /tmp/ubuntu-ports-bionic.list /etc/apt/sources.list && \
        echo > /etc/apt/apt.conf.d/00skip-verify-peer.conf "acquire { https::verify-peer false }" && \
        apt-get update && \
        apt-get install -y \
        # utils
        ca-certificates vim curl \
        # cann 7.0.rc1
        gcc g   make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 libopenblas-dev \
        # mindspore 2.2.0
        libgmp-dev && \
        apt-get clean && \
        mv /etc/apt/sources.list.bak /etc/apt/sources.list
    run useradd -m -d /home/ma-user -s /bin/bash -g 100 -u 1000 ma-user
    # 从上述 builder stage 中复制目录到当前容器镜像的同名目录
    copy --chown=ma-user:100 --from=builder /home/ma-user/miniconda3 /home/ma-user/miniconda3
    copy --chown=ma-user:100 --from=builder /home/ma-user/ascend /home/ma-user/ascend
    copy --chown=ma-user:100 --from=builder /home/ma-user/var /home/ma-user/var
    copy --chown=ma-user:100 --from=builder /usr/local/ascend /usr/local/ascend
    # 设置容器镜像预置环境变量
    # 请务必设置 cann 相关环境变量
    # 请务必设置 ascend driver 相关环境变量
    # 请务必设置 pythonunbuffered=1, 以免日志丢失
    env path=$path:/usr/local/ascend/nnae/latest/bin:/usr/local/ascend/nnae/latest/compiler/ccec_compiler/bin:/home/ma-user/miniconda3/bin \
        ld_library_path=$ld_library_path:/usr/local/ascend/driver/lib64:/usr/local/ascend/driver/lib64/common:/usr/local/ascend/driver/lib64/driver:/usr/local/ascend/nnae/latest/lib64:/usr/local/ascend/nnae/latest/lib64/plugin/opskernel:/usr/local/ascend/nnae/latest/lib64/plugin/nnengine \
        pythonpath=$pythonpath:/usr/local/ascend/nnae/latest/python/site-packages:/usr/local/ascend/nnae/latest/opp/op_impl/built-in/ai_core/tbe \
        ascend_aicpu_path=$ascend_aicpu_path:/usr/local/ascend/nnae/latest \
        ascend_opp_path=$ascend_opp_path:/usr/local/ascend/nnae/latest/opp \
        ascend_home_path=$ascend_home_path:/usr/local/ascend/nnae/latest \
        pythonunbuffered=1
    # 设置容器镜像默认用户与工作目录
    user ma-user
    workdir /home/ma-user

    关于dockerfile文件编写的更多指导内容参见。

  9. 确认已创建完成dockerfile文件。此时context文件夹内容如下。
    context
    ├── ascend-cann-nnae_7.0.0_linux-aarch64.run
    ├── dockerfile
    ├── torch-2.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
    ├── torch_npu-2.1.0.post7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
    ├── miniconda3-py39_24.5.0-0-linux-aarch64.sh
    ├── pip.conf
    └── ubuntu-ports-bionic.list
  10. 构建容器镜像。在dockerfile文件所在的目录执行如下命令构建容器镜像。
    docker build . -t pytorch:2.1.0-cann7.0.0

    如果构建中访问https://registry-1.docker.io/v2/ 出现connection refused或者client.timeout exceeded问题,需要配置下docker代理。

    vi /etc/docker/daemon.json

    文件中写入以下内容,并保存文件

    {

    "registry-mirrors":[

    "https://docker.m.daocloud.io",

    "https://docker.jianmuhub.com",

    "https://huecker.io",

    "https://dockerhub.timeweb.cloud",

    "https://dockerhub1.beget.com",

    "https://noohub.ru"]

    }

    依次执行systemctl daemon-reload和systemctl restart docker

    重新构建

    构建过程结束时出现如下构建日志说明镜像构建成功。
    successfully tagged pytorch:2.1.0-cann7.0.0

上传镜像至swr服务

  1. 登录容器镜像服务控制台,选择区域,要和modelarts区域保持一致,否则无法选择到镜像。
  2. 单击右上角“创建组织”,输入组织名称完成组织创建。请自定义组织名称,本示例使用“deep-learning”,下面的命令中涉及到组织名称“deep-learning”也请替换为自定义的值。
  3. 单击右上角“登录指令”,获取登录访问指令,本文选择复制临时登录指令。
  4. 以root用户登录本地环境,输入复制的swr临时登录指令。
  5. 上传镜像至容器镜像服务镜像仓库。
    1. 使用docker tag命令给上传镜像打标签。
      #region和domain信息请替换为实际值,组织名称deep-learning也请替换为自定义的值。
      sudo docker tag pytorch:2.1.0-cann7.0.0 swr.{region-id}.{domain}/deep-learning/pytorch:2.1.0-cann7.0.0
      #此处以华为云cn-north-4为例
      sudo docker tagpytorch:2.1.0-cann7.0.0 swr.cn-north-4.myhuaweicloud.com/deep-learning/pytorch:2.1.0-cann7.0.0
    2. 使用docker push命令上传镜像。
      #region和domain信息请替换为实际值,组织名称deep-learning也请替换为自定义的值。
      sudo docker push swr.{region-id}.{domain}/deep-learning/pytorch:2.1.0-cann7.0.0
      #此处以华为云cn-north-4为例
      sudo docker push swr.cn-north-4.myhuaweicloud.com/deep-learning/pytorch:2.1.0-cann7.0.0
  6. 完成镜像上传后,在容器镜像服务控制台的“我的镜像”页面可查看已上传的自定义镜像。

    “swr.cn-north-4.myhuaweicloud.com/deep-learning/pytorch:2.1.0-cann7.0.0”即为此自定义镜像的“swr_url”

在modelarts上创建训练作业

  1. 登录modelarts管理控制台,检查当前账号是否已完成访问授权的配置。如未完成,请参考快速配置modelarts委托授权针对之前使用访问密钥授权的用户,建议清空授权,然后使用委托进行授权。
  2. 在左侧导航栏中选择“模型训练 > 训练作业”,默认进入“训练作业”列表。
  3. “创建训练作业”页面,填写相关参数信息,然后单击“提交”
    • 创建方式:选择“自定义算法”。
    • 启动方式:选择“自定义”。
    • 镜像地址:swr.cn-north-4.myhuaweicloud.com/deep-learning/pytorch:2.1.0-cann7.0.0
    • 代码目录:设置为obs中存放启动脚本文件的目录,例如:“obs://test-modelarts/pytorch/demo-code/”,训练代码会被自动下载至训练容器的“${ma_job_dir}/demo-code”目录中,“demo-code”为obs存放代码路径的最后一级目录,可以根据实际修改。
    • 启动命令:“/home/ma-user/miniconda3/bin/python ${ma_job_dir}/demo-code/pytorch-verification.py” ,此处的“demo-code”为用户自定义的obs存放代码路径的最后一级目录,可以根据实际修改。
    • 资源池:选择专属资源池。
    • 类型:选择驱动/固件版本匹配的专属资源池ascend规格。
    • 作业日志路径:设置为obs中存放训练日志的路径。例如:“obs://test-modelarts/pytorch/log/”
  4. “规格确认”页面,确认训练作业的参数信息,确认无误后单击“提交”
  5. 训练作业创建完成后,后台将自动完成容器镜像下载、代码目录下载、执行启动命令等动作。

    训练作业一般需要运行一段时间,根据您的训练业务逻辑和选择的资源不同,训练时长将持续几十分钟到几小时不等。您可以在作业详情页面,查看日志信息。

相关文档

网站地图