NVIDIA GPUs sur Kubernetes
Ajouter un GPU à Kubernetes m'a permis de jouer avec Jellyfin et LLaMA sur un serveur Kubernetes qui se trouve sur un ordinateur à la maison mais les étapes sont reproduisible dans le cloud.
Je couvrirais les étapes d'installation et de configuration suivantes:
Kubernetes
Container Runtime
Software
GPU
Pour l'utilisation du GPU sur nos POD, le containeur devra inclure les les logiciels/drivers pour l'utilisation de CUDA.
Comment Kubernetes sait quel POD à besoin de GPUs?
Dans Kubernetes, les pods necessitant des GPU sont identifié par les demandes ressources et les limites dans la coniguration de pod
Ressources étendue
Ressources étendue: Les GPU ne sont pas reconnus nativement par Kubernetes mais sont considéré comme des "ressources étendues" necessitant donc une configuration spéciale pour leur utilisation.
Runtime Class
Runtime Class: Pour utiliser des ressources spécifiquement comme les GPU NVIDIA, Kubernetes peut etre configuré pour utiliser une classe d'éxecution spécifique ('runtimeClassName'). Cela permet d'utiliser le runtime de conteneur NVIDIA qui est optimisé pour les GPU.
spec:
runtimeClassName: nvidia # Utiliser le runtime de conteneur NVIDIADemandes et limites de ressources
Demandes et limites de ressources: La spécification du pod (spec) utilise des demandes et des limites de ressources pour déclarer explicitement qu'un certain nombre de GPU sont nécessaires. Pour les GPU NVIVIA cela est généralement défini comme nvidia.com/gpu
NodeSelector
Cet attribut aide à planifier les pods sur les noeuds qui ont les GPU requis. Il garanti que le pod s'exécute sur un nœud capable de répondre aux exigences de GPU
Tolérance
Il est également courant de voir NoSchedule dans la configuration. Il s'agit d'empecher l'eceution de charges de travail qui n'ont pas explicitement besoin de GPU. (Taints and toleration docs)
NVIDIA GPU Operator
Les fonctionnalités des GPU NVIDIA sont géré automatiquement par le NVIDIA GPU Operator, cela facilite grandement l'utilisation des cartes graphiques GPU dans un environnement Kubernetes.
NVIDIA GPU Operator : L'opérateur s'occupe automatiquement de plusieurs tâches complexes :
Installation des pilotes : Il peut installer tout seul les logiciels nécessaires pour que les GPU fonctionnent correctement sur les ordinateurs (node).
Configuration du système : Il configure le système pour que les conteneurs puissent utiliser efficacement les GPU.
Étiquetage des nœuds : Il ajoute des labels sur les nodes pour indiquer quels nœuds ont des GPU et combien.
NVIDIA device Plugin : C'est une composante qui:
Détecte les GPU : il detecte automatiquement le nombre de GPU disponible sur chaque node et informe Kubernetes de savoir combien de GPU sont libres ou utilisés.
Surveille la santé des GPU : Il suit l'état de fonctionnement des GPU pour s'assurer que tout fonctionne bien.
Exécution de conteneurs avec GPU : Il permet de lancer des applications qui nécessitent des GPU pour fonctionner plus rapidement, par exemple pour traiter des images ou des calculs complexes.
Planification et exécution : Le cluster Kubernetes a programmé des taches sur les nodes pour être prêts à utiliser les GPU et a donné les instructions nécessaires pour utiliser ces ressources GPU de manière optimale.
Configuration NVIDIA sur Kubernetes
Vérifier la présence de la carte GPU
Utiliser lspci pour faire apparaitre les informations PCI sur votre système et ainsi vérifier la présence de votre carte GPU.
Vous devriez voir:
Vérification des drivers GPU NVIDIA
Utiliser la recherche sur le site de téléchargement des drivers NVIDIA pour trouver le dernier recommandé pour votre carte.
Par exemple pour ma 2080TI
Version
550.78
Release Date
2024.4.25
Operating System
Linux 64-bit
Language
English (US)
File Size
292.67 MB
Ce qui veut dire que l'on doit prendre la version 550+
Installation des drivers GPU
Il existe plusieurs methode pour installer les drivers sur mon serveur Ubuntu 24.04 LTS:
Officiel Ubuntu NVIDIA drivers via
ubuntu-drivers install(lien)Officiel NVIDIA driver via
.run file(lien)Non officiel version driver NVIDIA via
ppa:graphics-drivers/ppa(lien)
Dans mon cas pour notre installation nous utiliserons l'option (ppa)
Ajouter le repo PPA et installer la version de driver trouvé sur le site officiel.
Tester la version du driver installé avec la commande nvidia-smi
Dans mon cas j'ai comme retour 550.78
Pour voir la liste des packages installé utilisé dpkg -l avec "nvidia" ou "550"
Vérifier les modules kernel installé en utilisant lsmod qui permet de lister ce qui se trouve dans /proc/modules
Si tout semble bon vous devriez avoir:
Vérifiez le fichier de version du pilote du kernel:
Vérifiez le fichier de périphérique NVIDIA trouvé:
Votre serveur maintenant a bien un GPU NVIDIA d'installé et fonctionnel si le retour de la commande est:
TIPS
Pour éviter un changement ou une mise à jour non planifié, nous devons appliquer un hold sur les packages
Ce qui donne:
Avant une mise à jour planifié, il faut penser à retirer le tag hold sur les packages en faisant
Installation du Container Toolkit NVIDIA
Vous pouvez trouver le guide d'installation officiel de NVIDIA
Mon environnement Kubernetes étant sur containerd, nous avons besoin de mettre à jour la configuration runtime classes.
Toujours depuis le guide NVIDIA sur la configuration
Valider en vérifiant que nvidia runtime existe bien dans la config
le résultat doit être:
Installation de NVIDIA GPU Operator
Nous devons maintenant installer le NVIDIA GPU Operator avec helm.
Vous pouvez installer helm en suivant le guide officiel
Ajouter le repo helm et faire un update:
Déployer NVIDIA GPU Operator sur votre serveur, par défaut il installe NVIDIA Container Toolkit et NVIDIA drivers comme des container sur le node. Les valeurs sont misent à false car nous venons de le faire.
Vérifier le déploiement des pods:
fini vous devriez avoir:
Valider l'installation avec cette comande:
vous devez avoir comme resultat Number of nodes with GPU label","NodeCount":1 ou 1 est le nombre de node avec une GPU
S'il donne comme resulat 0 il y a une erreur, vous pouvez debugger avec la comande:
Pour finir, mettez en place un pod sur votre cluster pour verifier que votre integration NVIDIA fonctionne:
regarder les logs:
vous devez avoir ce résultat:

Félicitation 🎉🎉 vous avez un GPU de configuré sur une cluster Kubernetes.
Liens utiles
Site sur lequel je me suis basé
Mis à jour
