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