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

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

任何建议吗?

从以前的研究中,我了解到运行-v和/或LXC cgroup是要走的路,但我不确定如何把它拉下来


当前回答

Regan的回答很好,但有点过时了,因为正确的方法是避免使用lxc执行上下文,因为Docker从Docker 0.9开始就放弃了lxc作为默认执行上下文。

相反,最好通过——device标志告诉docker nvidia设备,并且只使用本机执行上下文而不是lxc。

环境

这些指令在以下环境中进行了测试:

Ubuntu 14.04 CUDA 6.5 AWS GPU实例。

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

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

安装码头工人

$ 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

找到你的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容器

我已经创建了一个预安装cuda驱动程序的docker映像。如果您想知道这个映像是如何构建的,dockerfile可以在dockerhub上找到。

您需要自定义此命令以匹配您的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/

构建deviceQuery示例:

$ 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

其他回答

如果可以使用docker,我不建议在主机上安装CUDA/cuDNN。至少从CUDA 8开始,就可以“站在巨人的肩膀上”,并在Docker Hub回购中使用nvidia/ CUDA的基础映像。如果不确定选择哪个版本,就选择最新最大的版本(如果进行深度学习,则使用cuDNN)。

一个启动CUDA容器:

mkdir ~/cuda11
cd ~/cuda11

echo "FROM nvidia/cuda:11.0-cudnn8-devel-ubuntu18.04" > Dockerfile
echo "CMD [\"/bin/bash\"]" >> Dockerfile

docker build --tag mirekphd/cuda11 .

docker run --rm -it --gpus 1 mirekphd/cuda11 nvidia-smi

样例输出:

(如果容器中没有找到NVIDIA -smi,不要尝试在那里安装它-它已经安装在带有NVIDIA GPU驱动程序的主机上,如果docker可以访问GPU,它应该从主机到容器系统可用):

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.57       Driver Version: 450.57       CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   50C    P8    17W / 280W |    409MiB / 11177MiB |      7%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

先决条件

首先在主机上安装适当的支持最新CUDA版本的NVIDIA驱动程序(从NVIDIA driver Downloads下载,然后mv driver-file.run driver-file.sh && chmod +x driver-file.sh && ./driver-file.sh)。自CUDA 10.1以来,这些都是向前兼容的。 通过安装sudo apt get update && sudo apt get install nvidia-container-toolkit在docker中启用GPU访问(然后使用sudo systemctl restart docker重新启动docker守护进程)。

要从docker容器中使用GPU,而不是使用本地docker,使用Nvidia-docker。要安装Nvidia docker,请使用以下命令

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey |  sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-
docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker
sudo pkill -SIGHUP dockerd # Restart Docker Engine
sudo nvidia-docker run --rm nvidia/cuda nvidia-smi # finally run nvidia-smi in the same container

翻译:

https://github.com/mviereck/x11docker硬件加速的说

硬件加速 OpenGL的硬件加速可以通过选项-g,——gpu实现。 在大多数情况下,这将与主机上的开源驱动程序开箱即用。否则,请查看wiki: feature dependencies。 闭源NVIDIA驱动程序需要一些设置,支持较少的x11docker X服务器选项。

这个脚本非常方便,因为它处理了所有的配置和设置。使用gpu在X上运行docker映像非常简单

x11docker --gpu imagename

我们刚刚发布了一个实验性的GitHub存储库,它可以简化在Docker容器中使用NVIDIA gpu的过程。

Regan的回答很好,但有点过时了,因为正确的方法是避免使用lxc执行上下文,因为Docker从Docker 0.9开始就放弃了lxc作为默认执行上下文。

相反,最好通过——device标志告诉docker nvidia设备,并且只使用本机执行上下文而不是lxc。

环境

这些指令在以下环境中进行了测试:

Ubuntu 14.04 CUDA 6.5 AWS GPU实例。

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

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

安装码头工人

$ 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

找到你的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容器

我已经创建了一个预安装cuda驱动程序的docker映像。如果您想知道这个映像是如何构建的,dockerfile可以在dockerhub上找到。

您需要自定义此命令以匹配您的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/

构建deviceQuery示例:

$ 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