Ejecutar GPUs con varias instancias


En esta página se explica cómo aumentar la utilización y reducir los costes ejecutando GPUs con varias instancias. Con esta configuración, puedes particionar una unidad de procesamiento gráfico (GPU) NVIDIA A100, H100, H200, B200 o GB200 para compartir una sola GPU entre varios contenedores en Google Kubernetes Engine (GKE).

Antes de leer esta página, asegúrate de que conoces los conceptos de Kubernetes, como pods, nodos, despliegues y espacios de nombres, así como los conceptos de GKE, como grupos de nodos, escalado automático y aprovisionamiento automático.

Introducción

Kubernetes asigna una GPU completa por contenedor, aunque el contenedor solo necesite una fracción de la GPU para su carga de trabajo, lo que puede provocar que se desperdicien recursos y que se superen los costes, sobre todo si utilizas la última generación de GPUs potentes. Para mejorar el uso de la GPU, las GPUs con varias instancias te permiten particionar una sola GPU compatible en hasta siete porciones. Cada segmento se puede asignar a un contenedor del nodo de forma independiente, con un máximo de siete contenedores por GPU. Las GPUs con varias instancias proporcionan aislamiento de hardware entre las cargas de trabajo y una calidad del servicio coherente y predecible para todos los contenedores que se ejecutan en la GPU.

En el caso de las aplicaciones CUDA®, las GPUs con varias instancias son prácticamente transparentes. Cada partición de GPU se muestra como un recurso de GPU normal y el modelo de programación no cambia.

Para obtener más información sobre las GPUs con varias instancias, consulta la guía de usuario de GPUs con varias instancias de NVIDIA.

GPUs compatibles

Los siguientes tipos de GPU admiten GPUs con varias instancias:

  • NVIDIA A100 (40 GB)
  • NVIDIA A100 (80 GB)
  • NVIDIA H100 (80 GB)
  • NVIDIA H200 (141 GB)
  • NVIDIA B200 (180 GB) (1.32.2-gke.1586000 y versiones posteriores)
  • NVIDIA GB200 (1.33.0-gke.1636000 y versiones posteriores)

Particiones de GPU con varias instancias

Cada GPU A100, H100, H200, B200 y GB200 consta de siete unidades de computación y ocho unidades de memoria, que puedes particionar en instancias de GPU de distintos tamaños. Para configurar los tamaños de las particiones de GPU, usa la siguiente sintaxis: [compute]g.[memory]gb. Por ejemplo, un tamaño de partición de GPU de 1g.5gb hace referencia a una instancia de GPU con una unidad de computación (1/7 de los multiprocesadores de streaming de la GPU) y una unidad de memoria (5 GB). El tamaño de la partición de las GPUs se puede especificar al desplegar una carga de trabajo de Autopilot o al crear un clúster estándar.

La tabla de particiones de la guía del usuario de la GPU multiinstancia de NVIDIA muestra todos los tamaños de partición de GPU, así como la cantidad de recursos de computación y memoria disponibles en cada partición de GPU. La tabla también muestra el número de instancias de GPU de cada tamaño de partición que se pueden crear en la GPU.

En la siguiente tabla se indican los tamaños de partición que admite GKE:

Tamaño de la partición Instancias de GPU
GPU: NVIDIA A100 (40 GB) (nvidia-tesla-a100)
1g.5gb 7
2g.10gb 3
3g.20gb 2
7g.40gb 1
GPU: NVIDIA A100 (80 GB) (nvidia-a100-80gb)
1g.10gb 7
2g.20gb 3
3g.40gb 2
7g.80gb 1
GPU: NVIDIA H100 (80 GB) (nvidia-h100-80gb y nvidia-h100-mega-80gb)
1g.10gb 7
1g.20gb 4
2g.20gb 3
3g.40gb 2
7g.80gb 1
GPU: NVIDIA H200 (141 GB) (nvidia-h200-141gb)
1g.18gb 7
1g.35gb 4
2g.35gb 3
3g.71gb 2
4g.71gb 1
7g.141gb 1
GPU: NVIDIA B200 (nvidia-b200)
1g.23gb 7
1g.45gb 4
2g.45gb 3
3g.90gb 2
4g.90gb 1
7g.180gb 1
GPU: NVIDIA GB200 (nvidia-gb200)
1g.23gb 7
1g.47gb 4
2g.47gb 3
3g.93gb 2
4g.93gb 1
7g.186gb 1

