炼数成金 门户 商业智能 机器学习 查看内容

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

2017-11-23 14:20| 发布者: 炼数成金_小数| 查看: 21007| 评论: 0|原作者: 猪猪|来自: 进击的大杂烩
摘要: 基于 NVIDIA-Docker 的 CPU 环境中,GPU是可以复用的,可以将1个GPU挂载到多个 docker 容器中使用提高了GPU的使用效率,这是 KVM 虚拟机通过硬件透传无法实现的。由于多个容器共享一个GPU,不能做到对 GPU 资源进行 ...
tm 工具 Python GPU Docker NVIDIA
基于 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到容器

欢迎加入本站公开兴趣群
商业智能与数据分析群
兴趣范围包括各种让数据产生价值的办法,实际应用案例分享与讨论,分析工具,ETL工具,数据仓库,数据挖掘工具,报表系统等全方位知识
QQ群:81035754

鲜花

握手

雷人
1

路过

鸡蛋

刚表态过的朋友 (1 人)

相关阅读

最新评论

热门频道

  • 大数据
  • 商业智能
  • 量化投资
  • 科学探索
  • 创业

即将开课

  GMT+8, 2017-12-17 20:07 , Processed in 0.106688 second(s), 26 queries .