Ok, j'ai finalement réussi à le faire sans utiliser le mode --privileged.
Je cours sur le serveur ubuntu 14.04 et j'utilise le dernier cuda (6.0.37 pour linux 13.04 64 bits).
Préparation
Installez le pilote nvidia et cuda sur votre hôte. (cela peut être un peu délicat donc je vous suggère de suivre ce guide /ubuntu/451672/installing-and-testing-cuda-in-ubuntu-14-04 )
ATTENTION: il est très important de conserver les fichiers que vous avez utilisés pour l'installation de l'hôte cuda
Lancez le démon Docker à l'aide de lxc
Nous devons exécuter le démon docker à l'aide du pilote lxc pour pouvoir modifier la configuration et donner au conteneur l'accès au périphérique.
Utilisation unique:
sudo service docker stop
sudo docker -d -e lxc
Configuration permanente
Modifiez votre fichier de configuration docker situé dans / etc / default / docker Changez la ligne DOCKER_OPTS en ajoutant '-e lxc' Voici ma ligne après modification
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -e lxc"
Puis redémarrez le démon en utilisant
sudo service docker restart
Comment vérifier si le démon utilise efficacement le pilote lxc?
docker info
La ligne Execution Driver devrait ressembler à ceci:
Execution Driver: lxc-1.0.5
Créez votre image avec les pilotes NVIDIA et CUDA.
Voici un Dockerfile de base pour créer une image compatible 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.
Exécutez votre image.
Vous devez d'abord identifier votre numéro principal associé à votre appareil. Le moyen le plus simple consiste à exécuter la commande suivante:
ls -la /dev | grep nvidia
Si le résultat est vide, utilisez le lancement de l'un des échantillons sur l'hôte devrait faire l'affaire. Le résultat devrait ressembler à ça
Comme vous pouvez le voir, il y a un ensemble de 2 nombres entre le groupe et la date. Ces 2 nombres sont appelés nombres majeurs et mineurs (écrits dans cet ordre) et désignent un appareil. Nous n'utiliserons que les chiffres majeurs pour plus de commodité.
Pourquoi avons-nous activé le pilote lxc? Pour utiliser l'option lxc conf qui nous permet d'autoriser notre conteneur à accéder à ces périphériques. L'option est: (je recommande d'utiliser * pour le nombre mineur car il réduit la longueur de la commande d'exécution)
--lxc-conf = 'lxc.cgroup.devices.allow = c [nombre majeur]: [nombre mineur ou *] rwm'
Donc, si je veux lancer un conteneur (en supposant que le nom de votre image soit cuda).
docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda