从docker集装箱使用GPU?

我正在寻找一种方法来使用Docker容器内的GPU。

容器将执行任意代码,所以我不想使用特权模式。

有小费吗?

从以前的研究,我明白, run -v和/或LXC cgroup是要走的路,但我不知道如何完全拉断

Regan的答案很好,但是有点过时了,因为正确的做法是避免lxc执行上下文,因为Docker已经将LXC作为docker 0.9的默认执行上下文。

相反,最好通过–device标志告诉docker关于nvidia的设备,只使用本地执行上下文而不是lxc。

环境

这些说明在以下环境中进行了testing:

  • Ubuntu 14.04
  • CUDA 6.5
  • AWS GPU实例。

在您的主机上安装nvidia驱动程序和cuda

请参阅运行Ubuntu 14.04的AWS GPU实例上的CUDA 6.5以获取您的主机设置。

安装Docker

 $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 $ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list" $ sudo apt-get update && sudo apt-get install lxc-docker 

find你的nvidia设备

 ls -la /dev | grep nvidia crw-rw-rw- 1 root root 195, 0 Oct 25 19:37 nvidia0 crw-rw-rw- 1 root root 195, 255 Oct 25 19:37 nvidiactl crw-rw-rw- 1 root root 251, 0 Oct 25 19:37 nvidia-uvm 

运行预装nvidia驱动程序的Docker容器

我创build了一个预安装了cuda驱动程序的docker 镜像 。 如果你想知道这个图像是如何构build的,dockerhub上的dockerfile是可用的。

你会想要自定义这个命令来匹配你的nvidia设备。 以下是对我有用的东西:

  $ sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm tleyden5iwx/ubuntu-cuda /bin/bash 

确认CUDA已正确安装

这应该从刚刚启动的Docker容器中运行。

安装CUDA示例:

 $ cd /opt/nvidia_installers $ ./cuda-samples-linux-6.5.14-18745345.run -noprompt -cudaprefix=/usr/local/cuda-6.5/ 

构builddeviceQuery示例:

 $ cd /usr/local/cuda/samples/1_Utilities/deviceQuery $ make $ ./deviceQuery 

如果一切正常,您应该看到以下输出:

 deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs = 1, Device0 = GRID K520 Result = PASS 

好吧,我终于设法做到了,而不使用 – 特权模式。

我运行在Ubuntu的服务器14.04,我使用的是最新的cuda(6.0.37 for linux 13.04 64位)。


制备

