Docker Compose + GPU + TensorFlow = ❤️

2017年08月31日 由 yining 发表 941879 0
Docker是一个开源的应用容器引擎——越来越多的人将它用于开发和分发上。即时环境设置、平台独立应用、即时解决方案、更好的版本控制、简化维护。可以说Docker是有很多好处的。

但是,当涉及到数据科学和深度学习时,你必须记住所有Docker标志,以便在主机和容器之间共享端口和文件,从而创建不必要的run.sh脚本,并且处理CUDA版本和GPU共享。如果你见过下面这个错误,你就会知道这个错误带来的麻烦:
$ nvidia-smi 

Failed to initialize NVML: Driver/library version mismatch

Docker Compose + GPU + TensorFlow = ❤️目标


这篇文章将为你介绍一种充分的的Docker实用工具集和GPU-ready的样板文件。

因此,代替这个:
docker run \

--rm \

--device /dev/nvidia0:/dev/nvidia0 \

--device /dev/nvidiactl:/dev/nvidiactl \

--device /dev/nvidia-uvm:/dev/nvidia-uvm \

-p 8888:8888 \

-v `pwd`:/home/user \

gcr.io/tensorflow/tensorflow:latest-gpu

你会得到这样的结果:
doc up

我们真正想要达到的目标是什么?

  • 使用一个命令管理我们的应用程序状态(运行、停止、删除)

  • 将所有这些运行标志保存至我们可以交付到git repo的一个单独的配置文件中。

  • 忘记GPU驱动程序版本的不匹配和共享

  • 在Kubernetes或Rancher等生产工具中使用GPU-ready容器


下面是我强烈推荐给每个深度学习者的工具列表:

1.CUDA


首先,你需要一个CUDA工具包。工具包地址:https://developer.nvidia.com/cuda-downloads。如果你计划自己训练模型,那它绝对是必不可少的。我建议使用runfile安装程序类型而不是deb,因为它不会在将来的更新中破坏你的依赖。

(可选)如何检查它是否有效:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery

make

./deviceQuery # Should print "Result = PASS"







2.Docker








你不想用大量的库来占据你的电脑,并且害怕版本会被破坏。另外,你也不需要自己构建和安装东西——通常,Docker软件已经为你准备好了,并且装在图片里!Docker地址:https://www.docker.com/get-docker
curl -sSL https://get.docker.com/ | sh







3.Nvidia Docker








如果你使用Docker的话,必须要有来自NVIDIA的实用工具——它确实简化了Docker容器内的GPU的使用。实用工具地址:https://github.com/NVIDIA/nvidia-docker

安装很简单:
wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb

sudo dpkg -i /tmp/nvidia-docker*.deb

现在,代替每次都像这样分享nvidia的设备:






docker run --rm --device /dev/nvidia0:/dev/nvidia0 
--device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-
uvm:/dev/nvidia-uvm nvidia/cuda nvidia-smi







你可以使用nvidia-docker命令:






nvidia-docker run --rm nvidia/cuda nvidia-smi







另外,你可以不用担心驱动版本的不匹配:Nvidia的docker插件会解决你的问题。






4.Docker Compose




它是非常有用的实用工具,允许你在文件中存储docker运行配置,并更容易地管理应用程序状态。尽管它的设计初衷是将多个docker容器组合在一起,但当你只有一个时,docker组合仍然非常有用。


选择一个稳定版本:https://github.com/docker/compose/releases







curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose







5.Nvidia Docker Compose








不幸的是,Docker Compose并不知道Nvidia Docker存在。幸运的是,有一个解决方案:有一个小的Python脚本可以nvidia-docker驱动程序生成配置。Python脚本地址:https://github.com/eywalker/nvidia-docker-compose
使用pip安装:
pip install nvidia-docker-compose

现在你可以使用nvidia-docker-compose命令而不是docker-compose。

替代


如果你不想使用nvidia-docker-compose,你可以手动传递卷驱动(Volume Driver)程序。Volume Driver地址:https://github.com/NVIDIA/nvidia-docker/wiki/NVIDIA-driver#alternatives。只需将这些选项添加到你的docker-compose.yml中:
# Your nvidia driver version here
volumes:
  nvidia_driver_375.26:
    external: true
...
  volumes:
    - nvidia_driver_375.26:/usr/local/nvidia:ro







6. Bash aliases








但是nvidia-docker-compose需要键入21个字符!感觉有点多...



幸运的是,我们可以使用bash aliases. Open ~/.bashrc(有时叫做 ~/.bash_profile)在你喜欢的编辑器中,并输入这些行:
alias doc='nvidia-docker-compose'

alias docl='doc logs -f --tail=100'

通过运行source ~/.bashrc更新你的设置。






开始一个TensorFlow服务








现在,让我们运行一个Tensorflow GPU-enable Docker容器。在项目目录中创建包含以下内容的docker-compose.yml文件:
version: '3'
services:
  tf:
    image: gcr.io/tensorflow/tensorflow:latest-gpu
    ports:
      - 8888:8888
    volumes:
      - .:/notebooks

现在我们可以用一个单独的命令来启动TensorFlow Jupiter:
doc up

Docker Compose + GPU + TensorFlow = ❤️














doc是nvidia-docker-compose 的别名,它将生成修改后的配置文件nvidia-docker-compose.yml与正确的volume-driver,然后运行docker-compose。

你可以使用相同的命令来管理你的服务:
doc logs
doc stop
doc rm
# ...etc







结论








让我们来权衡一下它的利弊。

优点

  • 忘记了GPU设备共享

  • 你不用再担心Nvidia的驱动版本了

  • 我们去掉了命令标志,支持干净和简单的配置

  • 不再是管理容器状态的名称标志

  • 广为人知的文档和广泛使用的实用程序

  • 你的配置已经准备好了像Kubernetes这样的编制工具,这些工具可以理解docker-compose files文件


缺点

  • 你必须安装更多的工具


 
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消