Docker_1_nvidia-docker+tensorflow-gpu搭建和使用

Introduction

本文会提到3个内容:
使用docker跑TensorFlow gpu的动机
安装nvidia-docker
使用nvidia-docker TensorFlow

Motivation

docker容器技术很好用,但是为什么要拿来跑TensorFlow gpu?
因为我已经重装实验室的服务器N次了。T^T。好好一个机器,就因为各种原因坏,网络?断电?强退各种应用?骚操作?
所以为了隔壁的专题目标检测从入门到入土的实验和学习能顺利进行下去,我还是得再一次的装系统。T^T
这一次我学聪明了,把docker加进来。
据我想象会有以下几个好处:

  1. server的root权限封闭,增加server的安全性。以前在实际服务器上开发,每个人都有不同的需求,会装各种包、需要做各种操作和设置,所以root的权限必须给大家都开放。但是由于linux用户都是被默认为“你知道你在干嘛”,而有一些用户是不知道他在干嘛的。如果把root权限交到了这种小白手里,那一顿骚操作之下,系统肯定就很容易被损坏。利用docker,如果某用户想尝试什么骚操作,就建立一个centos、ubuntu的容器,在容器内部搞骚操作,相当于一个沙盒。操作坏了那直接删了重来就可以了。不会造成server本身的损坏。
  2. 进程间相互独立。如果现在有好几个人,都要玩jupyter。通常的做法是,开一个jupyter,给多个用户使用。但是万一有一个人把jupyter跑崩了,其他的人很有可能也会崩。那太惨了。为了降低这种损失,如果能让每个jupyter不互相影响,那就没什么问题了。
  3. 可移植性。这里要回到docker本身的作用了。docker的镜像和容器就是为了将服务能快速打包、部署、分享给多个user or client使用。在实际项目中,如果不使用docker,就要安装anaconda以便导入导出环境、用git克隆代码确保能成功运行。但是使用docker,只要把成功运行的容器打包成自己的image,然后把image让别人pull到他本地的docker环境中,只用run一下,就能完美重现。

基于这些好处,我觉得安装docker肯定是一个明智的选择 2333

安装nvidia-docker

主要参考:nvidia-docker github
现在nvidia-docker已经到2.0的版本了,但是网上有好多教程都是1.0的版本,还在使用1代的api,所以没有实时性的参考价值。目前时间为2019年4月27日。我下载的就是当前最新的nvidia-docker。

  1. 删除老版本
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo yum remove nvidia-docker
  1. Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.repo | \
  sudo tee /etc/yum.repos.d/nvidia-docker.repo
  1. Install nvidia-docker2 and reload the Docker daemon configuration
sudo yum install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
  1. Test nvidia-smi with the latest official CUDA image
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

只要能正常把nvidia-smi输出,就说明好了。

  1. 这里有可能报错,按照下面来解决,参考nvidia-container-runtime
  • Systemd drop-in file
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/override.conf <
  • Daemon configuration file
sudo tee /etc/docker/daemon.json <

使用container:TensorFlow

参考:https://tensorflow.google.cn/install/docker

  1. 测试docker tf是否能启动:
docker run -it --rm tensorflow/tensorflow \
       python -c "import tensorflow as tf; tf.enable_eager_execution();
print(tf.reduce_sum(tf.random_normal([1000, 1000])))"
  1. python3+gpu:测试nvidia和tf是否能连上
docker run -it --rm --runtime=nvidia tensorflow/tensorflow:latest-gpu-py3 python
  1. 开启jupyter
docker run -u \$(id -u):\$(id -g) -it --runtime=nvidia -p 8866:8888 tensorflow/tensorflow:latest-gpu-py3-jupyter

若成功开启,则在本地浏览器输入:服务器ip地址,8866端口,加秘钥。就可以进入jupyter页面。

  1. 创建高级的gpu-py3
docker run -u $(id -u):$(id -g) --runtime=nvidia -it -p 8876:6006 -v ~/test:/code_dir -w /code_dir tensorflow/tensorflow:nightly-gpu-py3

这里解释一下命令:
docker run 用来运行容器
-u 指定使用的用户,为了避免一些文件创建的问题
--runtime=nvidia 指定该容器能使用底层的nvidia gpu
-p 8876:6006 是为了让tensorboard的6006端口能映射到宿主机的8876端口,从而使得远程可以看tensorboard
-v 是将本地的目录test映射到容器的code_dir中。你先把代码在test目录里面写好,然后在容器内部运行。在容器里面只干一件事,就是跑服务。
-w 是指定进去容器的初始目录在哪里,这里建议就是进映射的那个目录。
后面的就是指定了tensorflow的版本,目前都是用py3,不要再用py2了。

  1. 如果想开一个jupyter和tensorboard的二合一服务,就可以来点骚操作了。

先开启一个jupyter的后台服务:

docker run -u $(id -u):$(id -g) --runtime=nvidia -d -p 8878:8888 -p 8876:6006 -v ~/test3:/code_dir -w /code_dir tensorflow/tensorflow:nightly-gpu-py3-jupyter

这时候是以-d的方式执行,所以不会显示乱七八糟的内容。但是要查看token才能从外面进jupyter呀:

docker exec 容器名 jupyter notebook list

查看到了之后,jupyter就完成了。然后开tensorboard后台服务:

docker exec -d blissful_hypatia tensorboard --logdir=/code_dir/TensorBoard

至此成功。

  1. 如果信不准,可以将这两条python语句用容器内的python运行,用来测试gpu是否真正连上。如果可以连上,会显示GPU的字眼,不然就只有CPU
import tensorflow
sess = tensorflow.Session(config= tensorflow.ConfigProto(log_device_placement=True))

你可能感兴趣的:(Docker_1_nvidia-docker+tensorflow-gpu搭建和使用)