Docker Compose + GPU + TensorFlow 所产生的奇妙火花

作者: 机器之心 2017-09-18 13:40:42

Docker 很棒——越来越多的人在开发与分布中使用它。Docker 有很多优势:即时环境设置、独立于平台的 app、现成的解决方案、更好的版本控制、简化的维护。

但是在数据科学和深度学习方面,使用 Docker 有一些阻碍。你必须记住所有的 Docker 标志,以在主机和容器之间共享端口和文件,创建不必要的 run.sh 脚本,并处理 CUDA 版本和 GPU 共享。如果你曾经见过下面这个错误,你就会明白这种痛苦:

  1. $ nvidia-smi 
  2. Failedto initialize NVML:Driver/library version mismatch 

Docker

我们的目标

本文的目的在于为你介绍一系列 Docker 实用工具,以及我们经常在公司使用的 GPU-ready 样板文件。

因此,以下结果将不会出现:

  1. docker run 
  2. --rm 
  3. --device /dev/nvidia0:/dev/nvidia0 
  4. --device /dev/nvidiactl:/dev/nvidiactl 
  5. --device /dev/nvidia-uvm:/dev/nvidia-uvm 
  6. -p 8888:8888 
  7. -v `pwd`:/home/user 
  8. gcr.io/tensorflow/tensorflow:latest-gpu 

取而代之的是这种结果:

  1. doc up 

酷!

我们实际上想要达到的:

  • 通过一个指令管理我们的应用程序状态(运行、停止、移除)
  • 把所有的运行标志保存到我们能够提交到 git repo 的单个配置文件
  • 忘记 GPU 驱动程序版本不匹配和共享
  • 在生产工具比如 Kubernetes 或 Rancher 中使用 GPU-ready 的容器

因此,这里是我们强烈推荐给每个深度学习者的工具清单:

1. CUDA

首先,你需要 CUDA 工具包,如果你打算自己动手训练模型,那这是必须要有的。我们推荐使用 runfile 安装程序类型而不是 deb,因为它不会在以后的更新中混淆依赖关系。

(可选)如何检查它是否工作:

  1. cd /usr/local/cuda/samples/1_Utilities/deviceQuery 
  2. make 
  3. ./deviceQuery #Shouldprint "Result = PASS

2. Docker

你不想让海量的库污染你的计算机,也害怕版本出现问题。同样,你不必亲自构建和安装——通常,软件已为你创建好了,并包装在图像中。安装 Docker 很简单:

  1. curl -sSL https://get.docker.com/ | sh 

3. Nvidia Docker

