Compartir comentarios
Las respuestas se generan en base a la documentación.

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 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 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).

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

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:

$ 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.

$ 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:

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]