Administra 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 en equipos físicos. 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 conductores externos administran estos recursos.

Con la asignación dinámica de recursos, Kubernetes programa los Pods según la configuración del dispositivo al que se hace referencia. Los operadores de apps no necesitan seleccionar nodos específicos en sus cargas de trabajo ni garantizar que cada Pod solicite exactamente la cantidad de dispositivos conectados a esos nodos. Este proceso es similar a la asignación de volúmenes para el almacenamiento.

Esta capacidad te ayuda a ejecutar cargas de trabajo de IA asignando de forma dinámica y precisa los recursos de GPU dentro de tus clústeres de equipos físicos, lo que mejora la utilización de recursos y el rendimiento para las cargas de trabajo exigentes.

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

Antes de comenzar

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

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 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 del archivo kubeconfig del clúster de usuario.

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

  2. Crea un objeto 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 reclamo 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 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 GPUs. Cuando el Pod pod1 se completa correctamente, indica que la capacidad de asignación dinámica de recursos funciona correctamente 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. 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 de RHEL, la política de SELinux puede interferir con los contenedores que intentan acceder a las GPU. Para obtener más información, consulta Cómo usar GPUs en contenedores en RHEL 8 de metal desnudo.

  • 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 mejor estabilidad que el grupo de APIs de v1beta1.

¿Qué sigue?