Ok, w końcu udało mi się to zrobić bez użycia trybu --privileged.
Pracuję na serwerze ubuntu 14.04 i używam najnowszego CUDA (6.0.37 dla Linuksa 13.04 64 bity).
Przygotowanie
Zainstaluj sterownik nvidia i cuda na swoim hoście. (może to być trochę trudne, więc proponuję postępować zgodnie z tym przewodnikiem /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )
UWAGA: Bardzo ważne jest, aby zachować pliki użyte do instalacji hosta cuda
Pobierz demona platformy Docker do uruchomienia przy użyciu lxc
Musimy uruchomić demona dockera przy użyciu sterownika lxc, aby móc modyfikować konfigurację i nadać kontenerowi dostęp do urządzenia.
Jednorazowe wykorzystanie:
sudo service docker stop
sudo docker -d -e lxc
Stała konfiguracja
Zmodyfikuj plik konfiguracyjny dockera znajdujący się w / etc / default / docker Zmień wiersz DOCKER_OPTS dodając '-e lxc' Oto moja linia po modyfikacji
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
Następnie zrestartuj demona za pomocą
sudo service docker restart
Jak sprawdzić, czy demon efektywnie wykorzystuje sterownik lxc?
docker info
Linia Execution Driver powinna wyglądać następująco:
Execution Driver: lxc-1.0.5
Zbuduj swój obraz za pomocą sterowników NVIDIA i CUDA.
Oto podstawowy plik Dockerfile do tworzenia obrazu zgodnego z 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.
Uruchom swój obraz.
Najpierw musisz zidentyfikować swój główny numer powiązany z twoim urządzeniem. Najłatwiej jest wykonać następujące polecenie:
ls -la /dev | grep nvidia
Jeśli wynik jest pusty, użyj uruchomienia jednej z próbek na hoście. Wynik powinien wyglądać tak.
Jak widać, między grupą a datą znajduje się zestaw 2 liczb. Te dwie liczby nazywane są liczbami głównymi i pomocniczymi (zapisane w tej kolejności) i projektują urządzenie. Dla wygody użyjemy tylko głównych liczb.
Dlaczego aktywowaliśmy sterownik LXC? Aby użyć opcji lxc conf, która pozwala nam zezwolić naszemu kontenerowi na dostęp do tych urządzeń. Dostępna opcja: (zalecam użycie znaku * jako podrzędnej liczby, ponieważ zmniejsza to długość polecenia uruchomienia)
--lxc-conf = 'lxc.cgroup.devices.allow = c [główna liczba]: [pomocnicza liczba lub *] rwm'
Więc jeśli chcę uruchomić kontener (zakładając, że nazwa twojego obrazu to cuda).
docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda