# Acceso a la GPU


## Acceder a una GPU de NVIDIA

### Requisitos previos

Visita la [página oficial de controladores de NVIDIA](https://www.nvidia.com/Download/index.aspx) para descargar e instalar los controladores adecuados. Reinicia tu sistema una vez que lo hayas hecho.

Verifica que tu GPU esté funcionando y sea accesible.

### Instalar NVIDIA Container Toolkit

Sigue las [instrucciones de instalación](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html) oficiales de NVIDIA Container Toolkit.

### Exponer GPUs para su uso

Incluye la bandera `--gpus` cuando inicies un contenedor para acceder a los recursos de la GPU.

Para exponer todas las GPUs disponibles:

```console
$ docker run -it --rm --gpus all ubuntu nvidia-smi
```

La salida se ve de la siguiente manera:

```text
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.288.01             Driver Version: 535.288.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA L4                      Off | 00000000:31:00.0 Off |                    0 |
| N/A   40C    P0              27W /  72W |      0MiB / 23034MiB |      4%      Default |
|                                         |                      |                  N/A |
| +-----------------------------------------+----------------------+----------------------+
 
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+
```

La columna de más a la izquierda en la tabla de GPUs muestra el índice de cada GPU (`0` para la NVIDIA L4 en el ejemplo anterior). Utiliza estos números de índice para apuntar a GPUs específicas con la opción `device`.

Para exponer una sola GPU por índice:

```console
$ docker run -it --rm --gpus device=0 ubuntu nvidia-smi
```

Para exponer una GPU por su UUID, primero enumera los UUIDs con `nvidia-smi -L`:

```console
$ nvidia-smi -L
GPU 0: NVIDIA L4 (UUID: GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a)
```

Luego pasa el UUID a `--gpus`:

```console
$ docker run -it --rm --gpus device=GPU-3a23c669-1f69-c64e-cf85-44e9b07e7a2a ubuntu nvidia-smi
```

En sistemas con múltiples GPUs, puedes exponer varias por índice. El valor de `device` debe estar entre comillas porque contiene una coma:

```console
$ docker run -it --rm --gpus '"device=0,2"' ubuntu nvidia-smi
```

Esto expone las GPUs en los índices `0` y `2` (la primera y la tercera GPU listadas en la salida de `nvidia-smi`).

> [!NOTE]
>
> Las GPUs de NVIDIA solo pueden ser accedidas por sistemas que ejecutan un único motor (engine).

### Configurar las capacidades de NVIDIA

Puedes configurar las capacidades manualmente. Por ejemplo, en Ubuntu puedes ejecutar lo siguiente:

```console
$ docker run --gpus 'all,capabilities=utility' --rm ubuntu nvidia-smi
```

Esto habilita la capacidad del controlador `utility`, la cual añade la herramienta `nvidia-smi` al contenedor.

Las capacidades y otras configuraciones se pueden establecer en las imágenes a través de variables de entorno. Para conocer las variables válidas, consulta la documentación de [nvidia-container-toolkit](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/docker-specialized.html). Estas variables se pueden establecer en un Dockerfile.

También puedes usar imágenes de CUDA, que configuran estas variables automáticamente. Consulta la página oficial del catálogo NGC de [imágenes de CUDA](https://catalog.ngc.nvidia.com/orgs/nvidia/containers/cuda).

