跳到主要内容
版本:Next

镜像制作手册

平台内镜像制作文档

1. 基础镜像

基础镜像都需要安装cuda、cudnn等深度学习必备组件,如果所制作的镜像对操作系统版本(官方镜像操作系统都是最新的)、cudnn版本没有要求,以及要求操作系统是ubuntu系统,都可以去NGC官网,下载指定cuda版本的基础镜像,参考1.1章节。
如果镜像的操作系统版本为centos,或指定cuda、cudnn版本,NGC官方没有该基础镜像,则需要自制符合指定操作系统或cuda版本的基础镜像,具体参考1.2章节。

注意: 制作镜像,需要在联网环境下在线制作。由于与组件相关的依赖包较多,不推荐下载安装包离线安装的方式。本文以在线制作镜像为主,提供离线下载安装组件的命令。
由于镜像中的操作系统都是MINI版,一般在线安装定制组件时,一些共享库或者组件依赖包不会被自动安装。在实际镜像制作过程中,可参考本文档安装所需的共享库或依赖包。若遇到难以解决的问题请联系我们。
通过Dockerfile制作镜像,如果没有最终失败,请忽略在线制作镜像时输出的红色内容,这不影响最终制作的镜像。
本文档,以某客户定制镜像制作作为示例,定制要求:
操作系统:centos7.4
numpy==1.15.4
opencv-python==3.4.3.18
tenserflow-gpu==1.8.0
Keras==2.2.4
python3.6.6
cudnn 7.0
cuda9.0

1.1 NGC官方基础镜像

Ubuntu系统的cuda基础镜像,请在NGC官方网站下载,一般不需要单独制作,单独制作只针对centos版本。
NGC官方基础镜像下载地址:
https://ngc.nvidia.com/catalog/containers/nvidia:cuda/tags
image image

点击Pull Tag获取pull镜像命令,下载需要的基础镜像: docker pull nvcr.io/nvidia/cuda:9.0-cudnn7-devel-centos7 image

1.2 自制带cuda的基础镜像

由于客户定制的镜像,指定了操作系统,NGC官方镜像没有该基础镜像,需要自制基础镜像。

1.2.1 下载Dockerfile

下载指定版本的cuda和操作系统的Dockerfile和cuda.repo,然后再修改Dockerfile. https://gitlab.com/nvidia/container-images/cuda/-/tree/master/dist (需要翻墙,才能访问)image 点击centos7进入cuda版本选择,选择cuda9.0 image image image

下载后,如图所示:image gitlab cuda9.0下面,有base、devel、runtime目录,我们需要将每个下面的Dockerfile文件,汇总成一个Dockerfile文件,制作一个最全的cuda镜像,防止镜像使用GPU训练时出现问题。base、devel和runtime官方解释,如下:

 CUDA images come in three flavors and are available through the NVIDIA public hub repository.  
base: starting from CUDA 9.0, contains the bare minimum (libcudart) to deploy a pre-built CUDA application. Use this image if you want to manually select which CUDA packages you want to install. runtime: extends the base image by adding all the shared libraries from the CUDA toolkit. Use this image if you have a pre-built application using multiple CUDA libraries. devel: extends the runtime image by adding the compiler toolchain, the debugging tools, the headers and the static libraries. Use this image to compile a CUDA application from sources.

1.2.2 修改Dockerfile

将cuda9.0下面的所有Dockerfile汇总成一个Dockerfile,重复内容,只保留一份,汇总后的Dockerfile内容,如下:

Dockerfile文件:
FROM centos:centos7.4.1708 ## 替换定制的操作系统版本,参考1.2.3 LABEL maintainer "NVIDIA CORPORATION cudatools@nvidia.com"

RUN NVIDIA_GPGKEY_SUM=d1be581509378368edeec8c1eb2958702feedf3bc3d17011adbf24efacce4ab5 &&
curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/7fa2af80.pub | sed '/^Version/d' > /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA &&
echo "$NVIDIA_GPGKEY_SUM /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA" | sha256sum -c --strict -

COPY cuda.repo /etc/yum.repos.d/cuda.repo

ENV CUDA_VERSION 9.0.176

ENV CUDA_PKG_VERSION 9-0-$CUDA_VERSION-1 RUN yum install -y
cuda-cudart-$CUDA_PKG_VERSION &&
ln -s cuda-9.0 /usr/local/cuda &&
rm -rf /var/cache/yum/*

## nvidia-docker 1.0 LABEL com.nvidia.volumes.needed="nvidia_driver" LABEL com.nvidia.cuda.version="${CUDA_VERSION}"

RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf &&
echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf

ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH} ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64

## nvidia-container-runtime ENV NVIDIA_VISIBLE_DEVICES all ENV NVIDIA_DRIVER_CAPABILITIES compute,utility ENV NVIDIA_REQUIRE_CUDA "cuda>=9.0"

## runtime RUN yum install -y
cuda-libraries-$CUDA_PKG_VERSION
cuda-cublas-9-0-9.0.176.4-1 &&
rm -rf /var/cache/yum/*

## cudnn(替换指定的cudnn版本,默认的是最新的,替换参考1.2.4) ENV CUDNN_VERSION 7.6.0.64 LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}"

## cuDNN license: https://developer.nvidia.com/cudnn/license_agreement RUN CUDNN_DOWNLOAD_SUM=90659ea77734b7b671afe930c9898d21a13b888998f1dd3940cc57d6b2f29b86 &&
curl -fsSL http://developer.download.nvidia.com/compute/redist/cudnn/v7.6.0/cudnn-9.0-linux-x64-v7.6.0.64.tgz -O &&
echo "$CUDNN_DOWNLOAD_SUM cudnn-9.0-linux-x64-v7.6.0.64.tgz" | sha256sum -c - &&
tar --no-same-owner -xzf cudnn-9.0-linux-x64-v7.6.0.64.tgz -C /usr/local --wildcards 'cuda/lib64/libcudnn.so.*' &&
rm cudnn-9.0-linux-x64-v7.6.0.64.tgz &&
ldconfig

## devel RUN rm -rf /usr/local/cuda-9.0/include &&
yum install -y
cuda-libraries-dev-$CUDA_PKG_VERSION
cuda-nvml-dev-$CUDA_PKG_VERSION
cuda-minimal-build-$CUDA_PKG_VERSION
cuda-command-line-tools-$CUDA_PKG_VERSION
cuda-core-9-0-9.0.176.3-1
cuda-cublas-dev-9-0-9.0.176.4-1 &&
rm -rf /var/cache/yum/*
ENV LIBRARY_PATH /usr/local/cuda/lib64/stubs

1.2.3 替换FROM基础镜像

Dockerfile中的FROM操作系统镜像,换成自己需要的操作系统,操作系统镜像下载地址和查看操作系统镜像标签和版本地址如下:
https://hub.docker.com/ 在搜索框输入centos, 点击第一个官方centos,进入寻找需要的操作系统版本,替换FROM部分内容。 image image

1.2.4 替换cudnn(如果没有指定版本,忽略该部分内容)

由于官方cudnn中的Dockerfile中,cudnn都是最新的,如果需要指定版本,需要自己手动查找和修改该部分内容。
image 查看自己指定的cudnn版本链接:https://developer.nvidia.com/rdp/cudnn-archive
image 点击下载,查看版本号:
image

1.2.4.1 在线cudnn

将## cudnn部分修改为如下内容

## cudnn
ENV CUDNN_VERSION 7
LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}"
## cuDNN license: https://developer.nvidia.com/cudnn/license_agreement
RUN curl -fsSL http://developer.download.nvidia.com/compute/redist/cudnn/v7.0.5/cudnn-9.0-linux-x64-v7.tgz -O && \
tar --no-same-owner -xzf cudnn-9.0-linux-x64-v7.tgz -C /usr/local --wildcards 'cuda/lib64/libcudnn.so.*' && \
rm cudnn-9.0-linux-x64-v7.tgz && \
ldconfig
1.2.4.2 离线cudnn

如果上述在线下载出现问题,或者比较缓慢,可以使用离线cudnn,先下载cudnn tar包,然后和Dockerfile文件放到一起。 然后将Dockerfile中的## cudnn修改如下内容

## cudnn ENV CUDNN_VERSION 7 LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}"
## cuDNN license: https://developer.nvidia.com/cudnn/license_agreement COPY cudnn-9.0-linux-x64-v7.tgz /home/cudnn-9.0-linux-x64-v7.tgz RUN tar --no-same-owner -xzf /home/cudnn-9.0-linux-x64-v7.tgz -C /usr/local &&
rm /home/cudnn-9.0-linux-x64-v7.tgz &&
ldconfig

1.2.5 其它部分修改

devel RUN部分添加rm -rf /usr/local/cuda-9.0/include && \,避免制作失败,根据cuda版本,修改该部分的cuda版本。

1.2.6 在线制作cuda基础镜像

## 进入Dockerfile目录
cd /home/wjy/Dockerfile/cuda9.0-wjy
## build Dockerfile
docker build -t centos7.4-cuda9.0-cudnn7.0-base-inspur:latest .

image image image 报红内容,忽略,不影响安装,如果介意,修改cuda.repo中的gpgcheck=0,同时在Dockerfile最后一个RUN中添加 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 && \,解决该问题。 image image

1.2.7 离线下载RUN安装的cuda组件(如果在线制作顺利,忽略该部分)

1.2.7.1 离线下载cuda组件

Dockerfile在线制作过程中,如果网络环境不太好,可能导致在线制作时间特别长或者制作失败。可以离线Dockerfile RUN中yum在线安装的组件,然后,修改Dockerfile, 制作好后,再在制作的镜像中,离线安装这些组件。
在linux下新建一个目录,用来下载离线cuda组件:
image 在终端执行如下命令:

CUDA_VERSION=9.0.176
CUDA_PKG_VERSION=9-0-$CUDA_VERSION-1
yum install --downloadonly --downloaddir=/home/wjy/Dockerfile/components cuda-cudart-$CUDA_PKG_VERSION cuda-libraries-$CUDA_PKG_VERSION cuda-cublas-9-0-9.0.176.4-1 cuda-libraries-dev-$CUDA_PKG_VERSION cuda-nvml-dev-$CUDA_PKG_VERSION cuda-minimal-build-$CUDA_PKG_VERSION cuda-command-line-tools-$CUDA_PKG_VERSION cuda-core-9-0-9.0.176.3-1 cuda-cublas-dev-9-0-9.0.176.4-1

image

1.2.7.2 修改Dockerfile
FROM centos:centos7.4.1708
LABEL maintainer "NVIDIA CORPORATION cudatools@nvidia.com"
RUN NVIDIA_GPGKEY_SUM=d1be581509378368edeec8c1eb2958702feedf3bc3d17011adbf24efacce4ab5 && \
curl -fsSL https://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/7fa2af80.pub | sed '/^Version/d' > /etc/pki/rpm-gpg/ RPM-GPG-KEY-NVIDIA && \
echo "$NVIDIA_GPGKEY_SUM /etc/pki/rpm-gpg/RPM-GPG-KEY-NVIDIA" | sha256sum -c --strict -

COPY cuda.repo /etc/yum.repos.d/cuda.repo

ENV CUDA_VERSION 9.0.176

ENV CUDA_PKG_VERSION 9-0-$CUDA_VERSION-1
RUN yum install -y \
cuda-cudart-$CUDA_PKG_VERSION && \
ln -s cuda-9.0 /usr/local/cuda && \
rm -rf /var/cache/yum/*

## nvidia-docker 1.0
LABEL com.nvidia.volumes.needed="nvidia_driver"
LABEL com.nvidia.cuda.version="${CUDA_VERSION}"

RUN echo "/usr/local/nvidia/lib" >> /etc/ld.so.conf.d/nvidia.conf && \
echo "/usr/local/nvidia/lib64" >> /etc/ld.so.conf.d/nvidia.conf

ENV PATH /usr/local/nvidia/bin:/usr/local/cuda/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64

## nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
ENV NVIDIA_REQUIRE_CUDA "cuda>=9.0"

## runtime
## RUN yum install -y \
## cuda-libraries-$CUDA_PKG_VERSION \
## cuda-cublas-9-0-9.0.176.4-1 && \
rm -rf /var/cache/yum/*

## cudnn
ENV CUDNN_VERSION 7
LABEL com.nvidia.cudnn.version="${CUDNN_VERSION}"

## online cuda
## cuDNN license: https://developer.nvidia.com/cudnn/license_agreement
## RUN curl -fsSL http://developer.download.nvidia.com/compute/redist/cudnn/v7.0.5/cudnn-9.0-linux-x64-v7.tgz -O && \
## tar --no-same-owner -xzf cudnn-9.0-linux-x64-v7.tgz -C /usr/local --wildcards 'cuda/lib64/libcudnn.so.*' && \
## rm cudnn-9.0-linux-x64-v7.tgz && \
## ldconfig

## offline cudnn
## cuDNN license: https://developer.nvidia.com/cudnn/license_agreement
COPY cudnn-9.0-linux-x64-v7.tgz /home/cudnn-9.0-linux-x64-v7.tgz
RUN tar --no-same-owner -xzf /home/cudnn-9.0-linux-x64-v7.tgz -C /usr/local && \
rm /home/cudnn-9.0-linux-x64-v7.tgz && \
ldconfig

## devel
## RUN rm -rf /usr/local/cuda-9.0/include && \
## yum install -y \
## cuda-libraries-dev-$CUDA_PKG_VERSION \
## cuda-nvml-dev-$CUDA_PKG_VERSION \
## cuda-minimal-build-$CUDA_PKG_VERSION \
## cuda-command-line-tools-$CUDA_PKG_VERSION \
## cuda-core-9-0-9.0.176.3-1 \
## cuda-cublas-dev-9-0-9.0.176.4-1 && \
rm -rf /var/cache/yum/*

ENV LIBRARY_PATH /usr/local/cuda/lib64/stubs
1.2.7.3 进入build后的基础镜像中,离线安装下载的cuda组件
cd /home/wjy/Dockerfile/cuda9.0-wjy
## build 镜像
docker build -t centos7.4-cuda9.0-cudnn7.0-base-inspur:latest .
## 挂载cuda组件目录,进入镜像,安装cuda组件
docker run -it -v /home/wjy:/home/wjy centos7.4-cuda9.0-cudnn7.0-base-inspur:latest bash
## 在镜像中,进入cuda组件目录
cd /home/wjy/components
## 安装组件
rpm -ivh *.rpm --force --nodeps
## 安装成功后,保存镜像
docker commit 容器ID centos7.4-cuda9.0-cudnn7.0-base-inspur:latest

1.2.8 验证基础镜像

在装有GPU的环境,运行如下命令验证:

docker run -it --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=1 centos7.4-cuda9.0-cudnn7.0-base-inspur:latest bash

image

2. 安装组件

安装组件,可以参照文档中的Dockerfile示例,编写安装定制组件的Dockerfile, 将FROM换成上面制作的基础镜像,然后在RUN中执行安装定制组件命令,Dockerfile RUN安装命令比较简单,不再详述。
Dockerfile下载地址: https://github.com/wjyzzu/inpsur-dockerfile/tree/main/customization/centos7.4

2.1 安装python3

python 离线包下载地址:
https://www.python.org/downloads/source/

image

2.1.1 在本地服务器下载python3.6.6安装包:

cd /home/wjy
wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz

2.1.2 挂载/home/wjy目录到容器:

docker run -i -t -v /home/wjy:/home/wjy centos7.4-cuda9.0-cudnn7.0-base-inspur:latest /bin/bash

2.1.3 安装python3.6

docker exec -i -t 容器ID /bin/bash ## 进入基础镜像容器
yum -y install make zlib zlib-devel bzip2-devel openssl-devel sqlite-devel readline-devel gdbm-devel gcc libffi-devel
tar -zxvf /home/wjy/Python-3.6.6.tgz -C /home/wjy
cd /home/wjy/Python-3.6.6
./configure
make && make install
mv /usr/bin/python /usr/bin/python27
mv /usr/bin/pip /usr/bin/pip27
ln -s /usr/local/bin/python3 /usr/bin/python
ln -s /usr/local/bin/pip3 /usr/bin/pip

2.1.4 修改配置文件

可使用如下快捷命令:

sed -i "s## /usr/bin/python## /usr/bin/python2.7## " /usr/bin/yum
sed -i "s## /usr/bin/python## /usr/bin/python2.7## " /usr/libexec/urlgrabber-ext-down
source /etc/profile
python -V

2.2 安装tensorflow

tensorflow 版本号查看和下载地址:https://pypi.org/project/tensorflow-gpu/1.8.0/
image 直接粘贴下载命令,在镜像中进行在线安装,或者查看历史版本,找到自己要安装的版本。

2.2.1 安装

在线安装如何总是失败或者网速过慢,可以使用pip download下载离线包,然后再进行安装。

# 在线安装:
pip install tensorflow-gpu==1.8.0 --user --default-timeout=10000 --ignore-installed --upgrade
# 离线下载:
pip download tensorflow-gpu==1.8.0 -d /home/wjy/tian-tan-user-images/tensorflow-gpu1.8.0

# 离线加在线安装:
pip install --find-links=/home/wjy/tian-tan-user-images/tensorflow-gpu1.8.0 tensorflow_gpu-1.8.0-cp36-cp36m-manylinux1_x86_64.whl

# 完全离线安装:
pip install --node-index --find-links=/home/wjy/tian-tan-user-images/tensorflow-gpu1.8.0tensorflow_gpu-1.8.0-cp36-cp36m-manylinux1_x86_64.whl

2.2.2 查看版本

pip list |grep tensorflow

2.3 安装opencv

opencv 查看版本和下载地址:https://pypi.org/project/opencv-python/3.4.3.18/

2.3.1 安装

# 在线安装:
pip install opencv-python==3.4.3.18 --user --default-timeout=10000 --ignore-installed --upgrade
# 离线下载:
pip download opencv-python==3.4.3.18 -d /home/wjy/tian-tan-user-images/opencv3.4.3
# 离线安装:
pip install --find-links=/home/wjy/tian-tan-user-images/opencv3.4.3 opencv_python-3.4.3.18-cp27-cp27mu-manylinux1_x86_64.whl

2.3.2 查看版本

pip list |grep opencv*

2.3.3 安装opencv共享库

由于使用pip安装opencv后,并不会自动安装opencv共享库,需要手动安装,不然python import cv2时会报错。共享库:libSM.so.6, libXrender.so.1, libXext.so.6 image

yum whatprovides libSM.so.6 libXrender.so.1 libXext.so.6
opencv1在线安装:
yum install -y libSM libXrender libXext --setopt=protected_multilib=false
离线安装:
yum install --downloadonly --downloaddir=/home/wjy/opencv-share libSM-1.2.2-2.el7.x86_64 libXrender-0.9.10-1.el7.x86_64 libXext-1.3.3-3.el7.x86_64
## 安装
cd /home/wjy/opencv-share
rpm -ivh *.rpm --force --nodeps

2.4 安装Keras

Keras查看版本和下载地址:https://pypi.org/project/Keras/2.2.4/

2.4.1 安装

在线安装:
pip install Keras==2.2.4 --user --default-timeout=10000 --ignore-installed --upgrade
离线下载:
pip download Keras==2.2.4 -d /home/wjy/tian-tan-user-images/keras2.2.4
离线安装:
pip install --no-index --find-links=/home/wjy/tian-tan-user-images/keras2.2.4 Keras-2.2.4-py2.py3-none-any.whl

2.4.2 查看版本

pip list |grep Keras*

2.5 安装numpy

numpy查看版本和下载地址:https://pypi.org/project/numpy/1.15.4/

2.5.1 安装

# 在线安装:
pip install numpy==1.15.4 --user --default-timeout=10000
# 离线下载:
pip download numpy==1.15.4 -d /home/wjy/tian-tan-user-images/numpy1.15.4
# 离线安装:
pip install --no-index --find-links=/home/wjy/tian-tan-user-images/numpy1.15.4 numpy-1.15.4-cp36-cp36m-manylinux1_x86_64.whl

2.5.2 查看版本

3. 配置适配平台的组件

按照《镜像组件安装手册》安装openssh、openssl、jupyter组件;如果使用Dockerfile文件制作镜像,可以将《镜像组件安装手册》里面的Dockerfile内容合并到该文档的Dockerfile文件中,然后使用Dockerfile进行在线制作。