Cada GPU de cada nodo de un grupo de nodos se particiona de la misma forma. Por ejemplo, supongamos que tienes un grupo de nodos con dos nodos, cuatro GPUs en cada nodo y un tamaño de partición de 1g.5gb. GKE crea siete particiones de tamaño 1g.5gb en cada GPU. Como hay cuatro GPUs en cada nodo, hay 28 1g.5gb particiones de GPU disponibles en cada nodo. Como hay dos nodos en el grupo de nodos, hay un total de 56 particiones de GPU 1g.5gb disponibles en todo el grupo de nodos.

Para crear un clúster estándar de GKE con más de un tipo de partición de GPU, debes crear varios grupos de nodos. Por ejemplo, si quieres nodos con particiones de GPU 1g.5gb y 3g.20gb en un clúster, debes crear dos grupos de nodos: uno con el tamaño de partición de GPU definido en 1g.5gb y otro con 3g.20gb.

Un clúster de GKE Autopilot crea automáticamente nodos con la configuración de partición correcta cuando creas cargas de trabajo que requieren diferentes tamaños de partición.

Cada nodo se etiqueta con el tamaño de las particiones de GPU que están disponibles en el nodo. Este etiquetado permite que las cargas de trabajo se dirijan a los nodos con el tamaño de partición de GPU necesario. Por ejemplo, en un nodo con instancias de GPU 1g.5gb, el nodo se etiqueta de la siguiente manera:

cloud.google.com/gke-gpu-partition-size=1g.5gb

Cómo funciona

Para usar GPUs con varias instancias, debes realizar las siguientes tareas:

  1. Crea un clúster con las GPUs de varias instancias habilitadas.
  2. Instala los controladores manualmente.
  3. Verifica cuántos recursos de GPU hay en el nodo.
  4. Desplegar contenedores con GPUs de varias instancias

Precios

Las GPUs multiinstancia son exclusivas de las GPUs A100, H100, H200, B200 y GB200, y están sujetas a los precios de las GPUs correspondientes, además de a los de cualquier otro producto que se utilice para ejecutar tus cargas de trabajo. Solo puedes adjuntar GPUs completas a los nodos de tu clúster para particionarlos. Para obtener información sobre los precios de las GPUs, consulta la página Precios de las GPUs.

Limitaciones

  • No se recomienda usar particiones de GPU con varias instancias en GKE para cargas de trabajo que no son de confianza.
  • El escalado automático y el aprovisionamiento automático de particiones de GPU son totalmente compatibles con la versión 1.20.7-gke.400 de GKE o una posterior. En versiones anteriores, solo se podían autoescalar los grupos de nodos con al menos un nodo en función de la demanda de tamaños de partición de GPU específicos de las cargas de trabajo.
  • Las métricas de uso de la GPU (por ejemplo, duty_cycle) no están disponibles para las GPUs con varias instancias.
  • La función de varias instancias divide una GPU física en instancias independientes, cada una de las cuales está aislada de las demás a nivel de hardware. Un contenedor que usa una instancia de GPU de varias instancias solo puede acceder a los recursos de CPU y memoria disponibles para esa instancia.
  • Un pod solo puede consumir una instancia de GPU con varias instancias.

Antes de empezar

Antes de empezar, asegúrate de haber realizado las siguientes tareas:

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si quieres usar Google Cloud CLI para esta tarea, instálala y, a continuación, inicialízala. Si ya has instalado la gcloud CLI, obtén la versión más reciente ejecutando gcloud components update.
  • En Autopilot, las GPUs con varias instancias se admiten en GKE 1.29.3-gke.1093000 y versiones posteriores.
  • Debes tener suficiente cuota de GPU NVIDIA A100. Consulta Solicitar el aumento de una cuota.
  • Si quieres usar GPUs con varias instancias en Autopilot, puedes consultar más información sobre cómo usar GPUs con Autopilot en el artículo Desplegar cargas de trabajo de GPUs en Autopilot.
  • GKE asigna la clase de computación Accelerator a todas las cargas de trabajo de GPU de varias instancias en clústeres de Autopilot.

