Ejecuta una pequeña carga de trabajo por lotes con GPUs y VMs de inicio flexible

En esta guía, se muestra cómo optimizar el aprovisionamiento de GPU para cargas de trabajo de entrenamiento de mediana y pequeña escala mediante el uso de VMs de inicio flexible. Las VMs de inicio flexible se crean con la opción de consumo de inicio flexible. En esta guía, usarás VMs de inicio flexible para implementar una carga de trabajo que consta de dos trabajos de Kubernetes. Cada trabajo requiere una GPU. GKE aprovisiona automáticamente un solo nodo con dos GPU A100 para ejecutar ambos trabajos.

Si tu carga de trabajo requiere procesamiento distribuido de varios nodos, considera usar el inicio flexible con aprovisionamiento en cola. Para obtener más información, consulta Ejecuta una carga de trabajo a gran escala con inicio flexible con aprovisionamiento en cola.

Esta guía está dirigida a ingenieros de aprendizaje automático (AA), administradores y operadores de plataformas, y especialistas en datos y AA que estén interesados en usar las capacidades de organización de contenedores de Kubernetes para ejecutar cargas de trabajo por lotes. Para obtener más información sobre los roles y las tareas de ejemplo comunes a los que hacemos referencia en Google Cloud el contenido, consulta Roles y tareas comunes del usuario de GKE.

Precios de inicio flexible

Se recomienda el inicio flexible si tu carga de trabajo requiere recursos aprovisionados de forma dinámica según sea necesario, durante un máximo de siete días con reservas a corto plazo, sin administración compleja de cuotas y acceso rentable. El inicio flexible cuenta con la tecnología del Programador dinámico de cargas de trabajo y se factura con los precios del Programador dinámico de cargas de trabajo:

  • Descuento (hasta un 53%) para CPU virtuales, GPU y TPU
  • Pago por uso

Antes de comenzar

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

  • Habilita la API de Google Kubernetes Engine.
  • Habilitar la API de Google Kubernetes Engine
  • Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta el comando gcloud components update para obtener la versión más reciente. Es posible que las versiones anteriores de gcloud CLI no admitan la ejecución de los comandos de este documento.
  • Verifica que tengas un clúster de Autopilot o un clúster estándar que ejecute la versión 1.33.0-gke.1712000 o posterior.
  • Verifica que estés familiarizado con las limitaciones del inicio flexible.
  • Cuando uses un clúster estándar, verifica que mantengas al menos un grupo de nodos sin el inicio flexible habilitado para que el clúster funcione correctamente.
  • Verifica que tengas cuota para las GPU interrumpibles en las ubicaciones de tus nodos.

Si no tienes un clúster o este no cumple con los requisitos, puedes crear un clúster regional estándar con gcloud CLI. Agrega las siguientes marcas para obtener información sobre el inicio flexible:

--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8

Cuando crees un grupo de nodos de inicio flexible, usa las marcas mencionadas anteriormente y --accelerator type=nvidia-l4,count=1.

Si tienes un clúster estándar que cumple con los requisitos, las siguientes secciones te guiarán para seleccionar un tipo de acelerador de GPU y un tipo de máquina para tu clúster.

Elige un tipo de acelerador de GPU

Si usas un clúster en modo Autopilot, omite esta sección y ve a la sección Ejecuta una carga de trabajo por lotes.

La disponibilidad de GPU es específica para cada zona. Debes encontrar un tipo de acelerador de GPU que esté disponible en una zona en la que se encuentre el clúster estándar. Si tienes un clúster estándar regional, la zona en la que está disponible el tipo de acelerador de GPU debe estar en la región en la que se encuentra el clúster. Cuando creas el grupo de nodos, especificas el tipo de acelerador y las zonas para los nodos. Si especificas un tipo de acelerador que no está disponible en la ubicación del clúster, falla la creación del grupo de nodos.

Ejecuta los siguientes comandos para obtener la ubicación de tu clúster y un tipo de acelerador de GPU compatible.

  1. Obtén la ubicación en la que se encuentra el clúster:

    gcloud container clusters list
    

    El resultado es similar a este:

    NAME                LOCATION  MASTER_VERSION      MASTER_IP     MACHINE_TYPE  NODE_VERSION        NUM_NODES  STATUS   STACK_TYPE
    example-cluster-1   us-west2  1.33.2-gke.1111000  34.102.3.122  e2-medium     1.33.2-gke.1111000  9          RUNNING  IPV4
    
  2. Enumera los tipos de aceleradores de GPU disponibles, excluidas las estaciones de trabajo virtuales en la ubicación:

    gcloud compute accelerator-types list | grep CONTROL_PLANE_LOCATION | grep -v "Workstation"
    

    Reemplaza CONTROL_PLANE_LOCATION por la ubicación del clúster.

    Por ejemplo, para obtener una lista de los tipos de aceleradores de GPU en la región us-west2, ejecuta el siguiente comando:

    gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
    

    El resultado es similar a este:

    nvidia-b200            us-west2-c                 NVIDIA B200 180GB
    nvidia-tesla-p4        us-west2-c                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-c                 NVIDIA T4
    nvidia-tesla-p4        us-west2-b                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-b                 NVIDIA T4
    

