暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

基于Docker的机器学习--Tensorflow-GPU环境

进击的大杂烩 2017-11-22
243


基于 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到容器


制作好的镜像可以放到自己的私有仓库中,私有仓库的搭建请关注后续文章。




文章转载自进击的大杂烩,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论