Gestionar cargas de trabajo de contenedores de GPU

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:

  1. 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
    
  2. 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, como REGISTRY_PATH/hello-app:1.0.
  3. 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
    ...
    
  4. 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.
  5. 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