Elige un tipo de máquina compatible

Si usas un clúster en modo Autopilot, omite esta sección y ve a la sección Ejecuta una carga de trabajo por lotes.

Después de saber qué GPU están disponibles en la ubicación del clúster, puedes determinar los tipos de máquinas compatibles. Google Cloud restringe las GPU a series de máquinas específicas. Sigue estos pasos para encontrar un tipo de máquina:

  1. Consulta la tabla de modelos de GPU disponibles.
  2. Ubica la fila del tipo de acelerador de GPU que elegiste.
  3. Consulta la columna "Serie de máquinas" de esa fila. Esta columna te indica qué serie de máquinas debes usar.
  4. Para ver los nombres de tipo de máquina que puedes especificar, haz clic en el vínculo de la serie de máquinas.

La única excepción es la serie de máquinas N1, que proporciona orientación adicional sobre qué tipos de máquinas N1 puedes usar con el tipo de acelerador elegido.

Antes de usar una máquina optimizada para aceleradores, asegúrate de que sea compatible con el modo de aprovisionamiento de inicio flexible, como se muestra en Disponibilidad de la opción de consumo por tipo de máquina.

Determina el recuento de aceleradores

Si usas un clúster en modo Autopilot, omite esta sección y ve a la sección Ejecuta una carga de trabajo por lotes.

Para crear un grupo de nodos, debes determinar la cantidad de aceleradores que se conectarán a cada nodo del grupo de nodos. Los valores válidos dependen del tipo de acelerador y del tipo de máquina. Cada tipo de máquina tiene un límite en la cantidad de GPU que puede admitir. Para determinar qué valor usar (además del valor predeterminado de 1), haz lo siguiente:

  1. Consulta Tipos de máquinas de GPU.
  2. En la tabla, busca el tipo de acelerador para el tipo de serie de máquinas.
  3. Usa el valor de la columna "Recuento de GPU".

Crea un grupo de nodos con inicio flexible

Si usas un clúster en modo Autopilot, omite esta sección y ve a la sección Ejecuta una carga de trabajo por lotes.

Para crear un grupo de nodos con el inicio flexible habilitado en un clúster estándar existente, puedes usar gcloud CLI o Terraform.

gcloud

  1. Crea un grupo de nodos con inicio flexible:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --project PROJECT_ID \
        --accelerator type=ACCELERATOR_TYPE,count=COUNT \
        --machine-type MACHINE_TYPE \
        --max-run-duration MAX_RUN_DURATION \
        --flex-start \
        --node-locations NODE_ZONES \
        --num-nodes 0 \
        --enable-autoscaling \
        --total-min-nodes 0 \
        --total-max-nodes 5 \
        --location-policy ANY \
        --reservation-affinity none \
        --no-enable-autorepair \
        --consolidation-delay=CONSOLIDATION_DELAY
    

    Reemplaza lo siguiente:

    • NODE_POOL_NAME: es el nombre que eliges para el grupo de nodos.
    • CLUSTER_NAME: es el nombre del clúster estándar que deseas modificar.
    • CONTROL_PLANE_LOCATION: es la región de Compute para el plano de control del clúster.
    • PROJECT_ID: ID del proyecto
    • ACCELERATOR_TYPE: es el tipo específico de acelerador (por ejemplo, nvidia-tesla-t4 para NVIDIA T4) que se conectará a las instancias.
    • COUNT: es la cantidad de aceleradores que se conectarán a las instancias. El valor predeterminado es 1.
    • MACHINE_TYPE: es el tipo de máquina que se usará para los nodos.
    • MAX_RUN_DURATION: es opcional. Es el tiempo de ejecución máximo de un nodo en segundos, hasta el valor predeterminado de siete días. El número que ingreses debe terminar en s. Por ejemplo, para especificar un día, ingresa 86400s.
    • CONSOLIDATION_DELAY: es opcional. Es la duración que espera el escalador automático del clúster antes de reducir la escala verticalmente de los nodos subutilizados. Usa esta configuración para retrasar la reducción de escala y conservar el grupo de nodos para que otros Pods lo vuelvan a usar más adelante. El número que ingreses debe terminar en s. Por ejemplo, para especificar una hora, ingresa 3600s. Disponible en la versión 1.34.1-gke.2364000 de GKE y versiones posteriores.
    • NODE_ZONES: es la lista separada por comas de una o más zonas en las que GKE crea el grupo de nodos.

    En este comando, la marca --flex-start le indica a gcloud que cree un grupo de nodos con VMs de inicio flexible.

    GKE crea un grupo de nodos con nodos que contienen dos instancias del tipo de acelerador especificado. En un principio, el grupo de nodos no tiene nodos y el ajuste de escala automático está habilitado.