Crear un clúster con GPUs de varias instancias habilitadas

Si usas GKE Standard, debes habilitar las GPUs de varias instancias en el clúster. Los clústeres de Autopilot que ejecutan la versión 1.29.3-gke.1093000 y posteriores habilitan las GPUs con varias instancias de forma predeterminada. Para usar GPUs con varias instancias en Autopilot, consulta la sección Desplegar contenedores con GPUs con varias instancias de esta página.

Cuando creas un clúster estándar con GPUs de varias instancias, debes especificar gpuPartitionSize junto con acceleratorType y acceleratorCount. El valor de acceleratorType debe ser nvidia-tesla-a100, nvidia-a100-80gb, nvidia-h100-80gb, nvidia-h200-141gb, nvidia-b200 o nvidia-gb200.

En el siguiente ejemplo se muestra cómo crear un clúster de GKE con un nodo y siete particiones de GPU de tamaño 1g.5gb en el nodo. En los demás pasos de esta página se usa un tamaño de partición de GPU de 1g.5gb, lo que crea siete particiones en cada GPU. También puedes usar cualquiera de los tamaños de partición de GPU admitidos que se han mencionado anteriormente.

Puedes usar Google Cloud CLI o Terraform.

gcloud

Crea un clúster con GPUs de varias instancias habilitadas:

gcloud container clusters create CLUSTER_NAME  \
    --project=PROJECT_ID  \
    --location CONTROL_PLANE_LOCATION  \
    --cluster-version=CLUSTER_VERSION  \
    --accelerator type=nvidia-tesla-a100,count=1,gpu-partition-size=1g.5gb,gpu-driver-version=DRIVER_VERSION  \
    --machine-type=a2-highgpu-1g  \
    --num-nodes=1

Haz los cambios siguientes:

  • CLUSTER_NAME: el nombre del nuevo clúster.
  • PROJECT_ID: el ID de tu proyecto de Google Cloud .
  • CONTROL_PLANE_LOCATION: la ubicación de Compute Engine del plano de control de tu clúster. Proporciona una región para los clústeres regionales o una zona para los clústeres zonales.
  • CLUSTER_VERSION: la versión debe ser 1.19.7-gke.2503 o una posterior.
  • DRIVER_VERSION: la versión del controlador de NVIDIA que se va a instalar. Puede ser uno de los siguientes:
    • default: instala la versión predeterminada del controlador para tu versión de GKE.
    • latest: Instala la versión más reciente del controlador disponible para tu versión de GKE. Solo está disponible para los nodos que usan Container-Optimized OS.
    • disabled: omite la instalación automática de controladores. Debes instalar manualmente un controlador después de crear el clúster. Si omites gpu-driver-version, esta es la opción predeterminada.

Terraform

Para crear un clúster con GPUs de varias instancias habilitadas mediante Terraform, consulta el siguiente ejemplo:

resource "google_container_cluster" "default" {
  name               = "gke-standard-zonal-gpu"
  location           = "us-central1-a"
  initial_node_count = 1

  node_config {
    guest_accelerator {
      type  = "nvidia-tesla-t4"
      count = 1
      gpu_driver_installation_config {
        gpu_driver_version = "LATEST"
      }
    }
    machine_type = "n1-standard-2"
  }
}

Para obtener más información sobre el uso de Terraform, consulta Compatibilidad de Terraform con GKE.

Conéctate al clúster

Configura kubectl para que se conecte al clúster recién creado:

gcloud container clusters get-credentials CLUSTER_NAME

Instalar controladores

Si has inhabilitado la instalación automática de controladores al crear el clúster o si utilizas una versión de GKE anterior a la 1.27.2-gke.1200, debes instalar manualmente un controlador de NVIDIA compatible después de que se complete la creación. Las GPU multiinstancia requieren la versión 450.80.02 o una posterior del controlador de NVIDIA.

Una vez instalado el controlador, se habilita el modo de GPU con varias instancias. Si has instalado los controladores automáticamente, los nodos se reiniciarán cuando el complemento del dispositivo de GPU empiece a crear particiones de GPU. Si has instalado los controladores manualmente, tus nodos se reiniciarán cuando se complete la instalación. El reinicio puede tardar unos minutos en completarse.

