U vraagt, wij geven antwoord!

CUDA® initialization: Unexpected error from cudaGetDeviceCount()

Sommige serverconfiguraties, zoals die met 8 x A100 SXM4 GPU's, hebben een eigenaardigheid. Wanneer Ubuntu is gekozen als besturingssysteem en de laatste NVIDIA® stuurprogramma's en CUDA® Toolkit zijn geïnstalleerd, resulteert een poging om een applicatie te draaien die is gebouwd met het PyTorch framework vaak in een foutmelding. Deze fout verschijnt meestal als volgt:

CUDA initialization: Unexpected error from cudaGetDeviceCount()

De fout kan niet alleen in de applicatie worden weergegeven, maar ook direct in de interactieve Python-console:

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

Deze fout geeft aan dat CUDA® het aantal beschikbare GPU's niet correct kan bepalen en dus geen bronnen kan toewijzen voor berekeningen. Vreemd genoeg wordt het juiste aantal weergegeven als je het commando uitvoert om de beschikbare apparaten te tellen:

>>> torch.cuda.device_count()
8

Het standaard nvidia-smi hulpprogramma werkt correct, maar extra functies zoals MIG zijn uitgeschakeld. Het upgraden of downgraden van het besturingssysteem, GPU-stuurprogramma's of CUDA® lost dit probleem niet op.

Mogelijke reden

De fout komt voort uit de methode van het systeem om beschikbare GPU's te detecteren. Standaard worden PyTorch modules geladen om beschikbare rekenapparaten te detecteren. Deze modules sturen cuDeviceGetByPCIBusId of cuDeviceGetPCIBusId verzoeken naar de CUDA® driver API. Als deze verzoeken mislukken, gaat het systeem ervan uit dat er geen apparaten beschikbaar zijn, waardoor PyTorch ze niet kan gebruiken.

Server voorbereiding

Voordat we het detectieprobleem aanpakken, isoleren we uit voorzorg onze Python-omgeving met behulp van een virtuele omgeving. Installeer het pakket:

sudo apt install python3-venv

Maak een map om alle bestanden en mappen voor de virtuele omgeving in op te slaan:

mkdir /home/usergpu/venv

Maak een geïsoleerde omgeving:

python -m venv /home/usergpu/venv

Activeer de omgeving. Alle volgende acties, zoals het installeren van pakketten of het uitvoeren van andere Python-gerelateerde taken, zullen beperkt blijven tot deze geïsoleerde omgeving. Deze acties hebben geen invloed op het besturingssysteem:

source /home/usergpu/venv/bin/activate

Installeer PyTorch met CUDA® 12.4 ondersteuning:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

Oplossing

Nu is alles klaar om het probleem dat de fout veroorzaakt op te lossen. Vervolgens moet u drie omgevingsvariabelen instellen:

  • CUDA_DEVICE_ORDER="PCI_BUS_ID" - GPU's sorteren door hun ID's te rangschikken met ID's op de PCIe-bus.
  • PYTORCH_NVML_BASED_CUDA_CHECK=1 - een beschikbaarheidscontrole uitvoeren met NVML(NVIDIA® Management Library). NVML is een API-laag voor het rechtstreeks verkrijgen van gegevens van het hulpprogramma nvidia-smi.
  • CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 - force toont het systeem de ID's van beschikbare GPU's.

Nu het systeem volledig op de hoogte is van de geïnstalleerde GPU's, kun je Python uitvoeren. Het volledige commando ziet er als volgt uit:

CUDA_DEVICE_ORDER="PCI_BUS_ID" PYTORCH_NVML_BASED_CUDA_CHECK=1 CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python3

Controleren:

>>> import torch
>>> torch.cuda.is_available()
True

U kunt nu elke toepassing op het PyTorch-framework uitvoeren zonder die foutmelding tegen te komen.

Een andere mogelijke reden

Soms werkt de bovenstaande oplossing niet vanwege een minder voor de hand liggend probleem. Configuraties zoals 8 x A100 SXM4 gebruiken de NVIDIA® Fabric Manager (FM) software. FM werkt als een coördinator, optimaliseert GPU-verbindingen en zorgt voor load balancing. Het is ook verantwoordelijk voor monitoring en servicefuncties, inclusief hoe de GPU's worden gepresenteerd aan het besturingssysteem.

FM communiceert constant met het NVIDIA® API stuurprogramma, dus de versie moet overeenkomen met de geïnstalleerde versie van het stuurprogramma. Als er een mismatch is, stopt de FM daemon met werken. Dit leidt tot het eerder beschreven gedrag, waarbij het framework beschikbare apparaten opvraagt, maar onjuiste gegevens ontvangt en de rekentaken niet goed kan verdelen.

Voer een eenvoudige diagnose uit om dit mogelijke probleem uit te sluiten:

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.

Het bovenstaande voorbeeld laat zien dat FM niet kon starten omdat de versie niet overeenkomt met de geïnstalleerde versie van het stuurprogramma. De eenvoudigste oplossing is om een stuurprogrammaversie te downloaden en te installeren die precies overeenkomt met de FM-versie (550.90.07). Er zijn verschillende manieren om dit te doen, maar de eenvoudigste methode is om een zelfuitpakkend archief in .run-formaat te downloaden.

wget https://download.nvidia.com/XFree86/Linux-x86_64/550.90.07/NVIDIA-Linux-x86_64-550.90.07.run

Maak dit bestand uitvoerbaar:

sudo chmod a+x NVIDIA-Linux-x86_64-550.90.07.run

En start de installatie:

sudo ./NVIDIA-Linux-x86_64-550.90.07.run

Zodra het stuurprogramma is geïnstalleerd, start u de daemon handmatig:

sudo systemctl start nvidia-fabricmanager

Controleer of de lancering succesvol was:

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.

Nu kun je proberen je op PyTorch gebaseerde applicatie te draaien om te controleren of alle GPU's beschikbaar zijn.

Zie ook:



Bijgewerkt: 28.03.2025

Gepubliceerd: 17.10.2024


Hebt u nog vragen? Schrijf ons!

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