更新时间:2024-02-28 GMT+08:00
分享

Step3 制作自定义镜像

此处介绍如何通过编写 Dockerfile 文件制作自定义镜像的操作步骤 。

目标:构建安装好如下软件的容器镜像,并使用 ModelArts 训练服务运行。

  • ubuntu-18.04
  • cann-6.3.RC2 (商用版本)
  • python-3.7.13
  • mindspore-2.1.1

Mindspore 版本与 CANN 版本,CANN 版本和Ascend驱动/固件版本均有严格的匹配关系,版本不匹配会导致训练失败。

本示例仅用于示意Ascend容器镜像制作流程,且在匹配正确的Ascend驱动/固件版本的专属资源池上运行通过。

  1. 准备一台 Linux aarch64 架构的主机,操作系统使用ubuntu-18.04。您可以准备相同规格的 弹性云服务器ECS 或者应用本地已有的主机进行自定义镜像的制作。
    购买ECS服务器的具体操作请参考购买并登录Linux弹性云服务器。镜像选择公共镜像,推荐使用ubuntu18.04的镜像。
    图1 创建ECS服务器-选择X86架构的公共镜像
  2. 安装 Docker。

    以 Linux aarch64 架构的操作系统为例,获取 Docker 安装包。您可以使用以下指令安装 Docker。关于安装 Docker 的更多指导内容参见 Docker 官方文档

    curl -fsSL get.docker.com -o get-docker.sh
    sh get-docker.sh

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

    启动docker。
    systemctl start docker 
  3. 确认 Docker Engine 版本。执行如下命令。
    docker version | grep -A 1 Engine
    命令回显如下。
     Engine:
      Version:          18.09.0

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

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

    在华为开源镜像站 https://mirrors.huaweicloud.com/home 中,搜索 pypi ,可以查看 pip.conf 文件内容。

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

    在华为开源镜像站 https://mirrors.huaweicloud.com/home 中,搜索 Ubuntu-Ports ,可以查看获取 apt 源文件的命令。

  7. 下载 CANN 6.3.RC2-linux aarch64 与 mindspore-2.1.1-cp37-cp37m-linux_aarch64.whl 安装文件。
    • 下载run文件“Ascend-cann-nnae_6.3.RC2_linux-aarch64.run”(下载链接)。
    • 下载whl 文件“mindspore-2.1.1-cp37-cp37m-linux_aarch64.whl”(下载链接)。

    ModelArts当前仅支持CANN商用版本,不支持社区版。

  8. 下载 Miniconda3 安装文件。

    使用地址 https://repo.anaconda.com/miniconda/Miniconda3-py37_4.10.3-Linux-aarch64.sh,下载 Miniconda3-py37-4.10.3 安装文件(对应 python 3.7.10)。

  9. 将上述 pip 源文件、*.run 文件、 *.whl 文件、Miniconda3 安装文件放置在 context 文件夹内,context 文件夹内容如下。
    context
    ├── Ascend-cann-nnae_6.3.RC2_linux-aarch64.run
    ├── mindspore-2.1.1-cp37-cp37m-linux_aarch64.whl
    ├── Miniconda3-py37_4.10.3-Linux-aarch64.sh
    ├── pip.conf
    └── Ubuntu-Ports-bionic.list
  10. 编写容器镜像 Dockerfile 文件。
    在 context 文件夹内新建名为 Dockerfile 的空文件,并将下述内容写入其中。
    # 容器镜像构建主机需要连通公网
    FROM arm64v8/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 6.3.RC2
        gcc-7 g++ make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 && \
        apt-get clean && \
        mv /etc/apt/sources.list.bak /etc/apt/sources.list && \
        # 修改 CANN 6.3.RC2 安装目录的父目录权限,使得 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-py37_4.10.3-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-py37_4.10.3-Linux-aarch64.sh -b -p /home/ma-user/miniconda3
    
    ENV PATH=$PATH:/home/ma-user/miniconda3/bin
    
    # 安装 CANN 6.3.RC2 Python Package 依赖
    RUN pip install numpy~=1.14.3 decorator~=4.4.0 sympy~=1.4 cffi~=1.12.3 protobuf~=3.11.3 \
        attrs pyyaml pathlib2 scipy requests psutil absl-py
    
    # 安装 CANN 6.3.RC2 至 /usr/local/Ascend 目录
    COPY --chown=ma-user:100 Ascend-cann-nnae_6.3.RC2_linux-aarch64.run /tmp
    RUN chmod +x /tmp/Ascend-cann-nnae_6.3.RC2_linux-aarch64.run && \
        /tmp/Ascend-cann-nnae_6.3.RC2_linux-aarch64.run --install --install-path=/usr/local/Ascend
    
    # 安装 MindSpore 2.1.1
    COPY --chown=ma-user:100 mindspore-2.1.1-cp37-cp37m-linux_aarch64.whl /tmp
    RUN chmod +x /tmp/mindspore-2.1.1-cp37-cp37m-linux_aarch64.whl && \
        pip install /tmp/mindspore-2.1.1-cp37-cp37m-linux_aarch64.whl
    
    # 构建最终容器镜像
    FROM arm64v8/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 6.3.RC2
        gcc-7 g++ make cmake zlib1g zlib1g-dev openssl libsqlite3-dev libssl-dev libffi-dev unzip pciutils net-tools libblas-dev gfortran libblas3 && \
        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/built-in/op_impl/ai_core/tbe \
        ASCEND_AICPU_PATH=/usr/local/Ascend/nnae/latest \
        ASCEND_OPP_PATH=/usr/local/Ascend/nnae/latest/opp \
        ASCEND_HOME_PATH=/usr/local/Ascend/nnae/latest \
        PYTHONUNBUFFERED=1
    
    # 设置容器镜像默认用户与工作目录
    USER ma-user
    WORKDIR /home/ma-user

    关于 Dockerfile 文件编写的更多指导内容参见 Docker 官方文档

  11. 确认已创建完成 Dockerfile 文件。此时 context 文件夹内容如下。
    context
    ├── Ascend-cann-nnae_6.3.RC2_linux-aarch64.run
    ├── Dockerfile
    ├── mindspore-2.1.1-cp37-cp37m-linux_aarch64.whl
    ├── Miniconda3-py37_4.10.3-Linux-aarch64.sh
    ├── pip.conf
    └── Ubuntu-Ports-bionic.list
  12. 构建容器镜像。在 Dockerfile 文件所在的目录执行如下命令构建容器镜像 。
    1
    docker build . -t mindspore:2.1.1-cann6.3.RC2
    
    构建过程结束时出现如下构建日志说明镜像构建成功。
    Successfully tagged mindspore:2.1.1-cann6.3.RC2
  13. 将制作完成的镜像上传至SWR服务,具体参见Step4 上传镜像至SWR
分享:

    相关文档

    相关产品