Verificar cuántos recursos de GPU hay en el nodo

Ejecuta el siguiente comando para verificar que la capacidad y el número asignable de recursos nvidia.com/gpu es 7:

kubectl describe nodes

Este es el resultado del comando:

...
Capacity:
  ...
  nvidia.com/gpu:             7
Allocatable:
  ...
  nvidia.com/gpu:             7

Desplegar contenedores con GPUs de varias instancias

Puedes implementar hasta un contenedor por dispositivo de GPU con varias instancias en el nodo. En este ejemplo, con un tamaño de partición de 1g.5gb, hay siete particiones de GPU de varias instancias disponibles en el nodo. Por lo tanto, puedes implementar hasta siete contenedores que soliciten GPUs en este nodo.

  1. Aquí tienes un ejemplo que inicia el contenedor cuda:11.0.3-base-ubi7 y ejecuta nvidia-smi para imprimir el UUID de la GPU en el contenedor. En este ejemplo, hay siete contenedores y cada uno de ellos recibe una partición de GPU. En este ejemplo también se define el selector de nodos cloud.google.com/gke-gpu-partition-size para orientar la publicidad a los nodos con 1g.5gb particiones de GPU.

    Autopilot

    kubectl apply -f -  <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cuda-simple
    spec:
      replicas: 7
      selector:
        matchLabels:
          app: cuda-simple
      template:
        metadata:
          labels:
            app: cuda-simple
        spec:
          nodeSelector:
            cloud.google.com/gke-gpu-partition-size: 1g.5gb
            cloud.google.com/gke-accelerator: nvidia-tesla-a100
            cloud.google.com/gke-accelerator-count: "1"
          containers:
          - name: cuda-simple
            image: nvidia/cuda:11.0.3-base-ubi7
            command:
            - bash
            - -c
            - |
              /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
            resources:
              limits:
                nvidia.com/gpu: 1
    EOF
          

    Este archivo de manifiesto hace lo siguiente:

    • Solicita el tipo de GPU nvidia-tesla-a100 configurando el selector de nodos cloud.google.com/gke-accelerator.
    • Divide la GPU en particiones de 1g.5gb.
    • Monta una sola GPU en el nodo configurando el selector de nodos cloud.google.com/gke-accelerator-count.

    Estándar

    kubectl apply -f -  <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cuda-simple
    spec:
      replicas: 7
      selector:
        matchLabels:
          app: cuda-simple
      template:
        metadata:
          labels:
            app: cuda-simple
        spec:
          nodeSelector:
            cloud.google.com/gke-gpu-partition-size: 1g.5gb
          containers:
          - name: cuda-simple
            image: nvidia/cuda:11.0.3-base-ubi7
            command:
            - bash
            - -c
            - |
              /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
            resources:
              limits:
                nvidia.com/gpu: 1
    EOF
          

    Este archivo de manifiesto hace lo siguiente:

    • Solicita una sola GPU con un tamaño de partición de 1g.5gb.
  2. Comprueba que los siete pods se están ejecutando:

    kubectl get pods
    

    Este es el resultado del comando:

    NAME                           READY   STATUS    RESTARTS   AGE
    cuda-simple-849c47f6f6-4twr2   1/1     Running   0          7s
    cuda-simple-849c47f6f6-8cjrb   1/1     Running   0          7s
    cuda-simple-849c47f6f6-cfp2s   1/1     Running   0          7s
    cuda-simple-849c47f6f6-dts6g   1/1     Running   0          7s
    cuda-simple-849c47f6f6-fk2bs   1/1     Running   0          7s
    cuda-simple-849c47f6f6-kcv52   1/1     Running   0          7s
    cuda-simple-849c47f6f6-pjljc   1/1     Running   0          7s
    
  3. Consulta los registros para ver el UUID de la GPU. Para ello, usa el nombre de cualquier pod del comando anterior:

    kubectl logs cuda-simple-849c47f6f6-4twr2
    

    Este es el resultado del comando:

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/11/0)
    

Siguientes pasos