制作、调试自定义容器镜像
制作并推送镜像需要安装 Docker 以及登录镜像仓库,具体请参考 镜像管理 。
平台对使用的容器镜像有特殊的要求。比如需要安装特定的软件,使用特定的启动脚本。
应用类型 |
安装软件 |
推荐工作目录 |
---|---|---|
开发环境 |
|
|
训练任务(Horovod) |
|
|
模型包(自定义) |
开发环境
开发环境预置了 OpenSSH 和 Theia,如果需要 Jupyter 功能请按照如下示例制作镜像并上传到镜像仓库。
开发环境启动时会 修改 镜像的启动命令(Dockerfile
中 ENTRYPOINT
和 CMD
的内容)。
所以在 Dockerfile
中写的 ENTRYPOINT
和 CMD
是无效的。
TensorFlow 开发环境例子
以 TensorFlow 官方镜像 tensorflow/tensorflow:latest-gpu
为例。
如果不需要定制,可以直接上传平台使用。
定制可参考如下步骤:
拉取镜像
docker pull tensorflow/tensorflow:latest-gpu
关于
docker
命令使用方式,请参考 镜像管理 和 Docker 官方文档 。查看拉取的镜像:
$ docker images | grep tensorflow/tensorflow tensorflow/tensorflow latest-gpu edb49f6a133b 2 minutes ago 5.53GB
创建 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
在
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 框架的镜像。
拉取镜像
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
创建 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
在
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 rm
和 docker 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