CUDA® initialization: Unexpected error from cudaGetDeviceCount()
Certaines configurations de serveur, telles que celles avec 8 x A100 SXM4 GPU, ont une caractéristique particulière. Lorsque Ubuntu est choisi comme système d'exploitation et que les derniers pilotes NVIDIA® et CUDA® Toolkit sont installés, toute tentative d'exécution d'une application construite avec le cadre PyTorch entraîne souvent une erreur. Cette erreur se présente généralement comme suit :
CUDA initialization: Unexpected error from cudaGetDeviceCount()
L'erreur peut être reproduite non seulement dans l'application, mais aussi directement dans la console interactive Python :
python3
>>> import torch >>> torch.cuda.is_available() /usr/local/lib/python3.10/dist-packages/torch/cuda/__init__.py:128: UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 802: system not yet initialized (Triggered internally at ../c10/cuda/CUDAFunctions.cpp:108.) return torch._C._cuda_getDeviceCount() > 0
Cette erreur indique que CUDA® ne peut pas déterminer correctement le nombre de GPU disponibles et ne peut donc pas allouer de ressources pour le calcul. Curieusement, si vous exécutez la commande pour compter les périphériques disponibles, le nombre affiché est correct :
>>> torch.cuda.device_count() 8
L'utilitaire standard nvidia-smi fonctionne correctement, mais les fonctions supplémentaires telles que MIG sont désactivées. La mise à niveau du système d'exploitation, des pilotes de GPU ou de CUDA® ne résout pas ce problème.
Raison possible
L'erreur provient de la méthode utilisée par le système pour détecter les GPU disponibles. Par défaut, les modules PyTorch sont chargés pour détecter les périphériques informatiques disponibles. Ces modules envoient des demandes cuDeviceGetByPCIBusId ou cuDeviceGetPCIBusId à l'API du pilote CUDA®. Si ces requêtes échouent, le système suppose qu'aucun périphérique n'est disponible, ce qui empêche PyTorch de les utiliser.
Préparation du serveur
Avant d'aborder le problème de la détection, isolons notre environnement Python à l'aide d'un environnement virtuel par précaution. Installez le paquetage :
sudo apt install python3-venv
Créez un répertoire pour stocker tous les fichiers et dossiers de l'environnement virtuel :
mkdir /home/usergpu/venv
Créez un environnement isolé :
python -m venv /home/usergpu/venv
Activons l'environnement. Toutes les actions ultérieures, telles que l'installation de paquets ou l'exécution d'autres tâches liées à Python, seront confinées à cet environnement isolé. Ces actions n'affecteront pas le système d'exploitation :
source /home/usergpu/venv/bin/activate
Installer PyTorch avec prise en charge de CUDA® 12.4 :
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
Solution
Tout est maintenant prêt pour résoudre le problème à l'origine de l'erreur. Vous devrez définir trois variables d'environnement par la suite :
- CUDA_DEVICE_ORDER="PCI_BUS_ID" - triera les GPU, en ordonnant leurs ID avec les ID sur le bus PCIe.
- PYTORCH_NVML_BASED_CUDA_CHECK=1 - effectuer une vérification de la disponibilité à l'aide de la NVML(NVIDIA® Management Library). NVML est une couche API permettant d'obtenir des données directement à partir de l'utilitaire nvidia-smi.
- CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 - Le NVML est une couche API permettant d'obtenir des données directement à partir de l'utilitaire nvidia-smi.
Le système connaissant désormais les GPU installés, vous pouvez lancer Python. La commande complète apparaîtra comme suit :
CUDA_DEVICE_ORDER="PCI_BUS_ID" PYTORCH_NVML_BASED_CUDA_CHECK=1 CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python3
Vérification :
>>> import torch >>> torch.cuda.is_available() True
Vous pouvez maintenant exécuter n'importe quelle application sur le framework PyTorch sans rencontrer cette erreur.
Autre raison possible
Parfois, la solution ci-dessus peut ne pas fonctionner en raison d'un problème moins évident. Les configurations telles que 8 x A100 SXM4 utilisent le logiciel NVIDIA® Fabric Manager (FM). FM agit comme un coordinateur, optimisant les connexions GPU et assurant l'équilibrage de la charge. Il est également responsable des fonctions de surveillance et de service, y compris la manière dont les GPU sont présentés au système d'exploitation.
FM communique en permanence avec le pilote API de NVIDIA®, de sorte que sa version doit correspondre à celle du pilote installé. En cas d'incompatibilité, le démon FM cesse de fonctionner. Cela entraîne le comportement décrit précédemment, où le cadre demande des périphériques disponibles mais reçoit des données incorrectes et ne peut pas distribuer correctement les tâches informatiques.
Pour écarter ce problème potentiel, effectuez un diagnostic simple :
sudo systemctl status nvidia-fabricmanager
× nvidia-fabricmanager.service - NVIDIA fabric manager service Loaded: loaded (/lib/systemd/system/nvidia-fabricmanager.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Thu 2024-10-17 21:01:05 UTC; 8h ago Process: 3992 ExecStart=/usr/bin/nv-fabricmanager -c /usr/share/nvidia/nvswitch/fabricmanager.cfg (code=exited, status=1/FAILURE) CPU: 11ms Oct 17 21:01:05 ubuntu22044 systemd[1]: Starting NVIDIA fabric manager service... Oct 17 21:01:05 ubuntu22044 nv-fabricmanager[3994]: fabric manager NVIDIA GPU driver interface version 550.90.07 don't match with driver version 550.54.15. Please update with matching NVIDIA driver package. Oct 17 21:01:05 ubuntu22044 systemd[1]: Failed to start NVIDIA fabric manager service.
L'exemple ci-dessus montre que FM n'a pas pu démarrer parce que sa version ne correspond pas à la version du pilote installé. La solution la plus simple consiste à télécharger et à installer une version de pilote qui corresponde exactement à la version de FM (550.90.07). Bien qu'il existe plusieurs façons de procéder, la méthode la plus simple consiste à télécharger une archive auto-extractible au format .run.
wget https://download.nvidia.com/XFree86/Linux-x86_64/550.90.07/NVIDIA-Linux-x86_64-550.90.07.run
Rendez ce fichier exécutable :
sudo chmod a+x NVIDIA-Linux-x86_64-550.90.07.run
Et lancez l'installation :
sudo ./NVIDIA-Linux-x86_64-550.90.07.run
Une fois le pilote installé, démarrez manuellement le démon :
sudo systemctl start nvidia-fabricmanager
Vérifiez que le lancement a réussi :
sudo systemctl status nvidia-fabricmanager
● nvidia-fabricmanager.service - NVIDIA fabric manager service Loaded: loaded (/lib/systemd/system/nvidia-fabricmanager.service; enabled; vendor preset: enabled) Active: active (running) since Fri 2024-10-18 05:45:26 UTC; 5s ago Process: 36614 ExecStart=/usr/bin/nv-fabricmanager -c /usr/share/nvidia/nvswitch/fabricmanager.cfg (code=exited, status=0/SUCCESS) Main PID: 36616 (nv-fabricmanage) Tasks: 19 (limit: 629145) Memory: 16.2M CPU: 32.350s CGroup: /system.slice/nvidia-fabricmanager.service └─36616 /usr/bin/nv-fabricmanager -c /usr/share/nvidia/nvswitch/fabricmanager.cfg Oct 18 05:45:02 ubuntu22044 systemd[1]: Starting NVIDIA fabric manager service... Oct 18 05:45:15 ubuntu22044 nv-fabricmanager[36616]: Connected to 1 node. Oct 18 05:45:26 ubuntu22044 nv-fabricmanager[36616]: Successfully configured all the available GPUs and NVSwitches to route NVLink traffic. Oct 18 05:45:26 ubuntu22044 systemd[1]: Started NVIDIA fabric manager service.
Vous pouvez maintenant essayer d'exécuter votre application basée sur PyTorch pour vérifier si tous les GPU sont disponibles.
Voir aussi :
Mis à jour: 28.03.2025
Publié: 17.10.2024