Je cherche un moyen d’utiliser le GPU depuis un conteneur Docker.
Le conteneur exécutera du code arbitraire, donc je ne veux pas utiliser le mode privilégié.
Des conseils?
D’après les recherches précédentes, il était clair que run -v
et / ou LXC cgroup
était la solution, mais je ne suis pas sûr de savoir comment le faire exactement.
La réponse de Regan est géniale, mais elle est un peu obsolète, car la bonne façon de le faire est d’éviter le contexte d’exécution lxc car Docker a abandonné LXC comme contexte d’exécution par défaut à partir de docker 0.9.
Au lieu de cela, il est préférable de renseigner docker sur les périphériques nvidia via l’indicateur –device, et d’utiliser simplement le contexte d’exécution natif plutôt que lxc.
Ces instructions ont été testées dans l’environnement suivant:
Voir CUDA 6.5 sur l’instance AWS GPU exécutant Ubuntu 14.04 pour obtenir la configuration de votre machine hôte.
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9 $ sudo sh -c "echo deb https://get.docker.com/ubuntu docker main > /etc/apt/sources.list.d/docker.list" $ sudo apt-get update && sudo apt-get install lxc-docker
ls -la /dev | grep nvidia crw-rw-rw- 1 root root 195, 0 Oct 25 19:37 nvidia0 crw-rw-rw- 1 root root 195, 255 Oct 25 19:37 nvidiactl crw-rw-rw- 1 root root 251, 0 Oct 25 19:37 nvidia-uvm
J’ai créé une image de docker avec les pilotes cuda pré-installés. Le fichier dockerfile est disponible sur dockerhub si vous voulez savoir comment cette image a été construite.
Vous voudrez personnaliser cette commande pour qu’elle corresponde à vos appareils NVIDIA. Voici ce qui a fonctionné pour moi:
$ sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm tleyden5iwx/ubuntu-cuda /bin/bash
Cela devrait être exécuté depuis l’intérieur du conteneur Docker que vous venez de lancer.
Installez des échantillons CUDA:
$ cd /opt/nvidia_installers $ ./cuda-samples-linux-6.5.14-18745345.run -noprompt -cudaprefix=/usr/local/cuda-6.5/
Build deviceQuery sample:
$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery $ make $ ./deviceQuery
Si tout a fonctionné, vous devriez voir la sortie suivante:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs = 1, Device0 = GRID K520 Result = PASS
Ok j’ai finalement réussi à le faire sans utiliser le mode –privé.
Je cours sur le serveur Ubuntu 14.04 et j’utilise le dernier cuda (6.0.37 pour Linux 13.04 64 bits).
Installez nvidia driver et cuda sur votre hôte. (cela peut être un peu difficile, alors je vous suggère de suivre ce guide https://askubuntu.com/questions/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
Nous devons exécuter le démon docker en utilisant le pilote lxc pour pouvoir modifier la configuration et permettre au conteneur d’accéder au périphérique.
Utilisation unique:
sudo service docker stop sudo docker -d -e lxc
Configuration permanente Modifiez le fichier de configuration de votre 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 effectivement le pilote lxc?
docker info
La ligne du pilote d’exécution doit ressembler à ceci:
Execution Driver: lxc-1.0.5
Voici un fichier Dockerfile de base pour créer une image compatible CUDA.
FROM ubuntu:14.04 MAINTAINER Regan 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.
Tout d’abord, vous devez identifier le numéro majeur associé à votre appareil. Le plus simple est de faire la commande suivante:
ls -la /dev | grep nvidia
Si le résultat est vide, utilisez le lancement de l’un des exemples sur l’hôte devrait faire l’affaire. Le résultat devrait ressembler à ça Comme vous pouvez le voir, il existe un ensemble de 2 chiffres entre le groupe et la date. Ces 2 numéros sont appelés numéros majeurs et mineurs (écrits dans cet ordre) et conçoivent un appareil. Nous allons simplement utiliser les principaux chiffres pour plus de commodité.
Pourquoi avons-nous activé le pilote lxc? Pour utiliser l’option de configuration lxc qui nous permet d’autoriser notre conteneur à accéder à ces périphériques. L’option est la suivante: (je recommande d’utiliser * pour le numéro mineur car cela réduit la longueur de la commande d’exécution)
–lxc-conf = ‘lxc.cgroup.devices.allow = c [numéro majeur]: [numéro mineur ou *] rwm’
Donc, si je veux lancer un conteneur (en supposant que le nom de votre image est cuda).
docker run -ti --lxc-conf='lxc.cgroup.devices.allow = c 195:* rwm' --lxc-conf='lxc.cgroup.devices.allow = c 243:* rwm' cuda
Nous venons de publier un repository GitHub expérimental qui devrait faciliter l’utilisation des GPU NVIDIA dans les conteneurs Docker.
Installez docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
Construisez l’image suivante qui inclut les pilotes nvidia et la boîte à outils cuda
Dockerfile
FROM ubuntu:16.04 MAINTAINER Jonathan Kosgei # A docker container with the Nvidia kernel module and CUDA drivers installed ENV CUDA_RUN https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run RUN apt-get update && apt-get install -q -y \ wget \ module-init-tools \ build-essential RUN cd /opt && \ wget $CUDA_RUN && \ chmod +x cuda_8.0.44_linux-run && \ mkdir nvidia_installers && \ ./cuda_8.0.44_linux-run -extract=`pwd`/nvidia_installers && \ cd nvidia_installers && \ ./NVIDIA-Linux-x86_64-367.48.run -s -N --no-kernel-module RUN cd /opt/nvidia_installers && \ ./cuda-linux64-rel-8.0.44-21122537.run -noprompt # Ensure the CUDA libs and binaries are in the correct environment variables ENV LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-8.0/lib64 ENV PATH=$PATH:/usr/local/cuda-8.0/bin RUN cd /opt/nvidia_installers &&\ ./cuda-samples-linux-8.0.44-21122537.run -noprompt -cudaprefix=/usr/local/cuda-8.0 &&\ cd /usr/local/cuda/samples/1_Utilities/deviceQuery &&\ make WORKDIR /usr/local/cuda/samples/1_Utilities/deviceQuery
sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm
Vous devriez voir une sortie similaire à:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 8.0, NumDevs = 1, Device0 = GRID K520 Result = PASS
Les améliorations récentes apscopes par NVIDIA ont permis d’obtenir une solution beaucoup plus robuste.
Essentiellement, ils ont trouvé un moyen d’éviter d’avoir à installer le pilote CUDA / GPU dans les conteneurs et de le faire correspondre au module du kernel hôte.
Au lieu de cela, les pilotes sont sur l’hôte et les conteneurs n’en ont pas besoin. Il nécessite un docker-cli modifié dès maintenant.
C’est génial, car maintenant les conteneurs sont beaucoup plus portables.
Un test rapide sur Ubuntu:
# Install nvidia-docker and nvidia-docker-plugin wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb # Test nvidia-smi nvidia-docker run --rm nvidia/cuda nvidia-smi
Pour plus de détails, voir: Docker Container compatible GPU et: https://github.com/NVIDIA/nvidia-docker
Pour utiliser le GPU depuis le conteneur docker, au lieu d’utiliser Docker natif, utilisez Nvidia-docker. Pour installer Nvidia Docker utiliser les commandes suivantes
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia- docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-docker sudo pkill -SIGHUP dockerd # Restart Docker Engine sudo nvidia-docker run --rm nvidia/cuda nvidia-smi # finally run nvidia-smi in the same container