基于 NVIDIA-Docker 的 Tensorflow 环境搭建
nvidia-docker 需要docker-ce版本支持,docker-ce的安装过程在前面文章中有过介绍,具体链接:Docker基础-安装 docker-ce
nvidia-docker 的安装过程在上一篇文章中有过介绍,具体链接:基于Docker的机器学习--NVIDIA-Docker
环境部署完成后,主要的工作是镜像的制作,镜像的环境为:
ubuntu16.04,cuda8,cudnn5,python3.5,tensorflow-gpu1.1,notebook,ssh
Dockerfile 具体内容如下:
FROM nvidia/cuda:8.0-cudnn5-devel-ubuntu16.04 MAINTAINER xsjop-py3.5-tf1.1-gpu <zhxsjop@163.com> # Pick up some TF dependencies RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential \ curl \ libfreetype6-dev \ libpng12-dev \ libzmq3-dev \ pkg-config \ python \ python-dev \ python3.5-dev \ rsync \ software-properties-common \ unzip \ golang \ git \ libjpeg-turbo8-dev \ openssh-server \ && \ apt-get clean \ && \ rm -rf var/lib/apt/lists/* RUN curl -O https://bootstrap.pypa.io/get-pip.py && \ python3.5 get-pip.py && \ rm get-pip.py RUN pip3.5 --no-cache-dir install \ ipykernel \ jupyter \ matplotlib \ numpy \ scipy \ sklearn \ pandas \ Pillow \ && \ pip3.5 --no-cache-dir install \ scikit-learn \ theano \ keras \ bokeh \ pyglet \ universe \ gym \ && \ python3.5 -m ipykernel.kernelspec # Install TensorFlow GPU version. RUN pip3.5 --no-cache-dir install tensorflow-gpu # Python 3.5 RUN rm -rf usr/bin/python && ln -s usr/bin/python3.5 usr/bin/python # SSH Server RUN sed -i 's/^\(PermitRootLogin\).*/\1 yes/g' etc/ssh/sshd_config && \ sed -i 's/^PermitEmptyPasswords .*/PermitEmptyPasswords yes/g' etc/ssh/sshd_config && \ echo 'root:xxxxxxxx' > tmp/passwd && \ chpasswd < tmp/passwd && \ rm -rf tmp/passwd # Set up our notebook config. COPY jupyter_notebook_config.py root/.jupyter/ # Copy sample notebooks. COPY notebooks notebooks # Jupyter has issues with being run directly: # We just add a little wrapper script. COPY run_jupyter.sh # For CUDA profiling, TensorFlow requires CUPTI. ENV LD_LIBRARY_PATH usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH # TensorBoard EXPOSE 6006 # IPython EXPOSE 8888 # SSH EXPORT 22 WORKDIR "/notebooks" CMD ["/run_jupyter.sh", "--allow-root"] |
Dockerfile中用到的文件如下:
jupyter_notebook_config.py
import os from IPython.lib import passwd c.NotebookApp.ip = '*' c.NotebookApp.port = int(os.getenv('PORT', 8888)) c.NotebookApp.open_browser = False c.MultiKernelManager.default_kernel_name = 'python3' # sets a password if PASSWORD is set in the environment if 'PASSWORD' in os.environ: c.NotebookApp.password = passwd(os.environ['PASSWORD']) del os.environ['PASSWORD'] |
notebooks 空目录或编写一个 botebook 文件
run_jupyter.sh
#!/usr/bin/env bash service ssh start jupyter notebook "$@" |
根据Dockerfile生成docker镜像
# docker build -t tf1.1-gpu . |
生成镜像后启动镜像,并挂载GPU到容器
# 可以用个 nvidia-docer 命令启动 nvidia-docker run -i -t -d -p 22:22 -p 8888:8888 -p 6006:6006 --name tf01 tf1.1-gpu # 启动后会将服务器上所有GPU挂载到容器中 # 可以通过ssh登陆到容器,或通过 notebook 登陆。如果没有设置 notebook 的密码,可以通过 dockr logs tf01 命令查看到 notebook 的登陆key # 如果想指定容器挂载几个 GPU 的话需要如下操作: # 查看 GPU 信息 curl -s http://localhost:3476/docker/cli #获取到相关参数:--volume-driver=nvidia-docker --volume=nvidia_driver_375.26:/usr/local/nvidia:ro --device=/dev/nvidiactl --device=/dev/nvidia-uvm --device=/dev/nvidia-uvm-tools --device=/dev/nvidia0 # 红色字体部分作为 docker run 的参数,蓝色字体部分为具体的 GPU ,需要挂在几个就写几个 # 如: docker run -i -t -d -p 22:22 -p 8888:8888 -p 6006:6006 --name tf02 --volume-driver=nvidia-docker --volume=nvidia_driver_375.26:/usr/local/nvidia:ro --device=/dev/nvidiactl --device=/dev/nvidia-uvm --device=/dev/nvidia-uvm-tools --device=/dev/nvidia0 --device=/dev/nvidia2 # 表示在该容器中挂载2个GPU |
注:
基于 NVIDIA-Docker 的 CPU 环境中,GPU是可以复用的,可以将1个GPU挂载到多个 docker 容器中使用提高了GPU的使用效率,这是 KVM 虚拟机通过硬件透传无法实现的。由于多个容器共享一个GPU,不能做到对 GPU 资源进行隔离,很容易出现一个容器将一个GPU资源耗尽,另外一个容器无法获取GPU资源,所以分配GPU时可以通过命令查看当前GPU的负载,相对平衡的分配GPU到容器
制作好的镜像可以放到自己的私有仓库中,私有仓库的搭建请关注后续文章。





