CUDA® initialization: Unexpected error from cudaGetDeviceCount()
Einige Serverkonfigurationen, z. B. solche mit 8 x A100 SXM4-GPUs, haben eine merkwürdige Eigenschaft. Wenn Ubuntu als Betriebssystem gewählt wird und die neuesten Nvidia-Treiber und das CUDA® Toolkit installiert sind, führt der Versuch, eine mit dem PyTorch-Framework erstellte Anwendung auszuführen, häufig zu einem Fehler. Dieser Fehler tritt typischerweise wie folgt auf:
CUDA initialization: Unexpected error from cudaGetDeviceCount()
Der Fehler kann nicht nur über die Anwendung, sondern auch direkt in der interaktiven Python-Konsole reproduziert werden:
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
Dieser Fehler deutet darauf hin, dass CUDA® die Anzahl der verfügbaren GPUs nicht korrekt ermitteln kann und daher keine Ressourcen für Berechnungen zuweisen kann. Seltsamerweise wird die korrekte Anzahl angezeigt, wenn Sie den Befehl zum Zählen der verfügbaren Geräte ausführen:
>>> torch.cuda.device_count() 8
Das Standarddienstprogramm nvidia-smi funktioniert korrekt, aber zusätzliche Funktionen wie MIG sind deaktiviert. Ein Upgrade oder Downgrade des Betriebssystems, der GPU-Treiber oder von CUDA® behebt dieses Problem nicht.
Mögliche Ursache
Der Fehler rührt von der Methode des Systems zur Erkennung verfügbarer GPUs her. Standardmäßig werden PyTorch-Module geladen, um verfügbare Recheneinheiten zu erkennen. Diese Module senden cuDeviceGetByPCIBusId oder cuDeviceGetPCIBusId Anfragen an die CUDA-Treiber-API. Wenn diese Anfragen fehlschlagen, geht das System davon aus, dass keine Geräte verfügbar sind, so dass PyTorch diese nicht verwenden kann.
Vorbereitung des Servers
Bevor wir uns mit dem Problem der Erkennung befassen, sollten wir unsere Python-Umgebung vorsichtshalber in einer virtuellen Umgebung isolieren. Installieren Sie das Paket:
sudo apt install python3-venv
Erstellen Sie ein Verzeichnis, in dem alle Dateien und Ordner für die virtuelle Umgebung gespeichert werden:
mkdir /home/usergpu/venv
Erstellen Sie eine isolierte Umgebung:
python -m venv /home/usergpu/venv
Aktivieren wir die Umgebung. Alle nachfolgenden Aktionen, wie die Installation von Paketen oder die Durchführung anderer Aufgaben im Zusammenhang mit Python, beschränken sich auf diese isolierte Umgebung. Diese Aktionen haben keinen Einfluss auf das Betriebssystem:
source /home/usergpu/venv/bin/activate
Installieren Sie PyTorch mit CUDA® 12.4-Unterstützung:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
Lösung
Jetzt ist alles bereit, um das Problem zu lösen, das den Fehler verursacht. Sie müssen im Folgenden drei Umgebungsvariablen setzen:
- CUDA_DEVICE_ORDER="PCI_BUS_ID" - sortiert die GPUs, indem es ihre IDs mit den IDs auf dem PCIe-Bus ordnet.
- PYTORCH_NVML_BASED_CUDA_CHECK=1 - führt eine Verfügbarkeitsprüfung mit NVML(NVIDIA® Management Library) durch. NVML ist eine API-Schicht, um Daten direkt vom nvidia-smi-Dienstprogramm zu erhalten.
- CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 - force zeigt dem System die IDs der verfügbaren GPUs an.
Da das System nun über die installierten GPUs Bescheid weiß, können Sie Python ausführen. Der vollständige Befehl sieht wie folgt aus:
CUDA_DEVICE_ORDER="PCI_BUS_ID" PYTORCH_NVML_BASED_CUDA_CHECK=1 CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python3
Prüfen:
>>> import torch >>> torch.cuda.is_available() True
Sie können nun jede Anwendung auf dem PyTorch-Framework ausführen, ohne dass dieser Fehler auftritt.
Eine andere mögliche Ursache
Manchmal kann die obige Lösung aufgrund eines weniger offensichtlichen Problems nicht funktionieren. Konfigurationen wie 8 x A100 SXM4 verwenden die NVIDIA® Fabric Manager (FM) Software. FM fungiert als Koordinator, optimiert die GPU-Verbindungen und sorgt für den Lastausgleich. Außerdem ist er für Überwachungs- und Servicefunktionen zuständig, einschließlich der Darstellung der GPUs im Betriebssystem.
FM kommuniziert ständig mit dem Nvidia-API-Treiber, weshalb seine Version mit der Version des installierten Treibers übereinstimmen muss. Bei einer Nichtübereinstimmung stellt der FM-Daemon seine Arbeit ein. Dies führt zu dem oben beschriebenen Verhalten, bei dem das Framework verfügbare Geräte anfordert, aber falsche Daten erhält und die Rechenaufgaben nicht richtig verteilen kann.
Um dieses mögliche Problem auszuschließen, führen Sie eine einfache Diagnose durch:
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.
Das obige Beispiel zeigt, dass FM nicht gestartet werden konnte, weil seine Version nicht mit der installierten Treiberversion übereinstimmt. Die einfachste Lösung besteht darin, eine Treiberversion herunterzuladen und zu installieren, die genau mit der FM-Version (550.90.07) übereinstimmt. Es gibt verschiedene Möglichkeiten, dies zu tun, aber die einfachste Methode ist, ein selbstextrahierendes Archiv im .run-Format herunterzuladen.
wget https://download.nvidia.com/XFree86/Linux-x86_64/550.90.07/NVIDIA-Linux-x86_64-550.90.07.run
Machen Sie diese Datei ausführbar:
sudo chmod a+x NVIDIA-Linux-x86_64-550.90.07.run
Und starten Sie die Installation:
sudo ./NVIDIA-Linux-x86_64-550.90.07.run
Sobald der Treiber installiert ist, starten Sie den Daemon manuell:
sudo systemctl start nvidia-fabricmanager
Überprüfen Sie, ob der Start erfolgreich war:
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.
Jetzt können Sie versuchen, Ihre PyTorch-basierte Anwendung auszuführen, um zu prüfen, ob alle GPUs verfügbar sind.
Siehe auch:
Aktualisiert: 28.03.2025
Veröffentlicht: 17.10.2024