web-dev-qa-db-fra.com

Vous utilisez un GPU depuis un conteneur de menu fixe?

Je cherche un moyen d'utiliser le GPU depuis un conteneur de menu fixe.

Le conteneur va exécuter du code arbitraire, donc je ne veux pas utiliser le mode privilégié.

Des conseils? 

Des recherches précédentes, j'ai compris que run -v et/ou LXC cgroup était la voie à suivre, mais je ne suis pas sûr de savoir comment retirer cela exactement

115
Regan

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 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 que vous conserviez les fichiers que vous avez utilisés pour l'installation de Host Cuda.


Obtenir le démon Docker à exécuter à l'aide de lxc

Nous devons exécuter le démon docker en utilisant le pilote lxc pour pouvoir modifier la configuration et donner au conteneur l’accès au périphérique.

Utilisation ponctuelle: 

Sudo service docker stop
Sudo docker -d -e lxc

Configuration permanente Modifiez le fichier de configuration de votre menu fixe situé dans /etc/default/dockerChangez 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 du pilote d'exécution devrait ressembler à ceci:

Execution Driver: lxc-1.0.5

Construisez votre image avec les pilotes NVIDIA et CUDA.

Voici un fichier Docker 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 le numéro majeur associé à votre appareil. La manière la plus simple consiste à exécuter la commande suivante: 

ls -la /dev | grep nvidia

Si le résultat est vide, lancer l'un des exemples sur l'hôte devrait faire l'affaire . Le résultat devrait ressembler à cela enter image description hereComme vous pouvez le constater, il existe 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 permettent de concevoir un appareil . utilisez les nombres majeurs pour plus de commodité.

Pourquoi avons-nous activé le pilote lxc? Pour utiliser l’option lxc conf qui nous permet de permettre à notre conteneur d’accéder à ces périphériques . L’option est la suivante: (Je recommande d’utiliser * pour le numéro mineur car il 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 votre nom d’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
36
Regan

La réponse de Regan est excellente, mais elle est un peu dépassée, car la bonne façon de le faire est d'éviter le contexte d'exécution de lxc car Docker a supprimé 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 le contexte d’exécution natif plutôt que lxc.

Environnement

Ces instructions ont été testées sur l'environnement suivant:

  • Ubuntu 14.04
  • CUDA 6.5
  • Instance AWS GPU.

Installez le pilote nvidia 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 ordinateur 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 docker sur laquelle les pilotes cuda sont préinstallés. Le 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 périphériques 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 doit être exécuté depuis le conteneur de menu fixe que vous venez de lancer.

Installez les exemples CUDA:

$ cd /opt/nvidia_installers
$ ./cuda-samples-linux-6.5.14-18745345.run -noprompt -cudaprefix=/usr/local/cuda-6.5/

Générez un exemple deviceQuery:

$ cd /usr/local/cuda/samples/1_Utilities/deviceQuery
$ make
$ ./deviceQuery   

Si tout a fonctionné, vous devriez voir le résultat suivant:

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 6.5, CUDA Runtime Version = 6.5, NumDevs =    1, Device0 = GRID K520
Result = PASS
118
tleyden

Nous venons de publier un dépôt GitHub expérimental qui devrait faciliter le processus d’utilisation des GPU NVIDIA dans les conteneurs Docker.

26
3XX0

Mise à jour pour cuda-8.0 sur Ubuntu 16.04

Dockerfile

FROM ubuntu:16.04
MAINTAINER Jonathan Kosgei <[email protected]>

# 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 <built-image> ./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

17
Jonathan

Les récentes améliorations apportées par NVIDIA ont produit un moyen beaucoup plus robuste de le faire.

Ils ont essentiellement trouvé un moyen d'éviter d'installer le pilote CUDA/GPU à l'intérieur des conteneurs et de le faire correspondre au module du noyau de l'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é pour le moment.

C'est formidable, car les conteneurs sont désormais beaucoup plus portables.

 enter image description here

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: Conteneur Docker activé par le GPU Et: https://github.com/NVIDIA/nvidia-docker

14
Matt

Pour utiliser le GPU à partir du conteneur Docker, utilisez plutôt Nvidia-docker au lieu d'utiliser Docker natif Pour installer le menu fixe Nvidia, utilisez 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
1
Patel Sunil

Utilisez x11docker par mviereck:

https://github.com/mviereck/x11docker#hardware-acceleration dit

Accélération matérielle

L'accélération matérielle pour OpenGL est possible avec l'option -g, --gpu.

Cela fonctionnera dans la plupart des cas avec des pilotes Open Source sur Host. Sinon, jetez un coup d'oeil aux dépendances wiki: feature. Les pilotes NVIDIA à source fermée nécessitent une certaine configuration et prennent en charge moins d’options de serveur X x11docker.

Ce script est vraiment pratique car il gère toute la configuration. Exécuter une image de menu fixe sur X avec gpu est aussi simple que

x11docker --gpu imagename
0
Blauhirn