通过提供独立的执行环境而不需要整个虚拟机的开销,容器已经成为大规模部署应用程序的很有吸引力的选择。
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北美峰会最新最热议题内容!添加小助手免费报名!
投稿邮箱:openstackcn@sina.cn
来源:CSDN
作者:开源云中文社区
链接:https://blog.csdn.net/lQ1NS259ej3OKYvK4Jf/article/details/78764102