Administra dispositivos de GPU con asignación dinámica de recursos

La asignación dinámica de recursos es una API de Kubernetes que te permite solicitar y compartir recursos, como GPU, entre Pods y contenedores en tus clústeres de Google Distributed Cloud en equipos físicos. Los controladores de terceros administran estos dispositivos, y Kubernetes los asigna de forma dinámica, de manera similar a los volúmenes de almacenamiento. Tus cargas de trabajo de IA no necesitan orientarse a nodos específicos ni solicitar la cantidad exacta de dispositivos conectados. En este documento, se muestra cómo configurar tus cargas de trabajo de GPU para usar la asignación dinámica de recursos.

Antes de comenzar

Antes de configurar tus cargas de trabajo de GPU para usar la asignación dinámica de recursos, verifica que se cumplan los siguientes requisitos previos:

  • Tu clúster de Bare Metal debe tener la versión 1.33.0 o una posterior.
  • Tu sistema operativo es Ubuntu 22.04 o Red Hat Enterprise Linux (RHEL) 9.4.
  • Actualizaste el clúster para habilitar la asignación dinámica de recursos, como se describe en Habilita la asignación dinámica de recursos.
  • Tienes al menos una máquina de nodo con una GPU conectada y el controlador de GPU de NVIDIA instalado. Para obtener más información, consulta Instala o desinstala el operador de GPU de NVIDIA incluido.
  • Si usas el operador de GPU de NVIDIA incluido, la versión 1.33.0 o posterior habilita la interfaz de dispositivo de contenedor (CDI) de forma predeterminada. Si usas un operador de GPU instalado de forma manual, asegúrate de que la CDI esté habilitada en el ClusterPolicy.
  • Seguiste las instrucciones de Controlador de DRA de NVIDIA para GPUs para instalar el controlador de DRA de NVIDIA en todos los nodos conectados a la GPU.

Crea cargas de trabajo de GPU que usen la asignación dinámica de recursos

Para que tus cargas de trabajo de GPU aprovechen la asignación dinámica de recursos para solicitar GPUs, deben estar en un espacio de nombres compartido con un ResourceClaim que describa la solicitud de asignación de dispositivos de GPU. Tus cargas de trabajo deben hacer referencia a la ResourceClaim para que Kubernetes asigne recursos de GPU.

En los siguientes pasos, se configura un entorno en el que tus cargas de trabajo usan la asignación dinámica de recursos para solicitar recursos de GPU:

  1. Para crear recursos relacionados con la asignación dinámica de recursos, crea un nuevo Namespace en tu clúster:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE_NAME
    EOF
    

    Reemplaza lo siguiente:

    • CLUSTER_KUBECONFIG: Es la ruta de acceso al archivo kubeconfig del clúster de usuario.

    • NAMESPACE_NAME por el nombre del espacio de nombres de asignación dinámica de recursos.

  2. Crea un ResourceClaim para describir la solicitud de acceso a la GPU:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      namespace: NAMESPACE_NAME
      name: RESOURCE_CLAIM_NAME
    spec:
        devices:
          requests:
          - name: gpu
            deviceClassName: gpu.nvidia.com
    EOF
    

    Reemplaza RESOURCE_CLAIM_NAME por el nombre de tu reclamación de recursos para las solicitudes de GPU.

  3. Crea cargas de trabajo que hagan referencia al ResourceClaim creado en el paso anterior.

    En los siguientes ejemplos de cargas de trabajo, se muestra cómo hacer referencia a un ResourceClaim llamado gpu-claim en el espacio de nombres dra-test. Los contenedores del Pod pod1 son muestras de la arquitectura unificada de dispositivos de procesamiento (CUDA) de NVIDIA diseñadas para ejecutar cargas de trabajo de CUDA en las GPU. Cuando el Pod pod1 se completa correctamente, indica que la capacidad de asignación dinámica de recursos funciona de forma correcta y que la asignación dinámica de recursos está lista para administrar los recursos de GPU en tu clúster.

    Ubuntu

    1. Usa el siguiente comando para aplicar el manifiesto a tu clúster:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

    RHEL

    1. Usa el siguiente comando para aplicar el manifiesto a tu clúster:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
      
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

Limitaciones

Ten en cuenta las siguientes limitaciones cuando uses la asignación dinámica de recursos:

  • Cuando usas el SO RHEL con una versión compatible del operador de GPU de NVIDIA, la interfaz de dispositivo de contenedor (CDI) controla la inserción de dispositivos y el etiquetado de SELinux automáticamente. No es necesario que uses la configuración manual de la política de SELinux ni que establezcas el securityContext del Pod.

  • Esta función usa el grupo de APIs resource.k8s.io/v1beta1, que difiere del grupo de APIs de Kubernetes de código abierto para esta función, resource.k8s.io/v1. El grupo de APIs de código abierto v1 proporciona más funciones y una mejor estabilidad que el grupo de APIs v1beta1.

¿Qué sigue?