在您的主机上安装nvidia驱动程序和cuda。 (这可能有点棘手,所以我会build议你按照这个指南https://askubuntu.com/questions/451672/installing-and-testing-cuda-in-ubuntu-14-04

注意:保存用于主机cuda安装的文件非常重要


获取Docker守护进程使用lxc运行

我们需要使用lxc驱动程序运行docker守护程序,以便能够修改configuration并使容器能够访问设备。

一次性使用:

 sudo service docker stop sudo docker -d -e lxc 

永久configuration修改位于/ etc / default / docker中的dockerconfiguration文件通过添加'-e lxc'来更改行DOCKER_OPTS这是修改后的行

 DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc" 

然后使用重新启动守护进程

 sudo service docker restart 

如何检查守护进程是否有效使用lxc驱动程序?

 docker info 

执行驱动程序行应该是这样的:

 Execution Driver: lxc-1.0.5 

使用NVIDIA和CUDA驱动程序构build您的图像。

这是一个基本的Dockerfile来build立一个CUDA兼容的图像。

 FROM ubuntu:14.04 MAINTAINER Regan <http://stackoverflow.com/questions/25185405/using-gpu-from-a-docker-container> RUN apt-get update && apt-get install -y build-essential RUN apt-get --purge remove -y nvidia* ADD ./Downloads/nvidia_installers /tmp/nvidia > Get the install files you used to install CUDA and the NVIDIA drivers on your host RUN /tmp/nvidia/NVIDIA-Linux-x86_64-331.62.run -s -N --no-kernel-module > Install the driver. RUN rm -rf /tmp/selfgz7 > For some reason the driver installer left temp files when used during a docker build (i don't have any explanation why) and the CUDA installer will fail if there still there so we delete them. RUN /tmp/nvidia/cuda-linux64-rel-6.0.37-18176142.run -noprompt > CUDA driver installer. RUN /tmp/nvidia/cuda-samples-linux-6.0.37-18176142.run -noprompt -cudaprefix=/usr/local/cuda-6.0 > CUDA samples comment if you don't want them. RUN export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64 > Add CUDA library into your PATH RUN touch /etc/ld.so.conf.d/cuda.conf > Update the ld.so.conf.d directory RUN rm -rf /temp/* > Delete installer files. 

运行你的形象。

首先,您需要确定与您的设备关联的主要号码。 最简单的方法是执行以下命令:

 ls -la /dev | grep nvidia 

如果结果是空的,使用启动主机上的一个样本应该做的伎俩。 结果应该是这样的 在这里输入图像说明 正如你所看到的,组和date之间有一组数字。 这两个数字被称为主要和次要数字(按此顺序写入)并devise一个设备。 我们只是为了方便而使用主要数字。

为什么我们激活lxc驱动程序? 使用lxc conf选项允许我们允许我们的容器访问这些设备。 选项是:(我build议使用*为次要的数字,因为它减less了运行命令的长度)

–lxc-conf ='lxc.cgroup.devices.allow = c [主号码]:[次要号码或*] rwm'

所以,如果我想启动一个容器(假设你的图像名称是cuda)。

 docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda 

我们刚刚发布了一个实验性的GitHub仓库 ,这个仓库应该可以简化在Docker容器中使用NVIDIA GPU的过程。

在Ubuntu 16.04上更新了cuda-8.0

Dockerfile

 FROM ubuntu:16.04 MAINTAINER Jonathan Kosgei <jonathan@saharacluster.com> # A docker container with the Nvidia kernel module and CUDA drivers installed ENV CUDA_RUN https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run RUN apt-get update && apt-get install -q -y \ wget \ module-init-tools \ build-essential RUN cd /opt && \ wget $CUDA_RUN && \ chmod +x cuda_8.0.44_linux-run && \ mkdir nvidia_installers && \ ./cuda_8.0.44_linux-run -extract=`pwd`/nvidia_installers && \ cd nvidia_installers && \ ./NVIDIA-Linux-x86_64-367.48.run -s -N --no-kernel-module RUN cd /opt/nvidia_installers && \ ./cuda-linux64-rel-8.0.44-21122537.run -noprompt # Ensure the CUDA libs and binaries are in the correct environment variables ENV LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64 ENV PATH=$PATH:/usr/local/cuda-8.0/bin RUN cd /opt/nvidia_installers &&\ ./cuda-samples-linux-8.0.44-21122537.run -noprompt -cudaprefix=/usr/local/cuda-8.0 &&\ cd /usr/local/cuda/samples/1_Utilities/deviceQuery &&\ make WORKDIR /usr/local/cuda/samples/1_Utilities/deviceQuery 
  1. 运行你的容器

sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm <built-image> ./deviceQuery

您应该看到类似于以下的输出:

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 Result = PASS

NVIDIA最近的改进产生了一个更强大的方法来做到这一点。

从本质上讲,他们已经find了一种避免在容器中安装CUDA / GPU驱动程序的方法,并使其与主机内核模块相匹配。

相反,驱动程序在主机上,容器不需要它们。 现在需要修改docker-cli。

这太好了,因为现在容器更加便于携带。

在这里输入图像说明

在Ubuntu上快速testing:

 # Install nvidia-docker and nvidia-docker-plugin 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 && rm /tmp/nvidia-docker*.deb # Test nvidia-smi nvidia-docker run --rm nvidia/cuda nvidia-smi 

有关更多详细信息,请参阅:支持GPU的Docker容器和: https : //github.com/NVIDIA/nvidia-docker