Je recherche un moyen d'utiliser le GPU à partir d'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 des recherches précédentes, j'ai compris que run -v
et / ou LXC cgroup
était la voie à suivre, mais je ne sais pas comment y parvenir exactement
Réponses:
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 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 d'indiquer à docker 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:
Installez le pilote nvidia et cuda sur votre hôte
Consultez CUDA 6.5 sur l'instance AWS GPU exécutant Ubuntu 14.04 pour obtenir la configuration de votre machine hôte.
Installer Docker
Trouvez vos appareils nvidia
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 souhaitez 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:
Vérifiez que CUDA est correctement installé
Cela doit être exécuté à partir du conteneur Docker que vous venez de lancer.
Installez les exemples CUDA:
Build deviceQuery sample:
Si tout a fonctionné, vous devriez voir la sortie suivante:
la source
ls -la /dev | grep nvidia
mais CUDA ne trouve aucun périphérique compatible CUDA:./deviceQuery
./deviceQuery Starting...
CUDA Device Query (Runtime API) version (CUDART static linking)
cudaGetDeviceCount returned 38
-> no CUDA-capable device is detected
Result = FAIL
est-ce à cause de la non-concordance des bibliothèques CUDA sur l'hôte et dans le conteneur?Rédaction d'une réponse mise à jour car la plupart des réponses déjà présentes sont désormais obsolètes.
Versions antérieures à celles
Docker 19.03
utilisées pour exigernvidia-docker2
et le--runtime=nvidia
drapeau.Depuis
Docker 19.03
, vous devez installer lenvidia-container-toolkit
package, puis utiliser l'--gpus all
indicateur.Alors, voici les bases,
Installation du package
Installez le
nvidia-container-toolkit
package selon la documentation officielle sur Github .Pour les systèmes d'exploitation basés sur Redhat, exécutez l'ensemble de commandes suivant:
Pour les systèmes d'exploitation basés sur Debian, exécutez l'ensemble de commandes suivant:
Exécuter le docker avec le support GPU
Veuillez noter que l'indicateur
--gpus all
est utilisé pour attribuer tous les gpus disponibles au conteneur du docker.Pour attribuer un GPU spécifique au conteneur Docker (en cas de plusieurs GPU disponibles sur votre machine)
Ou
la source
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:
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
Puis redémarrez le démon en utilisant
Comment vérifier si le démon utilise efficacement le pilote lxc?
La ligne Execution Driver devrait ressembler à ceci:
Créez votre image avec les pilotes NVIDIA et CUDA.
Voici un Dockerfile de base pour créer une image compatible CUDA.
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:
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)
Donc, si je veux lancer un conteneur (en supposant que le nom de votre image soit cuda).
la source
--device
option pour permettre au conteneur d'accéder au périphérique de l'hôte. Cependant, j'ai essayé d'utiliser--device=/dev/nvidia0
pour permettre au conteneur docker d'exécuter cuda et j'ai échoué./dev/nvidiao
,/dev/nvidia1
,/dev/nvidiactl
et/dev/nvidia-uvm
avec--device
. Mais je ne sais pas pourquoi./dev/nvidia*
@Regan. Pour @ChillarAnand j'ai fait un cuda-dockerNous venons de publier un référentiel GitHub expérimental qui devrait faciliter le processus d'utilisation des GPU NVIDIA dans les conteneurs Docker.
la source
Les récentes améliorations apportées par NVIDIA ont produit un moyen beaucoup plus robuste de le faire.
Essentiellement, ils ont trouvé un moyen d'éviter d'avoir à installer le pilote CUDA / GPU à l'intérieur des conteneurs et de le faire correspondre au module du noyau 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 génial, car maintenant les conteneurs sont beaucoup plus portables.
Un test rapide sur Ubuntu:
Pour plus de détails, voir: Conteneur Docker compatible GPU et: https://github.com/NVIDIA/nvidia-docker
la source
Mis à jour pour cuda-8.0 sur Ubuntu 16.04
Installez docker https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-16-04
Créez l'image suivante qui inclut les pilotes nvidia et la boîte à outils cuda
Dockerfile
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
la source
Pour utiliser le GPU à partir du conteneur Docker, au lieu d'utiliser Docker natif, utilisez Nvidia-docker. Pour installer le docker Nvidia, utilisez les commandes suivantes
la source
Utilisez x11docker de mviereck:
https://github.com/mviereck/x11docker#hardware-acceleration dit
Ce script est vraiment pratique car il gère toute la configuration et l'installation. Exécuter une image docker sur X avec gpu est aussi simple que
la source