如果使用 Docker,必须有来自英伟达的实用程序(https://github.com/NVIDIA/nvidia-docker),它真正简化了在 Docker 容器内使用 GPU 的步骤。

安装非常简单:

  1. wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb 
  2. sudo dpkg -i /tmp/nvidia-docker*.deb 

现在,不用每次都用下列方式来共享英伟达设备:

  1. 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 命令:

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

同样,你也无需担心驱动程序版本不匹配:英伟达的 docker 插件将会帮你解决问题。

4. Docker Compose

超级有用的实用程序,允许你在文件中存储 docker run 配置,并更轻松地管理应用程序状态。尽管它的设计目的是组合多个 docker 容器,但 docker compose 在你只有一个服务的时候依然非常有用。这里有一个稳定版本

(https://github.com/docker/compose/releases):

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

5. Nvidia Docker Compose

不幸的是,Docker Compose 并不知道 Nvidia Docker 的存在。幸运的是,有一个解决方法:有一个小的 Python 脚本,可以用 nvidia-docker 驱动程序生成配置。通过 pip 安装 Nvidia Docker Compose:

  1. pip install nvidia-docker-compose 

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

替代选择

如果你不想使用 nvidia-docker-compose,你可以手动传递音量驱动程序,只需把这些选项添加到 docker-compose.yml:

  1. #Yournvidia driver version here 
  2. volumes: 
  3. nvidia_driver_375.26: 
  4. external:true 
  5. ... 
  6. volumes: 
  7. -nvidia_driver_375.26:/usr/local/nvidia:ro 

6. Bash 别名

但是 nvidia-docker-compose 需要输入 21 个字符,这太多了。

很幸运我们可以使用 bash 别名。在你最喜爱的编辑器打开~/.bashrc(有时是~/.bash_profile),输入以下代码行:

  1. alias doc='nvidia-docker-compose' 
  2. alias docl='doc logs -f --tail=100' 

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

开始 TensorFlow 服务

现在我们准备好利用上述所有工具的优点。比如,我们运行一个 Tensorflow GPU 启用的 Docker 容器。

在项目目录中创建具有以下内容的 docker-compose.yml 文件:

  1. version:'3' 
  2. services: 
  3. tf: 
  4. image:gcr.io/tensorflow/tensorflow:latest-gpu 
  5. ports: 
  6. -8888:8888 
  7. volumes: 
  8. -.:/notebooks 

现在我们可以使用单个命令开始 TensorFlow Jupiter:

  1. doc up 

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

你可以使用相同的命令管理你的服务:

  1. doc logs 
  2. doc stop 
  3. doc rm 
  4. #...etc 

结论

但是这值得吗?下面让我们看一下其优缺点。

优点

  • 无需考虑 GPU 设备共享
  • 不必再为英伟达驱动程序版本担忧
  • 摆脱了偏爱干净、简单配置的命令标志
  • 再也不需要--name 标志管理容器状态
  • 众所周知已记录并得到广泛使用的实用程序
  • 你的配置已为编制工具做好准备,比如理解 docker-compose 文件的编制工具 Kubernetes

缺点

  • 你不得不安装更多工具

它是生产就绪(production-ready)的吗

是的。在电影推荐应用 Movix 中,我们使用 GPU 加速的 TensorFlow 网络基于用户输入计算实时的电影选择。

我们在 Proxy API 的 Rancher 集群中有三台带有 Nvidia Titan X 的电脑。配置储存在常规 docker-compose.yml 文件中:因此在一个新服务器上部署应用程序或者设置开发环境变得很轻松。目前为止它的表现堪称***。

为机器学习的未来做好准备吧!

原文:https://hackernoon.com/docker-compose-gpu-tensorflow-%EF%B8%8F-a0e2011d36

【本文是51CTO专栏机构“机器之心”的原创译文,微信公众号“机器之心( id: almosthuman2014)”】

戳这里,看该作者更多好文

Docker Compose GPU TensorFlow
上一篇:初学者指南:神经网络在自然语言处理中的应用 下一篇:30行JavaScript代码,教你分分钟创建神经网络
评论
取消
暂无评论,快去成为第一个评论的人吧

更多资讯推荐

2019机器学习框架之争:与Tensorflow竞争白热化,进击的PyTorch赢在哪里?

2019年,机器学习框架之争进入了新阶段:PyTorch与TensorFlow成为最后两大玩家,PyTorch占据学术界领军地位,TensorFlow在工业界力量依然强大,两个框架都在向对方借鉴,但是都不太理想。

大数据文摘 ·  2019-10-11 23:18:15
深度学习中,CPU、GPU、NPU、FPGA如何发挥优势

随着AI的广泛应用,深度学习已成为当前AI研究和运用的主流方式。面对海量数据的并行运算,AI对于算力的要求不断提升,对硬件的运算速度及功耗提出了更高的要求。

咪付 ·  2019-09-11 15:38:15
深度学习中,CPU、GPU、NPU、FPGA如何发挥优势

随着AI的广泛应用,深度学习已成为当前AI研究和运用的主流方式。面对海量数据的并行运算,AI对于算力的要求不断提升,对硬件的运算速度及功耗提出了更高的要求。

咪付 ·  2019-05-10 08:43:05
分布式入门,怎样用PyTorch实现多GPU分布式训练

本文首先介绍了分布式计算的基本概念,以及分布式计算如何用于深度学习。然后,列举了配置处理分布式应用的环境的标准需求。最后,本文从理论角度和实现的角度演示了一个用于训练深度学习模型的分布式算法。

机器之心 ·  2019-05-05 08:37:39
分布式入门,怎样用PyTorch实现多GPU分布式训练

本文首先介绍了分布式计算的基本概念,以及分布式计算如何用于深度学习。然后,列举了配置处理分布式应用的环境的标准需求。最后,本文从理论角度和实现的角度演示了一个用于训练深度学习模型的分布式算法。

机器之心 ·  2019-05-05 08:37:39
最后一批被AI替代的人,也要失业了

开发机器学习应用程序的最大瓶颈之一,是对培训现代机器学习模型的大型标记数据集的海量需求。即使是头部的AI创业公司,最关键的一环依然是从数据标注员开始的。目前手工标记的培训集即昂贵又耗时,而数据的组装、清理和调试是机器学习模型能否成功构建的源头。

读芯术 ·  2019-04-16 14:12:29
在数据采集器中用TensorFlow进行实时机器学习

本文学习如何通过发布的TensorFlow Evaluator版本使用TensorFlow(TF)模型进行预测和分类。

云栖社区 ·  2019-01-24 15:30:09
Kubeflow 公布 1.0 路线图:2019 年实现 API 稳定

Kubeflow,名字取自 Kubernetes + Tensorflow ,是 Google 为了支持 Tensorflow 的部署而推出的开源平台。

王练 ·  2019-01-07 09:16:04
Copyright©2005-2019 51CTO.COM 版权所有 未经许可 请勿转载