Utiliser un GPU depuis un conteneur Docker?

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.

Environnement

Ces instructions ont été testées dans l’environnement suivant:

  • Ubuntu 14.04
  • CUDA 6.5
  • Instance AWS GPU.

Installez nvidia driver et cuda sur votre hôte

Voir CUDA 6.5 sur l’instance AWS GPU exécutant Ubuntu 14.04 pour obtenir la configuration de votre machine hôte.

Installer Docker

 $ 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 

Trouvez vos appareils NVIDIA

 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 

Exécuter le conteneur Docker avec le pilote nvidia pré-installé

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 

Vérifiez que CUDA est correctement installé

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).


Préparation

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


Obtenez le démon Docker à exécuter en utilisant lxc

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 

Construisez votre image avec le pilote NVIDIA et CUDA.

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. 

Exécutez votre image.

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 entrer la description de l'image ici 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.

Mise à jour pour cuda-8.0 sur Ubuntu 16.04

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 
  1. Exécutez votre conteneur

sudo docker run -ti --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm ./deviceQuery

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.

entrer la description de l'image ici

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