docker compose+GPU+tensor flow =❤️

docker compose+GPU+tensor flow =❤️

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

Docker 很棒——越来越多的人利用它进行开发和发布。即时环境设置、独立于平台的应用、现成的解决方案、更好的版本控制、简化的维护:Docker 有很多好处。

但是当涉及到数据科学和深度学习时,就有一定的障碍了。你必须记住所有这些 docker 标志,以便在主机和容器之间共享端口和文件,创建不必要的run.sh脚本,并处理 CUDA 版本和 GPU 共享。如果你见过这个错误,你就知道它的痛苦:

$ nvidia-smi 
Failed to initialize NVML: Driver/library version mismatch

我们的目标

这篇小帖子的目的是向您介绍我们公司经常使用的一套足够的 Docker 实用程序和 GPU 就绪样板文件。

所以,不要这样:

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 就绪的容器

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

1.库达

首先,你需要的 CUDA 工具包。如果你打算自己训练模特,这绝对是必备的。我们建议使用runfile安装程序类型,而不是deb,因为它不会在将来的更新中弄乱你的依赖关系。

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

cd /usr/local/cuda/samples/1_Utilities/deviceQuery
make
./deviceQuery # Should print "Result = PASS"

2.码头工人

你不想用大量的库污染你的计算机,也不想害怕破碎的版本。此外,您不必自己构建和安装软件——通常,软件已经为您构建好了,并打包在映像中!安装 Docker 很简单:

curl -sSL [https://get.docker.com/](https://get.docker.com/) | sh

3.Nvidia Docker

如果你使用 Docker,必须有 NVIDIA 的实用程序——它真的简化了 Docker 容器中 GPU 的使用。

安装非常简单:

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 撰写

这是一个非常有用的工具,允许你在一个文件中存储docker run配置,并且更容易地管理应用程序状态。尽管 docker compose 被设计为将多个 docker 容器“组合”在一起,但当您只有一个服务时,它仍然非常有用。在这里选择稳定版本:

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 撰写

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

pip install nvidia-docker-compose

现在你可以用nvidia-docker-compose命令代替docker-compose

供选择的

如果不想用nvidia-docker-compose,可以手动通过音量驱动器。只需将这些选项添加到您的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 别名

但是nvidia-docker-compose是 21 个字符打出来的!那太多了。

幸运的是我们可以使用 bash 别名。在您最喜欢的编辑器中打开~/.bashrc(有时是~/.bash_profile)并输入这些行:

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

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

启动 TensorFlow 服务

现在,我们已经准备好利用上述所有这些优势。例如,让我们运行一个支持 Tensorflow GPU 的 Docker 容器。

在项目目录下创建文件docker-compose.yml,内容如下:

version: '3'services:
  tf:
    image: gcr.io/tensorflow/tensorflow:latest-gpu
    ports:
      - 8888:8888
    volumes:
      - .:/notebooks

现在,我们可以用一条命令启动 TensorFlow Jupiter:

doc up

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

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

doc logs
doc stop
doc rm
# ...etc

结论

但这值得努力吗?这里我们来权衡一下利弊。

赞成的意见

  • 忘记 GPU 设备共享
  • 你再也不用担心 Nvidia 驱动版本了
  • 我们抛弃了命令标志,支持干净和简单的配置
  • 不再有用于管理容器状态的--name标志
  • 众所周知的记录在案的和广泛使用的实用程序
  • 您的配置已经为像 Kubernetes 这样理解 docker-compose 文件的编排工具做好了准备

骗局

  • 你必须安装更多的工具

生产就绪了吗?

没错。在我们的电影推荐服务 Movix 中,我们使用 GPU 加速的 TensorFlow 网络根据用户输入计算实时电影选择。

在代理 API 后面的牧场主集群中,我们有三台装有 Nvidia Titan X 的计算机。配置存储在常规的docker-compose.yml文件中:因此在新的服务器上设置开发环境或部署应用程序非常容易。到目前为止,它运行良好。

Be prepared for the future of ML!

如有任何问题或意见,欢迎在此处或推特上写下@ deepsystemsru


本站为非盈利网站,作品由网友提供上传,如无意中有侵犯您的版权,请联系删除