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
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).
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.
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
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.
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 Comme 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
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.
Ces instructions ont été testées sur l'environnement suivant:
Voir CUDA 6.5 sur l'instance AWS GPU exécutant Ubuntu 14.04 pour obtenir la configuration de votre ordinateur 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 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
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
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.
Installer le menu fixe 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 le toolkit cuda
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
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
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.
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
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
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