# Ejecutar servicios de Docker Compose con acceso a GPU


Los servicios de Compose pueden definir reservas de dispositivos GPU si el host de Docker contiene dichos dispositivos y el demonio (daemon) de Docker está configurado en consecuencia. Para esto, asegúrate de instalar los [requisitos previos](/engine/containers/resource_constraints/#gpu) si aún no lo has hecho.

Los ejemplos de las siguientes secciones se centran específicamente en proporcionar a los contenedores de servicios acceso a dispositivos GPU con Docker Compose.

## Habilitar el acceso a GPU para los contenedores de servicios

Se hace referencia a las GPUs en un archivo `compose.yaml` utilizando el atributo [device](/reference/compose-file/deploy/#devices) de la especificación Compose Deploy, dentro de los servicios que las necesitan.

Esto proporciona un control más granular sobre una reserva de GPU, ya que se pueden establecer valores personalizados para las siguientes propiedades del dispositivo:

- `capabilities`: Este valor se especifica como una lista de cadenas. Por ejemplo, `capabilities: [gpu]`. Debes configurar este campo en el archivo de Compose; de lo contrario, se devuelve un error en el despliegue del servicio.
- `count`: Especificado como un entero o el valor `all`, representa la cantidad de dispositivos GPU que se deben reservar (siempre que el host disponga de esa cantidad de GPUs). Si `count` se establece en `all` o no se especifica, por defecto se utilizan todas las GPUs disponibles en el host.
- `device_ids`: Este valor, especificado como una lista de cadenas, representa los identificadores (IDs) de los dispositivos GPU del host. Puedes encontrar el ID del dispositivo en la salida de `nvidia-smi` en el host. Si no se configuran `device_ids`, por defecto se utilizan todas las GPUs disponibles en el host.
- `driver`: Especificado como una cadena, por ejemplo `driver: 'nvidia'`
- `options`: Pares clave-valor que representan opciones específicas del controlador.

> [!IMPORTANT]
>
> Debes configurar el campo `capabilities`. De lo contrario, se devuelve un error en el despliegue del servicio.

> [!NOTE]
>
> `count` y `device_ids` son mutuamente excluyentes. Solo debes definir un campo a la vez.

Para obtener más información sobre estas propiedades, consulta la [Especificación de despliegue de Compose (Compose Deploy Specification)](/reference/compose-file/deploy/#devices).

### Ejemplo de un archivo de Compose para ejecutar un servicio con acceso a 1 dispositivo GPU

```yaml
services:
  test:
    image: nvidia/cuda:12.9.0-base-ubuntu22.04
    command: nvidia-smi
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 1
              capabilities: [gpu]
```

Ejecutar con Docker Compose:

```console
$ docker compose up
Creating network "gpu_default" with the default driver
Creating gpu_test_1 ... done
Attaching to gpu_test_1
test_1  | +-----------------------------------------------------------------------------+
test_1  | | NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.1     |
test_1  | |-------------------------------+----------------------+----------------------+
test_1  | | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
test_1  | | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
test_1  | |                               |                      |               MIG M. |
test_1  | |===============================+======================+======================|
test_1  | |   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
test_1  | | N/A   23C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
test_1  | |                               |                      |                  N/A |
test_1  | +-------------------------------+----------------------+----------------------+
test_1  |
test_1  | +-----------------------------------------------------------------------------+
test_1  | | Processes:                                                                  |
 test_1  | |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
test_1  | |        ID   ID                                                   Usage      |
test_1  | |=============================================================================|
test_1  | |  No running processes found                                                 |
test_1  | +-----------------------------------------------------------------------------+
gpu_test_1 exited with code 0
```

En máquinas que alojan múltiples GPUs, el campo `device_ids` se puede configurar para apuntar a dispositivos GPU específicos, y `count` se puede usar para limitar la cantidad de dispositivos GPU asignados al contenedor de un servicio.

Puedes usar `count` o `device_ids` en cada una de tus definiciones de servicio. Se devuelve un error si intentas combinar ambos, si especificas un ID de dispositivo no válido o si utilizas un valor de `count` superior a la cantidad de GPUs en tu sistema.

```console
$ nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.80.02    Driver Version: 450.80.02    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| 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  Tesla T4            On   | 00000000:00:1B.0 Off |                    0 |
| N/A   72C    P8    12W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   1  Tesla T4            On   | 00000000:00:1C.0 Off |                    0 |
| N/A   67C    P8    11W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   2  Tesla T4            On   | 00000000:00:1D.0 Off |                    0 |
| N/A   74C    P8    12W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
|   3  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
| N/A   62C    P8    11W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+
```

## Acceder a dispositivos específicos

Para permitir el acceso únicamente a los dispositivos GPU-0 y GPU-3:

```yaml
services:
  test:
    image: tensorflow/tensorflow:latest-gpu
    command: python -c "import tensorflow as tf;tf.test.gpu_device_name()"
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              device_ids: ["0", "3"]
              capabilities: [gpu]
```

