CUDA® initialization: Unexpected error from cudaGetDeviceCount()
Algunas configuraciones de servidor, como las que tienen 8 x A100 SXM4, tienen una característica peculiar. Cuando se elige Ubuntu como sistema operativo y se instalan los últimos controladores de NVIDIA® y CUDA® Toolkit, al intentar ejecutar una aplicación creada con el framework PyTorch suele producirse un error. Este error suele aparecer de la siguiente manera:
CUDA initialization: Unexpected error from cudaGetDeviceCount()
El error puede reproducirse no sólo a través de la aplicación sino también directamente en la consola interactiva de 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
Este error indica que CUDA® no puede determinar correctamente el número de GPUs disponibles y, por tanto, no puede asignar recursos para el cálculo. Curiosamente, si ejecutas el comando para contar los dispositivos disponibles, mostrará el número correcto:
>>> torch.cuda.device_count() 8
La utilidad estándar nvidia-smi funciona correctamente, pero las funciones adicionales como MIG están deshabilitadas. Actualizar o degradar el sistema operativo, los controladores de GPU o CUDA® no resuelve este problema.
Posible causa
El error tiene su origen en el método del sistema para detectar las GPUs disponibles. Por defecto, los módulos PyTorch se cargan para detectar los dispositivos de computación disponibles. Estos módulos envían peticiones cuDeviceGetByPCIBusId o cuDeviceGetPCIBusId a la API del controlador CUDA®. Si estas peticiones fallan, el sistema asume que no hay dispositivos disponibles, impidiendo que PyTorch los utilice.
Preparación del servidor
Antes de abordar el problema de la detección, vamos a aislar nuestro entorno Python utilizando un entorno virtual como precaución. Instala el paquete:
sudo apt install python3-venv
Crear un directorio para almacenar todos los archivos y carpetas para el entorno virtual:
mkdir /home/usergpu/venv
Creemos un entorno aislado:
python -m venv /home/usergpu/venv
Activemos el entorno. Todas las acciones posteriores, como instalar paquetes o realizar otras tareas relacionadas con Python, se limitarán a este entorno aislado. Estas acciones no afectarán al sistema operativo:
source /home/usergpu/venv/bin/activate
Instalar PyTorch con soporte CUDA® 12.4:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
Solución
Ahora todo está listo para solucionar el problema que causa el error. A continuación tendrás que configurar tres variables de entorno:
- CUDA_DEVICE_ORDER="PCI_BUS_ID" - ordenará las GPUs, ordenando sus IDs con los IDs del bus PCIe.
- PYTORCH_NVML_BASED_CUDA_CHECK=1 - realizará una comprobación de disponibilidad utilizando NVML(NVIDIA® Management Library). NVML es una capa API para obtener datos directamente de la utilidad nvidia-smi.
- CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 - fuerza mostrar al sistema los IDs de las GPUs disponibles.
Con el sistema ahora plenamente consciente de las GPUs instaladas, puedes proceder a ejecutar Python. El comando completo aparecerá de la siguiente forma
CUDA_DEVICE_ORDER="PCI_BUS_ID" PYTORCH_NVML_BASED_CUDA_CHECK=1 CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 python3
Comprobando:
>>> import torch >>> torch.cuda.is_available() True
Ahora puedes ejecutar cualquier aplicación en el framework PyTorch sin encontrarte con ese error.
Otra posible razón
A veces, la solución anterior puede no funcionar debido a un problema menos obvio. Configuraciones como 8 x A100 SXM4 utilizan el software NVIDIA® Fabric Manager (FM). FM actúa como coordinador, optimizando las conexiones de GPU y asegurando el equilibrio de carga. También es responsable de las funciones de supervisión y servicio, incluida la forma en que las GPU se presentan al sistema operativo.
FM se comunica constantemente con el controlador API de NVIDIA®, por lo que su versión debe coincidir con la del controlador instalado. Si hay un desajuste, el demonio FM deja de funcionar. Esto provoca el comportamiento descrito anteriormente, en el que el marco de trabajo solicita los dispositivos disponibles pero recibe datos incorrectos y no puede distribuir correctamente las tareas informáticas.
Para descartar este posible problema, realice un sencillo diagnóstico:
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.
El ejemplo anterior muestra que FM no pudo iniciarse porque su versión no coincide con la versión del controlador instalado. La solución más sencilla es descargar e instalar una versión del controlador que coincida exactamente con la versión de FM (550.90.07). Aunque hay varias formas de hacerlo, el método más sencillo es descargar un archivo autoextraíble en formato .run.
wget https://download.nvidia.com/XFree86/Linux-x86_64/550.90.07/NVIDIA-Linux-x86_64-550.90.07.run
Haga ejecutable este archivo:
sudo chmod a+x NVIDIA-Linux-x86_64-550.90.07.run
e inicie la instalación:
sudo ./NVIDIA-Linux-x86_64-550.90.07.run
Una vez instalado el controlador, inicie manualmente el demonio:
sudo systemctl start nvidia-fabricmanager
Comprueba que el lanzamiento se ha realizado correctamente:
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.
Ahora puedes intentar ejecutar tu aplicación basada en PyTorch para comprobar si todas las GPUs están disponibles.
Ver también:
Actualizado: 28.03.2025
Publicado: 17.10.2024