Puedes habilitar y gestionar recursos de unidad de procesamiento gráfico (GPU) en tus contenedores. Por ejemplo, puede que prefieras ejecutar notebooks de inteligencia artificial (IA) y aprendizaje automático (ML) en un entorno de GPU. La compatibilidad con GPU está habilitada de forma predeterminada en el dispositivo air-gapped de Google Distributed Cloud (GDC).
Antes de empezar
Para desplegar GPUs en tus contenedores, debes tener lo siguiente:
El rol Administrador de espacio de nombres (
namespace-admin
) para implementar cargas de trabajo de GPU en el espacio de nombres de tu proyecto.Ruta de kubeconfig del clúster de Kubernetes de metal desnudo. Inicia sesión y genera el archivo kubeconfig si no tienes uno.
Configurar un contenedor para que use recursos de GPU
Para usar GPUs en un contenedor, sigue estos pasos:
Confirma que los nodos de tu clúster de Kubernetes admiten la asignación de recursos de GPU:
kubectl describe nodes NODE_NAME
Sustituye
NODE_NAME
por el nodo que gestiona las GPUs que quieras inspeccionar.La salida correspondiente es similar al siguiente fragmento:
Capacity: nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1 Allocatable: nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1
Añade los campos
.containers.resources.requests
y.containers.resources.limits
a la especificación de tu contenedor. Como tu clúster de Kubernetes está preconfigurado con máquinas con GPU, la configuración es la misma para todas las cargas de trabajo:... containers: - name: CONTAINER_NAME image: CONTAINER_IMAGE resources: requests: nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1 limits: nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1 ...
Haz los cambios siguientes:
CONTAINER_NAME
: el nombre del contenedor.CONTAINER_IMAGE
: la imagen del contenedor para acceder a las máquinas con GPU. Debes incluir la ruta del registro de contenedores y la versión de la imagen, comoREGISTRY_PATH/hello-app:1.0
.
Los contenedores también requieren permisos adicionales para acceder a las GPUs. Por cada contenedor que solicite GPUs, añade los siguientes permisos a la especificación del contenedor:
... securityContext: seLinuxOptions: type: unconfined_t ...
Aplica el archivo de manifiesto del contenedor:
kubectl apply -f CONTAINER_MANIFEST_FILE \ -n NAMESPACE \ --kubeconfig CLUSTER_KUBECONFIG
Haz los cambios siguientes:
CONTAINER_MANIFEST_FILE
: el archivo YAML de tu recurso personalizado de carga de trabajo de contenedor.NAMESPACE
: el espacio de nombres del proyecto en el que se van a desplegar las cargas de trabajo del contenedor.CLUSTER_KUBECONFIG
: el archivo kubeconfig del clúster de Kubernetes bare metal en el que vas a implementar cargas de trabajo de contenedores.
Verifica que tus pods se estén ejecutando y estén usando las GPUs:
kubectl get pods -A | grep CONTAINER_NAME \ -n NAMESPACE \ --kubeconfig CLUSTER_KUBECONFIG
La salida correspondiente es similar al siguiente fragmento:
Port: 80/TCP Host Port: 0/TCP State: Running Ready: True Restart Count: 0 Limits: nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1 Requests: nvidia.com/gpu-pod-NVIDIA_A100_80GB_PCIE: 1