制作、调试自定义容器镜像

制作并推送镜像需要安装 Docker 以及登录镜像仓库,具体请参考 镜像管理

平台对使用的容器镜像有特殊的要求。比如需要安装特定的软件,使用特定的启动脚本。

表 234 自定义镜像要求

应用类型

安装软件

推荐工作目录

开发环境

  • JupyterNotebook 或 JupyterLab(可选)

/workspace

训练任务(Horovod)

  • Horovod

  • OpenMPI (== 3.1.2 或者 >= 4.0.0)

  • OpenSSH

/workspace

模型包(自定义)

开发环境

开发环境预置了 OpenSSH 和 Theia,如果需要 Jupyter 功能请按照如下示例制作镜像并上传到镜像仓库。

开发环境启动时会 修改 镜像的启动命令(DockerfileENTRYPOINTCMD 的内容)。

所以在 Dockerfile 中写的 ENTRYPOINTCMD 是无效的。

TensorFlow 开发环境例子

TensorFlow 官方镜像 tensorflow/tensorflow:latest-gpu 为例。

如果不需要定制,可以直接上传平台使用。

定制可参考如下步骤:

  1. 拉取镜像

    docker pull tensorflow/tensorflow:latest-gpu
    

    关于 docker 命令使用方式,请参考 镜像管理Docker 官方文档

    查看拉取的镜像:

    $ docker images | grep tensorflow/tensorflow
    tensorflow/tensorflow    latest-gpu    edb49f6a133b    2 minutes ago    5.53GB
    
  2. 创建 Dockerfile 文件

    关于 Dockerfile 的具体格式,请参见:https://docs.docker.com/engine/reference/builder/。 Dockerfile 中需要额外安装 Jupyter ,内容如下(下载 Dockerfile ):

    FROM tensorflow/tensorflow:latest-gpu
    
    # (Optional) Install JupyterLab
    RUN pip install jupyterlab \
        && apt update \
        && apt install -y --no-install-recommends nodejs \
        && apt clean \
        && rm -rf /var/lib/apt/lists/*
    
    # # (Optional) Add virtual env in Jupyter
    # RUN source <venv_bin_path>/activate \
    #     && pip install ipykernel \
    #     && python -m ipykernel install --user --name <your_venv_name> \
    #     && deactivate
    
    WORKDIR /workspace
    
  3. Dockerfile 所在目录执行执行以下命令打包镜像:

    docker build -t docker-user.example.com:30080/project/tensorflow-devenv:0.0.1 .
    

    注意不要遗漏命令最后的 . ,镜像名请根据实际情况修改。

训练任务

  • TensorFlow、PyTorch 和单机训练模式

    对镜像没有特殊要求,可以直接使用如下镜像:

  • Horovod 训练模式

    关于 Horovod 的安装,可参考:https://horovod.readthedocs.io/en/stable/install_include.html

    注意在镜像中需要额外安装 OpenMPI 和 OpenSSH。

    安装 OpenSSH 可在 Dockerfile 中添加以下内容:

    RUN apt-get update \
        && apt-get install -y --no-install-recommends openssh-client openssh-server \
        && mkdir -p /run/sshd \
        && chmod 0755 /run/sshd \
        && sed -i '/PermitRootLogin/ c PermitRootLogin yes' /etc/ssh/sshd_config \
        && apt clean \
        && rm -rf /var/lib/apt/lists/*
    

    Horovod 需要 OpenMPI 3.0 以上。但 OpenMPI 3.1.3 可能会造成训练卡住,所以推荐 OpenMPI 3.1.2 或者 4.0.0 以上,请参考 Horovod 的说明:https://horovod.readthedocs.io/en/stable/install_include.html#mpi。 安装 OpenMPI 可在 Dockerfile 中添加以下内容:

    RUN apt-get update \
        && apt-get install -y --no-install-recommends wget\
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*
    RUN mkdir -p /tmp/openmpi \
        && cd /tmp/openmpi \
        && wget https://www.open-mpi.org/software/ompi/v4.0/downloads/openmpi-4.0.0.tar.gz \
        && tar zxf openmpi-4.0.0.tar.gz \
        && cd openmpi-4.0.0 \
        && ./configure --enable-orterun-prefix-by-default \
        && make -j $(nproc) all \
        && make install \
        && ldconfig \
        && rm -rf /tmp/openmpi
    

Horovod + PyTorch 训练任务例子

nvidia/cuda:10.0-devel-ubuntu16.04 为基础镜像, 构建一个支持 Horovod 训练模式和 PyTorch 框架的镜像。

  1. 拉取镜像

    docker pull nvidia/cuda:10.0-devel-ubuntu16.04
    

    查看拉取的镜像:

    $  docker images | grep cuda
     nvidia/cuda    10.0-devel-ubuntu16.04    ea369b7c5381    4 weeks ago    2.29GB
    
  2. 创建 Dockerfile 文件

    内容如下(下载 Dockerfile ):

    FROM nvidia/cuda:10.0-devel-ubuntu16.04
    
    # Install OpenSSH
    RUN apt-get update \
        && apt-get install -y --no-install-recommends openssh-client openssh-server \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*
    
    # Install OpenMPI
    RUN apt-get update \
        && apt-get install -y --no-install-recommends wget\
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*
    RUN mkdir -p /tmp/openmpi \
        && cd /tmp/openmpi \
        && wget https://www.open-mpi.org/software/ompi/v4.0/downloads/openmpi-4.0.0.tar.gz \
        && tar zxf openmpi-4.0.0.tar.gz \
        && cd openmpi-4.0.0 \
        && ./configure --enable-orterun-prefix-by-default \
        && make -j $(nproc) all \
        && make install \
        && ldconfig \
        && rm -rf /tmp/openmpi
    
    # Install Python3. Ubuntu 16.04 has Python 3.5
    # python3-dev and cmake is for building Horovod
    RUN apt-get update \
        && apt-get install -y --no-install-recommends \
             python3 python3-pip python3-setuptools python3-dev cmake \
        && apt-get clean \
        && rm -rf /var/lib/apt/lists/*
    
    # Install PyTorch
    # Only numpy < 1.19 supports Python 3.5
    RUN pip3 install -f https://download.pytorch.org/whl/torch_stable.html torch "numpy<1.19" \
        && rm -rf ~/.cache/pip
    
    # Install Horovod with PyTorch
    # Only horovod < 0.20 supports Python 3.5
    RUN HOROVOD_WITH_PYTORCH=1 pip3 install "horovod[pytorch]<0.20" \
        && rm -rf ~/.cache/pip
    
    WORKDIR /workspace
    
  3. Dockerfile 所在目录执行执行以下命令打包镜像:

    docker build -t docker-user.example.com:30080/project/horovod:0.0.1 .
    

    注意不要遗漏命令最后的 . ,镜像名请根据实际情况修改。

本地调试镜像

以自定义开发环境镜像为例,在本地运行 docker run 命令启动容器,并进入容器内部进行调试。

docker run --name debug -i -t docker-user.example.com:30080/project/tensorflow-devenv:0.0.1 bash

调试完毕后,运行 docker stop 命令停止容器。

docker stop debug

运行 docker save 命令以 tarball 格式保存调试后的镜像到本地文件。

docker save -o tensorflow-devenv.tar docker-user.example.com:30080/project/tensorflow-devenv:0.0.1

运行 docker rmdocker rmi 命令分别清理不再需要的容器和镜像

docker rm debug
docker rmi docker-user.example.com:30080/project/tensorflow-devenv:0.0.1

运行 docker load 命令从本地文件导入镜像

docker load -i tensorflow-devenv.tar

更多 docker 命令的使用方法,请参考 Docker 命令行官方手册

常见问题

Jupyter 无法显示中文、提示 UnicodeError

需要在镜像中配置 locale 。对于 Ubuntu 或 Debian 为基础的镜像,可以在 Dockerfile 中添加以下内容:

RUN apt-get update \
    && apt-get install -y --no-install-recommends locales \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/* \
    && sed -i 's|# en_US.UTF-8|en_US.UTF-8|g' /etc/locale.gen \
    && sed -i 's|# zh_CN.UTF-8|zh_CN.UTF-8|g' /etc/locale.gen \
    && locale-gen
ENV LANG zh_CN.UTF-8