it-swarm.com.de

GPU aus einem Docker-Container verwenden?

Ich suche nach einer Möglichkeit, die GPU in einem Docker-Container zu verwenden.

Der Container wird beliebigen Code ausführen, so dass ich den privilegierten Modus nicht verwenden möchte.

Irgendwelche Tipps? 

Aus früheren Recherchen war mir klar, dass run -v und/oder LXC cgroup der Weg war, aber ich bin nicht sicher, wie ich das genau hinbekomme

115
Regan

Ok, ich habe es endlich geschafft, ohne den --privileged-Modus zu benutzen.

Ich arbeite auf Ubuntu Server 14.04 und verwende die neueste Version von cuda (6.0.37 für Linux 13.04 64 Bit).


Vorbereitung

Installieren Sie den nvidia-Treiber und den cuda auf Ihrem Host. (es kann ein bisschen schwierig sein, deshalb schlage ich vor, dass Sie diesem Handbuch folgen https://askubuntu.com/questions/451672/installing-and-testing-cuda-in-ubuntu-14-04 )

ACHTUNG: Es ist wirklich wichtig, dass Sie die Dateien behalten, die Sie für die Host cuda-Installation verwendet haben


Holen Sie sich den Docker-Daemon mit lxc

Wir müssen einen Docker-Daemon mit dem lxc-Treiber ausführen, um die Konfiguration ändern zu können und dem Container Zugriff auf das Gerät zu gewähren.

Einmalige Nutzung: 

Sudo service docker stop
Sudo docker -d -e lxc

Permanente Konfiguration Ändern Sie die Docker-Konfigurationsdatei in /etc/default/dockerÄndern Sie die Zeile DOCKER_OPTS durch Hinzufügen von '-e lxc' Hier ist meine Zeile nach der Änderung

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

Starten Sie dann den Daemon erneut mit

Sudo service docker restart

Wie kann ich überprüfen, ob der Daemon den LXC-Treiber effektiv verwendet?

docker info

Die Execution Driver-Zeile sollte so aussehen:

Execution Driver: lxc-1.0.5

Erstellen Sie Ihr Image mit dem NVIDIA- und CUDA-Treiber.

Hier ist eine grundlegende Docker-Datei zum Erstellen eines CUDA-kompatiblen Images.

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.

Führen Sie Ihr Bild aus.

Zuerst müssen Sie Ihre Hauptnummer angeben, die mit Ihrem Gerät verbunden ist. Die einfachste Möglichkeit ist, den folgenden Befehl auszuführen: 

ls -la /dev | grep nvidia

Wenn das Ergebnis leer ist, verwenden Sie das Starten eines der Samples auf dem Host, um den Trick auszuführen. __ Das Ergebnis sollte so aussehenenter image description hereWie Sie sehen, gibt es zwischen der Gruppe und dem Datum einen Satz von 2 Zahlen. Diese beiden Zahlen werden als Haupt- und Nebenzahlen (in dieser Reihenfolge geschrieben) bezeichnet und entwerfen ein Gerät . Wir werden es nur tun Verwenden Sie die wichtigsten Zahlen für die Bequemlichkeit.

Warum haben wir den lxc-Treiber aktiviert? Um die Option lxc conf zu verwenden, die es uns ermöglicht, dass unser Container auf diese Geräte zugreifen kann .. Die Option lautet: (Ich empfehle die Verwendung von * für die untergeordnete Zahl, da dies die Länge von der Run-Befehl) 

--lxc-conf = 'lxc.cgroup.devices.allow = c [Hauptnummer]: [Nebenzahl oder *] rwm'

Wenn ich also einen Container starten möchte (vorausgesetzt, Ihr Bildname ist cuda).

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

Die Antwort von Regan ist großartig, aber etwas veraltet, da dies der richtige Weg ist, den lxc-Ausführungskontext zu vermeiden, da Docker LXC fallen gelassen als Standard-Ausführungskontext ab Docker 0.9 hat. 

Stattdessen ist es besser, Docker über das --device-Flag über die nvidia-Geräte zu informieren und einfach den nativen Ausführungskontext anstelle von lxc zu verwenden.

Umgebung

Diese Anweisungen wurden in der folgenden Umgebung getestet:

  • Ubuntu 14.04
  • CUDA 6,5
  • AWS-GPU-Instanz.

Installieren Sie den nvidia-Treiber und den cuda auf Ihrem Host

Unter CUDA 6.5 in AWS GPU-Instanz, auf der Ubuntu 14.04 ausgeführt wird } finden Sie Informationen zum Einrichten der Host-Maschine.

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

Finden Sie Ihre NVIDIA-Geräte

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

Führen Sie den Docker-Container mit dem vorinstallierten nvidia-Treiber aus

Ich habe ein Docker-Image erstellt, das die cuda-Treiber vorinstalliert hat. Die Andockdatei ist auf Dockerhub verfügbar, wenn Sie wissen möchten, wie dieses Image erstellt wurde.

Sie sollten diesen Befehl an Ihre nvidia-Geräte anpassen. Folgendes hat für mich funktioniert:

 $ 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

Stellen Sie sicher, dass CUDA korrekt installiert ist

Dies sollte aus dem Docker-Container ausgeführt werden, den Sie gerade gestartet haben.

Installieren Sie CUDA-Beispiele:

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

DeviceQuery-Beispiel erstellen:

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

Wenn alles funktioniert hat, sollten Sie folgende Ausgabe sehen:

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

Wir haben gerade ein experimentelles GitHub-Repository veröffentlicht, das die Verwendung von NVIDIA-GPUs in Docker-Containern erleichtern soll.

26
3XX0

Für cuda-8.0 auf Ubuntu 16.04 aktualisiert

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. Führen Sie Ihren Container aus

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

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

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

17
Jonathan

Die jüngsten Verbesserungen von NVIDIA haben dazu eine wesentlich robustere Methode geschaffen.

Im Wesentlichen haben sie einen Weg gefunden, um zu vermeiden, dass der CUDA/GPU-Treiber in den Containern installiert werden muss und mit dem Host-Kernel-Modul übereinstimmt.

Stattdessen befinden sich Treiber auf dem Host, und die Container benötigen sie nicht .. Sie benötigen jetzt ein modifiziertes Docker-CLI.

Das ist großartig, denn jetzt sind Container viel tragbarer.

 enter image description here

Ein kurzer Test zu 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

Für weitere Details siehe: GPU-fähiger Docker-Container Und: https://github.com/NVIDIA/nvidia-docker

14
Matt

Verwenden Sie Nvidia-Docker, um die GPU aus einem Docker-Container anstelle des nativen Docker zu verwenden. Um Nvidia Docker zu installieren, verwenden Sie folgende Befehle

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
1
Patel Sunil

Benutze x11docker von mviereck:

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

Hardware-Beschleunigung

Die Hardwarebeschleunigung für OpenGL ist mit der Option -g, --gpu möglich.

Dies funktioniert in den meisten Fällen mit Open Source-Treibern auf dem Host. Ansonsten schauen Sie sich das Wiki an: Featureabhängigkeiten. Geschlossene NVIDIA-Quelltreiber benötigen einige Setups und unterstützen weniger x11docker X-Serveroptionen.

Dieses Skript ist sehr praktisch, da es die gesamte Konfiguration und Einrichtung übernimmt. Das Ausführen eines Docker-Images auf X mit gpu ist so einfach wie

x11docker --gpu imagename
0
Blauhirn