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
我们真正想要达到的目标是什么?
下面是我强烈推荐给每个深度学习者的工具列表:
首先,你需要一个CUDA工具包。工具包地址:https://developer.nvidia.com/cuda-downloads。如果你计划自己训练模型,那它绝对是必不可少的。我建议使用runfile安装程序类型而不是deb,因为它不会在将来的更新中破坏你的依赖。
(可选)如何检查它是否有效:
cd /usr/local/cuda/samples/1_Utilities/deviceQuery
make
./deviceQuery # Should print "Result = PASS"
你不想用大量的库来占据你的电脑,并且害怕版本会被破坏。另外,你也不需要自己构建和安装东西——通常,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插件会解决你的问题。
它是非常有用的实用工具,允许你在文件中存储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
结论
让我们来权衡一下它的利弊。
优点
缺点