Terraform

Puedes usar el inicio flexible con GPU mediante un módulo de Terraform.

  1. Agrega el siguiente bloque a la configuración de Terraform:
resource "google_container_node_pool" " "gpu_dws_pool" {
name = "gpu-dws-pool"

queued_provisioning {
    enabled = false
}

}
node_config {
    machine_type = "MACHINE_TYPE"
    accelerator_type = "ACCELERATOR_TYPE"
    accelerator_count = COUNT
    node_locations = ["NODE_ZONES"]
    flex_start = true
}

Reemplaza lo siguiente:

  • MACHINE_TYPE: es el tipo de máquina que se usará para nodos.
  • ACCELERATOR_TYPE: es el tipo específico de acelerador (por ejemplo, nvidia-tesla-t4 para NVIDIA T4) que se conectará a las instancias.
  • COUNT: es la cantidad de aceleradores que se conectarán a las instancias. El valor predeterminado es 1.
  • NODE_ZONES: es la lista separada por comas de una o más zonas en las que GKE crea el grupo de nodos.

Terraform llama a las Google Cloud APIs para crear un clúster con un grupo de nodos que usa VMs de inicio flexible con GPU. En un principio, el grupo de nodos no tiene nodos y el ajuste de escala automático está habilitado. Para obtener más información sobre Terraform, consulta las especificaciones del recurso google_container_node_pool en terraform.io.

Verifica el estado del inicio flexible en el grupo de nodos

Ejecuta el siguiente comando:

gcloud container node-pools describe NODE_POOL_NAME \
    --cluster CLUSTER_NAME \
    --location CONTROL_PLANE_LOCATION \
    --format="get(config.flexStart)"

Si el inicio flexible está habilitado en el grupo de nodos, el campo flexStart se establece en True.

Ejecuta una carga de trabajo por lotes

En esta sección, crearás dos trabajos de Kubernetes que requieren una GPU cada uno. Un controlador de trabajo en Kubernetes crea uno o más Pods y ayuda a garantizar que ejecuten correctamente una tarea específica.

  1. En la Google Cloud consola, haz clic en Ícono de activación de Cloud Shell Activar Cloud Shell para iniciar una sesión de Cloud Shell. Se abrirá una sesión en el panel inferior de la Google Cloud consola.

  2. Crea un archivo llamado dws-flex-start.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: container-1
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
              requests:
                  nvidia.com/gpu: 1
              limits:
                  nvidia.com/gpu: 1
          restartPolicy: OnFailure
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-2
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: container-2
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
              requests:
                  nvidia.com/gpu: 1
              limits:
                  nvidia.com/gpu: 1
          restartPolicy: OnFailure
    
  3. Aplica el manifiesto dws-flex-start.yaml:

    kubectl apply -f dws-flex-start.yaml
    
  4. Verifica que los trabajos se ejecuten en el mismo nodo:

    kubectl get pods -l "job-name in (job-1,job-2)" -o wide
    

    El resultado es similar a este:

    NAME    READY   STATUS      RESTARTS   AGE   IP       NODE               NOMINATED NODE   READINESS GATES
    job-1   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    job-2   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    

Limpia

Para evitar que se apliquen cargos a tu Google Cloud cuenta por los recursos que usaste en esta página, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

Borra el proyecto

  1. En la Google Cloud consola, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que tú quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Borra el recurso individual

  1. Borra los trabajos:

    kubectl delete job -l "job-name in (job-1,job-2)"
    
  2. Borra el grupo de nodos:

    gcloud container node-pools delete NODE_POOL_NAME \
          --location CONTROL_PLANE_LOCATION
    
  3. Borra el clúster:

    gcloud container clusters delete CLUSTER_NAME
    

¿Qué sigue?