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:
sudo service docker stop
sudo docker -d -e lxc
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
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
Starten Sie dann den Daemon mit neu
sudo service docker restart
Wie kann ich überprüfen, ob der Dämon den lxc-Treiber effektiv verwendet?
docker info
Die Zeile "Ausführungstreiber" sollte folgendermaßen 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 die Hauptnummer identifizieren, die Ihrem Gerät zugeordnet ist. Am einfachsten ist es, den folgenden Befehl auszuführen:
ls -la /dev | grep nvidia
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.)
--lxc-conf = 'lxc.cgroup.devices.allow = c [Hauptnummer]: [Nebennummer oder *] rwm'
Also, wenn ich einen Container starten möchte (Angenommen, 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