Comment utiliser un GPU NVIDIA avec des conteneurs Docker
Les conteneurs Docker ne voient pas automatiquement le GPU de votre système. Cela entraîne une réduction des performances dans les charges de travail dépendantes du GPU, telles que les frameworks d’apprentissage automatique. Voici comment exposer le GPU NVIDIA de votre hôte à vos conteneurs.
Sommaire
Faire fonctionner les GPU dans Docker
Les conteneurs Docker partagent le noyau de votre hôte mais apportent leur propre système d’exploitation et leurs propres packages logiciels. Cela signifie qu’ils ne disposent pas des pilotes NVIDIA utilisés pour s’interfacer avec votre GPU. Docker n’ajoute même pas de GPU aux conteneurs par défaut, donc un simple docker run
ne verra pas du tout votre matériel.
À un niveau élevé, faire fonctionner votre GPU est une procédure en deux étapes : installez les pilotes dans votre image, puis demandez à Docker d’ajouter des périphériques GPU à vos conteneurs lors de l’exécution.
Ce guide se concentre sur les versions modernes de CUDA et Docker. La dernière version de NVIDIA Container Toolkit est conçue pour les combinaisons de CUDA 10 et Docker Engine 19.03 et versions ultérieures. Les versions plus anciennes de CUDA, Docker et des pilotes NVIDIA peuvent nécessiter des étapes supplémentaires.
Ajout des pilotes NVIDIA
Assurez-vous que les pilotes NVIDIA fonctionnent correctement sur votre hôte avant de continuer votre configuration Docker. Vous devriez pouvoir exécuter avec succès nvidia-smi
et voyez le nom de votre GPU, la version du pilote et la version CUDA.
Pour utiliser votre GPU avec Docker, commencez par ajouter le NVIDIA Container Toolkit à votre hôte. Cela s’intègre dans Docker Engine pour configurer automatiquement vos conteneurs pour la prise en charge du GPU.
Ajoutez le référentiel de packages de la boîte à outils à votre système à l’aide de l’exemple de commande :
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
Installez ensuite le nvidia-docker2
package sur votre hébergeur :
apt-get update apt-get install -y nvidia-docker2
Redémarrez le démon Docker pour terminer l’installation :
sudo systemctl restart docker
Le Container Toolkit devrait maintenant être opérationnel. Vous êtes prêt à démarrer un conteneur de test.
Démarrage d’un conteneur avec accès GPU
Comme Docker ne fournit pas les GPU de votre système par défaut, vous devez créer des conteneurs avec le --gpus
flag pour que votre matériel s’affiche. Vous pouvez soit spécifier des appareils spécifiques pour activer, soit utiliser le all
mot-clé.
le nvidia/cuda
les images sont préconfigurées avec les binaires CUDA et les outils GPU. Démarrez un conteneur et exécutez le nvidia-smi
commande pour vérifier l’accessibilité de votre GPU. La sortie doit correspondre à ce que vous avez vu lors de l’utilisation nvidia-smi
sur votre hôte. La version CUDA peut être différente selon les versions de la boîte à outils sur votre hôte et dans l’image de conteneur sélectionnée.
docker run -it --gpus all nvidia/cuda:11.4.0-base-ubuntu20.04 nvidia-smi
Sélection d’une image de base
En utilisant l’un des nvidia/cuda
tags est le moyen le plus rapide et le plus simple d’exécuter votre charge de travail GPU dans Docker. De nombreuses variantes différentes sont disponibles ; ils fournissent une matrice de système d’exploitation, de version CUDA et d’options logicielles NVIDIA. Les images sont conçues pour plusieurs architectures.
Chaque balise a ce format :
11.4.0-base-ubuntu20.04
11.4.0
– Version CUDA.base
– La saveur de l’image.ubuntu20.04
– Version du système d’exploitation.
Trois saveurs d’image différentes sont disponibles. le base
image est une option minimale avec les binaires d’exécution essentiels de CUDA. runtime
est une option plus complète qui inclut les bibliothèques mathématiques CUDA et NCCL pour la communication entre GPU. La troisième variante est devel
qui vous donne tout de runtime
ainsi que des en-têtes et des outils de développement pour créer des images CUDA personnalisées.
Si l’une des images fonctionne pour vous, essayez de l’utiliser comme base dans votre Dockerfile
. Vous pouvez ensuite utiliser les instructions Dockerfile habituelles pour installer vos langages de programmation, copier votre code source et configurer votre application. Il supprime la complexité des étapes de configuration manuelle du GPU.
FROM nvidia/cuda:11.4.0-base-ubuntu20.04 RUN apt update RUN apt-get install -y python3 python3-pip RUN pip install tensorflow-gpu COPY tensor-code.py . ENTRYPONT ["python3", "tensor-code.py"]
Construire et exécuter cette image avec le --gpus
flag démarrerait votre charge de travail Tensor avec l’accélération GPU.
Configuration manuelle d’une image
Vous pouvez ajouter manuellement le support CUDA à votre image si vous devez choisir une base différente. Le meilleur moyen d’y parvenir est de référencer les Dockerfiles officiels de NVIDIA.
Copiez les instructions utilisées pour ajouter le référentiel de packages CUDA, installez la bibliothèque et liez-la à votre chemin. Nous ne reproduisons pas toutes les étapes de ce guide car elles varient selon la version de CUDA et le système d’exploitation.
Faites attention aux variables d’environnement à la fin du Dockerfile – elles définissent comment les conteneurs utilisant votre image s’intègrent à NVIDIA Container Runtime :
ENV NVIDIA_VISIBLE_DEVICES all ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
Votre image devrait détecter votre GPU une fois CUDA installé et les variables d’environnement définies. Cela vous donne plus de contrôle sur le contenu de votre image mais vous laisse la possibilité d’ajuster les instructions au fur et à mesure de la sortie des nouvelles versions de CUDA.
Comment ça marche?
Le NVIDIA Container Toolkit est une collection de packages qui encapsulent des environnements d’exécution de conteneur comme Docker avec une interface vers le pilote NVIDIA sur l’hôte. le libnvidia-container
La bibliothèque est chargée de fournir une API et une CLI qui fournissent automatiquement les GPU de votre système aux conteneurs via le wrapper d’exécution.
le nvidia-container-toolkit
le composant implémente un runtime de conteneur prestart
accrocher. Cela signifie qu’il est averti lorsqu’un nouveau conteneur est sur le point de démarrer. Il examine les GPU que vous souhaitez attacher et appelle libnvidia-container
pour gérer la création de conteneurs.
Le crochet est activé par nvidia-container-runtime
. Cela encapsule votre environnement d’exécution de conteneur « réel » tel que containerd ou runc pour garantir que NVIDIA prestart
le crochet est exécuté. Votre environnement d’exécution existant continue le processus de démarrage du conteneur après l’exécution du hook. Lorsque la boîte à outils du conteneur est installée, vous verrez l’environnement d’exécution NVIDIA sélectionné dans votre fichier de configuration du démon Docker.
Résumé
L’utilisation d’un GPU NVIDIA dans un conteneur Docker nécessite l’ajout de NVIDIA Container Toolkit à l’hôte. Cela intègre les pilotes NVIDIA à votre environnement d’exécution de conteneur.
Appel docker run
avec le --gpu
flag rend votre matériel visible pour le conteneur. Cela doit être défini sur chaque conteneur que vous lancez, après l’installation de Container Toolkit.
NVIDIA fournit des images Docker CUDA préconfigurées que vous pouvez utiliser comme démarrage rapide pour votre application. Si vous avez besoin de quelque chose de plus spécifique, reportez-vous aux Dockerfiles officiels pour assembler le vôtre qui est toujours compatible avec Container Toolkit.