Ich suche nach einer Möglichkeit, die GPU in einem Docker-Container zu verwenden.
Der Container führt beliebigen Code aus, sodass ich den privilegierten Modus nicht verwenden möchte.
Irgendwelche Tipps?
Aus früheren Untersuchungen habe ich verstanden, dass run -v
und / oder LXC cgroup
der richtige Weg war, aber ich bin mir nicht sicher, wie ich das genau durchziehen soll
Antworten:
Regans Antwort ist großartig, aber etwas veraltet, da der richtige Weg, dies zu tun, darin besteht, den lxc-Ausführungskontext zu vermeiden, da Docker LXC ab Docker 0.9 als Standardausführungskontext gelöscht hat .
Stattdessen ist es besser, Docker über das Flag --device über die nvidia-Geräte zu informieren und statt lxc nur den nativen Ausführungskontext zu verwenden.
Umgebung
Diese Anweisungen wurden in der folgenden Umgebung getestet:
Installieren Sie den nvidia-Treiber und cuda auf Ihrem Host
Informationen zum Einrichten Ihres Host-Computers finden Sie in CUDA 6.5 auf der AWS GPU-Instanz unter Ubuntu 14.04 .
Installieren Sie Docker
Finden Sie Ihre NVIDIA-Geräte
Führen Sie den Docker-Container mit vorinstalliertem NVIDIA-Treiber aus
Ich habe ein Docker-Image erstellt , auf dem die Cuda-Treiber vorinstalliert sind. Die Docker-Datei 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 bei mir funktioniert:
Stellen Sie sicher, dass CUDA korrekt installiert ist
Dies sollte in dem Docker-Container ausgeführt werden, den Sie gerade gestartet haben.
Installieren Sie CUDA-Beispiele:
Beispiel für die Erstellung von deviceQuery:
Wenn alles funktioniert hat, sollten Sie die folgende Ausgabe sehen:
quelle
ls -la /dev | grep nvidia
aber CUDA kann kein CUDA-fähiges Gerät finden:./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 38
-> no CUDA-capable device is detected
Result = FAIL
Liegt es an der Nichtübereinstimmung der CUDA-Bibliotheken auf dem Host und im Container?Schreiben einer aktualisierten Antwort, da die meisten der bereits vorhandenen Antworten ab sofort veraltet sind.
Versionen früher als
Docker 19.03
früher erforderlichnvidia-docker2
und das--runtime=nvidia
Flag.Seitdem
Docker 19.03
müssen Sie dasnvidia-container-toolkit
Paket installieren und dann das--gpus all
Flag verwenden.Also, hier sind die Grundlagen,
Paketinstallation
Installieren Sie das
nvidia-container-toolkit
Paket gemäß der offiziellen Dokumentation bei Github .Führen Sie für Redhat-basierte Betriebssysteme die folgenden Befehle aus:
Führen Sie für Debian-basierte Betriebssysteme die folgenden Befehle aus:
Ausführen des Dockers mit GPU-Unterstützung
Bitte beachten Sie, dass das Flag
--gpus all
verwendet wird, um alle verfügbaren GPus dem Docker-Container zuzuweisen.So weisen Sie dem Docker-Container eine bestimmte GPU zu (falls mehrere GPUs auf Ihrem Computer verfügbar sind)
Oder
quelle
Ok, ich habe es endlich geschafft, ohne den --privileged-Modus zu verwenden.
Ich laufe auf Ubuntu Server 14.04 und verwende das neueste Cuda (6.0.37 für Linux 13.04 64 Bit).
Vorbereitung
Installieren Sie den nvidia-Treiber und cuda auf Ihrem Host. (Es kann etwas schwierig sein, daher empfehle ich Ihnen, diesem Handbuch zu folgen. /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )
ACHTUNG: Es ist sehr wichtig, dass Sie die Dateien behalten, die Sie für die Installation des Host-Cuda verwendet haben
Lassen Sie den Docker-Daemon mit lxc ausführen
Wir müssen den Docker-Daemon mit dem lxc-Treiber ausführen, um die Konfiguration ändern und dem Container Zugriff auf das Gerät gewähren zu können.
Einmalige Nutzung:
Permanente Konfiguration Ändern Sie Ihre Docker-Konfigurationsdatei in / etc / default / docker. Ändern Sie die Zeile DOCKER_OPTS, indem Sie '-e lxc' hinzufügen. Hier ist meine Zeile nach der Änderung
Starten Sie dann den Daemon mit neu
Wie kann ich überprüfen, ob der Dämon den lxc-Treiber effektiv verwendet?
Die Zeile "Ausführungstreiber" sollte folgendermaßen aussehen:
Erstellen Sie Ihr Image mit dem NVIDIA- und CUDA-Treiber.
Hier ist eine grundlegende Docker-Datei zum Erstellen eines CUDA-kompatiblen Images.
Führen Sie Ihr Bild aus.
Zuerst müssen Sie die Hauptnummer identifizieren, die Ihrem Gerät zugeordnet ist. Am einfachsten ist es, den folgenden Befehl auszuführen:
Wenn das Ergebnis leer ist, sollten Sie das Starten eines der Beispiele auf dem Host verwenden, um den Trick auszuführen. Das Ergebnis sollte so aussehen. Wie Sie sehen, gibt es zwischen der Gruppe und dem Datum einen Satz von 2 Zahlen. Diese beiden Zahlen werden als Haupt- und Nebenzahlen bezeichnet (in dieser Reihenfolge geschrieben) und entwerfen ein Gerät. Wir werden der Einfachheit halber nur die Hauptzahlen verwenden.
Warum haben wir den lxc-Treiber aktiviert? Verwendung der Option lxc conf, mit der wir unserem Container den Zugriff auf diese Geräte ermöglichen können. Die Option ist: (Ich empfehle die Verwendung von * für die untergeordnete Zahl, da dies die Länge des Ausführungsbefehls verringert.)
Also, wenn ich einen Container starten möchte (Angenommen, Ihr Bildname ist cuda).
quelle
--device
Option, dem Container den Zugriff auf das Gerät des Hosts zu ermöglichen. Ich habe jedoch versucht,--device=/dev/nvidia0
Docker-Container zuzulassen, um cuda auszuführen, und bin fehlgeschlagen./dev/nvidiao
,/dev/nvidia1
,/dev/nvidiactl
und/dev/nvidia-uvm
mit--device
. Obwohl ich nicht weiß warum./dev/nvidia*
@Regan. Für @ChillarAnand habe ich einen Cuda-Docker gemachtWir haben gerade ein experimentelles GitHub-Repository veröffentlicht, das die Verwendung von NVIDIA-GPUs in Docker-Containern vereinfachen soll.
quelle
Die jüngsten Verbesserungen von NVIDIA haben zu einer wesentlich robusteren Methode geführt.
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. Es erfordert derzeit eine modifizierte Docker-Cli.
Das ist großartig, denn jetzt sind Container viel tragbarer.
Ein kurzer Test unter Ubuntu:
Weitere Informationen finden Sie unter: GPU-fähiger Docker-Container und: https://github.com/NVIDIA/nvidia-docker
quelle
Aktualisiert für cuda-8.0 auf Ubuntu 16.04
Installieren Sie Docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
Erstellen Sie das folgende Image, das die NVIDIA-Treiber und das Cuda-Toolkit enthält
Dockerfile
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
quelle
Verwenden Sie Nvidia-Docker, um die GPU aus dem Docker-Container zu verwenden, anstatt den nativen Docker zu verwenden. Verwenden Sie die folgenden Befehle, um Nvidia Docker zu installieren
quelle
Verwenden Sie x11docker von mviereck:
https://github.com/mviereck/x11docker#hardware-acceleration sagt
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
quelle