华为云AI开发平台ModelArtsStep3 制作自定义镜像_云淘科技

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

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

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

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

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

准备一台 Linux aarch64 架构的主机,操作系统使用ubuntu-18.04。您可以准备相同规格的 弹性云服务器ECS 或者应用本地已有的主机进行自定义镜像的制作。

购买ECS服务器的具体操作请参考购买并登录弹性云服务器。镜像选择公共镜像,推荐使用ubuntu18.04的镜像。

图1 创建ECS服务器-选择鲲鹏计算架构的公共镜像

安装 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 

确认 Docker Engine 版本。执行如下命令。

docker version | grep -A 1 Engine

命令回显如下。

 Engine:
  Version:          18.09.0

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

准备名为 context 的文件夹。

mkdir -p context

准备可用的 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 文件内容。

准备可用的 apt 源文件 Ubuntu-Ports-bionic.list。本示例使用华为开源镜像站提供的 apt 源,执行如下命令获取 apt 源文件。

wget -O /etc/apt/sources.list https://repo.huaweicloud.com/repository/conf/Ubuntu-Ports-bionic.list

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

下载 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商用版本,不支持社区版。

下载 Miniconda3 安装文件。

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

将上述 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

编写容器镜像 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 官方文档。

确认已创建完成 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

构建容器镜像。在 Dockerfile 文件所在的目录执行如下命令构建容器镜像 。

1
docker build . -t mindspore:2.1.1-cann6.3.RC2

构建过程结束时出现如下构建日志说明镜像构建成功。

Successfully tagged mindspore:2.1.1-cann6.3.RC2

将制作完成的镜像上传至SWR服务,具体参见Step4 上传镜像至SWR。

父主题: 示例:从 0 到 1 制作自定义镜像并用于训练(MindSpore+Ascend)

同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家