Docker Compose + GPU + TensorFlow = Heart

时间:2022-05-02
本文章向大家介绍Docker Compose + GPU + TensorFlow = Heart,主要内容包括1.CUDA、2.Docker、4.Docker Compose、替代、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

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

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

$ nvidia-smi 

Failed to initialize NVML: Driver/library version mismatch

目标

这篇文章将为你介绍一种充分的的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

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文件

缺点

  • 你必须安装更多的工具