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 valorall, representa la cantidad de dispositivos GPU que se deben reservar (siempre que el host disponga de esa cantidad de GPUs). Sicountse establece enallo 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 denvidia-smien el host. Si no se configurandevice_ids, por defecto se utilizan todas las GPUs disponibles en el host.driver: Especificado como una cadena, por ejemplodriver: 'nvidia'options: Pares clave-valor que representan opciones específicas del controlador.
ImportantDebes configurar el campo
capabilities. De lo contrario, se devuelve un error en el despliegue del servicio.
Note
countydevice_idsson 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]