从docker容器中使用GPU?

问题描述 投票:126回答:7

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

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

有小费吗?

从以前的研究中我了解到run -v和/或LXC cgroup是要走的路,但我不确定如何完全取消

cuda docker
7个回答
123
投票

Regan的答案很棒,但它有点过时,因为正确的方法是避免lxc执行上下文,因为Docker将dropped LXC作为docker 0.9的默认执行上下文。

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

Environment

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

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

Install nvidia driver and cuda on your host

请参阅CUDA 6.5 on AWS GPU Instance Running Ubuntu 14.04以获取主机设置。

Install 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 your nvidia devices

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

Run Docker container with nvidia driver pre-installed

我已经创建了一个预先安装了cuda驱动程序的docker image。如果你想知道这个图像是如何构建的,可以在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

Verify CUDA is correctly installed

这应该从刚刚启动的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

38
投票

好吧,我终于设法在不使用--privileged模式的情况下完成了。

我正在运行ubuntu服务器14.04,我正在使用最新的cuda(6.0.37 for linux 13.04 64 bit)。


Preparation

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

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


Get the Docker Daemon to run using lxc

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

一次使用:

sudo service docker stop
sudo docker -d -e lxc

永久配置修改位于/ etc / default / docker中的docker配置文件通过添加'-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

Build your image with the NVIDIA and CUDA driver.

这是一个用于构建CUDA兼容映像的基本Dockerfile。

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.

Run your image.

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

ls -la /dev | grep nvidia

如果结果为空,请使用启动主机上的其中一个样本。结果应该如下所示正如您所看到的,组和日期之间有一组2个数字。这两个数字称为主要和次要数字(按此顺序写入)并设计一个设备。为方便起见,我们将使用主要数字。

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

--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

29
投票

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


17
投票

更新了ubuntu 16.04上的cuda-8.0

Dockerfile

FROM ubuntu:16.04
MAINTAINER Jonathan Kosgei <[email protected]>

# 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


16
投票

NVIDIA最近的增强功能已经产生了一种更加强大的方式来实现这一目标。

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

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

这很棒,因为现在容器更便携。

enter image description here

对Ubuntu的快速测试:

# 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-Enabled Docker Container和:https://github.com/NVIDIA/nvidia-docker


1
投票

要使用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

0
投票

使用mviereck的x11docker

https://github.com/mviereck/x11docker#hardware-acceleration

硬件加速

使用选项-g, - gpu可以实现OpenGL的硬件加速。

在大多数情况下,这将在主机上使用开源驱动程序开箱即用。否则看一下wiki:feature dependencies。封闭源NVIDIA驱动程序需要一些设置并支持更少的x11docker X服务器选项。

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

x11docker --gpu imagename
© www.soinside.com 2019 - 2024. All rights reserved.