¡Pregunte, nosotros le respondemos!

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


?Tiene más preguntas? ?Escribanos!

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