别为Docker本地实现不支持GPU发愁,解决方案在此!

二次信任 提交于 2019-12-04 08:30:52

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1



导读

    

通过提供独立的执行环境而不需要整个虚拟机的开销,容器已经成为大规模部署应用程序的很有吸引力的选择。


Docker让容器变得易于使用,因此受到欢迎。通过使多个工程团队能够利用自己的配置进行开发、对齐基准或部署可扩展的微服务架构,容器在各个地方都有用。


基于GPU的应用程序,正在迅速成为标准工作流程的一部分,特别是在深度学习领域。


这些应用程序在容器化应用程序中的部署、测试和基准测试已经迅速成为公认的惯例。


但Docker容器的本地实现不支持NVIDIA GPU,这就是为什么我们开发了nvidia-docker插件。


在这里,笔者会告诉你如何使用它。


Nvidia-docker


NVIDIA GPU要求内核模块和用户级库来被识别并用于计算。有一个解决这个问题的办法,但需要安装Nvidia驱动程序和对应于NVIDIA GPU字符设备的映射。但是,如果主机的Nvidia驱动程序已更改,则安装在容器内的驱动程序版本将不再兼容,因此会中断主机上的容器使用。这违背了容器的主要特征,即可移动性。但是使用Nvidia Docker,可以无缝地配置一个GPU设备可见的容器,并准备好执行基于GPU的应用程序。


Nvidia关于nvidia-docker的博客强调了使用便携式GPU容器的两个关键点:


——与驱动程序无关的CUDA镜像

——Docker命令行包装器,在启动时将驱动程序的用户模式组件和GPU(字符设备)装载到容器中。


Nvidia-docker入门


安装NVIDIA Docker


在安装nvidia-docker之前更新系统的NVIDIA驱动程序。另外,确保Docker安装在系统上。完成之后,请按照此处的安装说明进行操作(https://nvidia.github.io/nvidia-docker/)。


下一步是测试nvidia-docker:

rtaneja@DGX:~$ nvidia-docker
Usage: docker COMMAND
A self-sufficient runtime for containers
Options:
--config string Location of client config files (default "/home/rtaneja/.docker")
-D, --debug Enable debug mode
--help Print usage
-H, --host list Daemon socket(s) to connect to (default [])
-l, --log-level string Set the logging level ("debug", "info", "warn", "error", "fatal") (default "info")
--tls Use TLS; implied by --tlsverify
--tlscacert string Trust certs signed only by this CA (default "/home/rtaneja/.docker/ca.pem")
--tlscert string Path to TLS certificate file (default "/home/rtaneja/.docker/cert.pem")
--tlskey string Path to TLS key file (default "/home/rtaneja/.docker/key.pem")
--tlsverify Use TLS and verify the remote
-v, --version Print version information and quit


现在,让我们测试一下,是否可以使用nvidia-docker而不是Docker命令从docker-hub中提取hello-world镜像:

rtaneja@DGX:~$ nvidia-docker run --rm hello-world
Using default tag: latestlatest: Pulling from library/hello-world9a0669468bf7: Pull completeDigest: sha256:cf2f6d004a59f7c18ec89df311cf0f6a1c714ec924eebcbfdd759a669b90e711Status: Downloaded newer image for hello-world:latest
Hello from Docker!

上面的消息显示安装正常工作。


开发GPU应用程序


对于CUDA开发,你可以先从Dockerhub提取nvidia / cuda镜像。

rtaneja@DGX:~$ nvidia-docker run --rm -ti nvidia/cuda:
8.0 nvidia-smi8.0: Pulling from nvidia/cuda
16da43b30d89: Pull complete
1840843dafed: Pull complete
91246eb75b7d: Pull complete
7faa681b41d7: Pull complete
97b84c64d426: Pull complete
ce2347c6d450: Pull complete
f7a91ae8d982: Pull complete
ac4e251ee81e: Pull complete
448244e99652: Pull complete
f69db5193016: Pull complete
Digest: sha256:a73077e90c6c605a495566549791a96a415121c683923b46f782809e3728fb73
Status: Downloaded newer image for nvidia/cuda:8.0


构建自己的应用


现在,不用从docker命令行运行nvidia-smi,只要启动一个容器,就可以构建一个Docker镜像并使用CMD运行nvidia-smi。为了构建镜像,Docker从Dockerfile读取指令并进行组装和镜像。Docker hub的Ubuntu 16.04和CUDA 9.0的Dockerfile示例如下所示:



# FROM defines the base image
FROM nvidia/cuda:7.5
# RUN executes a shell command
# You can chain multiple commands together with &&
# A \ is used to split long lines to help with readability

RUN apt-get update && apt-get install -y --no-install-recommends \ cuda-samples-$CUDA_PKG_VERSION && \ rm -rf /var/lib/apt/lists/*

# CMD defines the default command to be run in the container
# CMD is overridden by supplying a command + arguments to
# `docker run`, e.g. `nvcc --version` or `bash`
CMD nvidia-smi
#end of Dockerfile


$ docker build -t my-nvidia-smi . # will build an image named my-nvidia-smi and assumes you have Dockerfile in the current directory
$ nvidia-docker images # or docker images will show the nvidia-smi image name

现在,我们准备执行镜像。 默认情况下,你将看到主机上的所有GPU在容器内可见。使用NV_GPU环境变量,在nvidia-docker中,提供了一个包含所需GPU数量的容器。 例如,下面的命令将使容器只能看到来自主机的一个GPU:

NV_GPU=1 nvidia-docker run --rm my-nvidia-smi

+-----------------------------------------------------------------------------+| NVIDIA-SMI 384.81               Driver Version: 384.81                      ||-------------------------------+----------------------+----------------------+
| GPU Name          Persistence-M| Bus-Id      Disp.A  |Volatile  Uncorr. ECC |
| Fan Temp   Perf   Pwr:Usage/Cap|        Memory-Usage |GPU-Util   Compute M. |
|===============================+======================+======================|
| 0 Tesla V100-SXM2... On        |00000000:06:00.0 Off |                    0 |
| N/A    37C   P0     45W / 300W | 10MiB / 16152MiB    |           0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                        GPU Memory|
| GPU         PID       Type       Process         name             Usage     |
|=============================================================================|
| No running processes found                                                  |
+---------------------------------------------------------------------------+


用于深度学习的Nvidia优化容器入门


要开始DL开发,你可以从docker集线器中提取nvidia DIGITS容器,并启动DIGITS Web服务。下面的命令将主机上的端口8000映射到容器上的端口5000,运行此命令后,你可以访问http:// localhost:8000上的DIGITS:


nvidia-docker run --name digits -ti -p 8000:5000 nvidia/digits


期待


新版本的nvidia-docker(2.0)项目是基于libnvidia-container的alpha版本发布的,将来会成为部署GPU容器的首选方式。 现在,你已经对部署基于GPU的容器化应用程序有了大体了解,Nvidia还通过新发布的NVIDIA GPU云容器注册表服务提供了容器化的易于使用的、全面优化的深度学习软件堆栈。



双12福利预告:


12月12日,开源云中文社区将联合K8S技术社区、EasyStack为国内社区用户精彩送上“赴美大咖团国内首轮直播访谈”,为大家解读KubeCon北美峰会最新最热议题内容!添加小助手免费报名!


640?wx_fmt=jpeg


投稿邮箱:openstackcn@sina.cn

640?wx_fmt=jpeg

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!