Interrogez-nous, nous vous répondrons !

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


Des questions ? Écrivez-nous!

By clicking «I Accept» you confirm that you have read and accepted the website Terms and Conditions, Privacy Policy, and Moneyback Policy.