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

En esta página se describe cómo configurar tus cargas de trabajo de GPU para que usen la asignación dinámica de recursos en tus clústeres de Google Distributed Cloud bare metal. La asignación dinámica de recursos es una API de Kubernetes que te permite solicitar y compartir recursos genéricos, como GPUs, entre pods y contenedores. Los controladores de terceros gestionan estos recursos.

Con la asignación dinámica de recursos, Kubernetes programa los pods en función de la configuración del dispositivo al que se hace referencia. Los operadores de aplicaciones no tienen que seleccionar nodos específicos en sus cargas de trabajo ni asegurarse de que cada pod solicite exactamente el número de dispositivos conectados a esos nodos. Este proceso es similar a la asignación de volúmenes para el almacenamiento.

Esta función te ayuda a ejecutar cargas de trabajo de IA asignando de forma dinámica y precisa los recursos de GPU de tus clústeres de hardware desnudo, lo que mejora el uso de los recursos y el rendimiento de las cargas de trabajo exigentes.

Esta página está dirigida a administradores, arquitectos y operadores que gestionan el ciclo de vida de la infraestructura tecnológica subyacente. Para obtener más información sobre los roles habituales y las tareas de ejemplo a las que hacemos referencia en el contenido, consulta Roles y tareas habituales de los usuarios de GKE Enterprise. Google Cloud

Antes de empezar

Antes de configurar tus cargas de trabajo de GPU para que usen la asignación dinámica de recursos, comprueba que se cumplen los siguientes requisitos:

Crear 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 al ResourceClaim para que Kubernetes asigne recursos de GPU.

En los pasos siguientes se configura un entorno en el que las 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
    

    Haz los cambios siguientes:

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

    • NAMESPACE_NAME con 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
    

    Sustituye 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 objeto ResourceClaim llamado gpu-claim en el espacio de nombres dra-test. Los contenedores del pod1 pod son muestras de la arquitectura unificada de dispositivos informáticos (CUDA) de NVIDIA diseñadas para ejecutar cargas de trabajo de CUDA en las GPUs. Cuando el pod pod1 se complete correctamente, significa que la función de asignación dinámica de recursos funciona correctamente y que está lista para gestionar los recursos de GPU de 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 - 6, 7

    1. Descarga e instala el módulo de política de SELinux nvidia_container_t, que es necesario para acceder a las GPUs.

      Para obtener más información, consulta el repositorio dgx-selinux de NVIDIA.

    2. 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
        securityContext:
          seLinuxOptions:
            type: nvidia_container_t
        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, la política de SELinux puede interferir con los contenedores que intentan acceder a las GPUs. Para obtener más información, consulta Cómo usar GPUs en contenedores en RHEL 8 sin sistema operativo.

  • Esta función usa el grupo de APIs resource.k8s.io/v1beta1, que es diferente 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 ofrece más funciones y una mayor estabilidad que el grupo de APIs v1beta1.

Siguientes pasos