Ok, finalmente sono riuscito a farlo senza usare la modalità --privileged.
Sto correndo su Ubuntu Server 14.04 e sto usando l'ultimo cuda (6.0.37 per Linux 13.04 64 bit).
Preparazione
Installa il driver nvidia e cuda sul tuo host. (può essere un po 'complicato, quindi ti suggerisco di seguire questa guida /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )
ATTENZIONE: è davvero importante conservare i file utilizzati per l'installazione dell'host cuda
Fai eseguire il Docker Daemon usando lxc
Dobbiamo eseguire il demone docker usando il driver lxc per poter modificare la configurazione e dare al contenitore l'accesso al dispositivo.
Utilizzo una volta:
sudo service docker stop
sudo docker -d -e lxc
Configurazione permanente
Modifica il file di configurazione della finestra mobile situato in / etc / default / docker Cambia la riga DOCKER_OPTS aggiungendo '-e lxc' Ecco la mia riga dopo la modifica
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
Quindi riavviare il demone utilizzando
sudo service docker restart
Come verificare se il daemon utilizza effettivamente il driver lxc?
docker info
La riga del driver di esecuzione dovrebbe apparire così:
Execution Driver: lxc-1.0.5
Crea la tua immagine con i driver NVIDIA e CUDA.
Ecco un Dockerfile di base per creare un'immagine compatibile con CUDA.
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.
Esegui la tua immagine.
Innanzitutto è necessario identificare il numero principale associato al dispositivo. Il modo più semplice è eseguire il comando seguente:
ls -la /dev | grep nvidia
Se il risultato è vuoto, utilizzare l'avvio di uno dei campioni sull'host dovrebbe fare il trucco. Il risultato dovrebbe apparire così
Come puoi vedere c'è un set di 2 numeri tra il gruppo e la data. Questi 2 numeri sono chiamati numeri maggiori e minori (scritti in quell'ordine) e progettano un dispositivo. Useremo solo i numeri principali per comodità.
Perché abbiamo attivato il driver lxc? Utilizzare l'opzione conf di lxc che ci consente di consentire al nostro contenitore di accedere a tali dispositivi. L'opzione è: (consiglio di usare * per il numero minore perché riduce la lunghezza del comando di esecuzione)
--lxc-conf = 'lxc.cgroup.devices.allow = c [numero maggiore]: [numero minore o *] rwm'
Quindi, se voglio lanciare un container (supponendo che il nome della tua immagine sia cuda).
docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda