Ejecuta una pequeña carga de trabajo por lotes con TPU y el modo de aprovisionamiento de inicio flexible


En esta guía, se muestra cómo optimizar el aprovisionamiento de TPU para cargas de trabajo de entrenamiento a mediana y pequeña escala con el modo de aprovisionamiento de inicio flexible. En esta guía, usarás el inicio flexible para implementar una carga de trabajo que consta de un grupo de nodos de porción de TPU.

Esta guía está dirigida a ingenieros de aprendizaje automático (AA), administradores y operadores de plataformas, y especialistas en datos y en IA 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 comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Tareas y roles comunes de los usuarios de GKE Enterprise.

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, por hasta siete días con reservas a corto plazo, sin administración compleja de cuotas y con acceso rentable. El inicio flexible cuenta con la tecnología del programador dinámico de cargas de trabajo y se factura según los precios del programador dinámico de cargas de trabajo:

  • Descuento (hasta un 53%) en CPU virtuales, GPU y TPU.
  • Pagas por lo que usas.

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 gcloud components update para obtener la versión más reciente.
  • 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 conozcas las limitaciones de flex-start.
  • 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 TPUs interrumpibles en las ubicaciones de tus nodos.

Crea un grupo de nodos con inicio flexible

Para crear un grupo de nodos con el inicio flexible habilitado en un clúster de Standard existente, usa gcloud CLI.

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.

Puedes crear un grupo de nodos de porción de TPU de host único o varios hosts con flex-start:

  1. Crea un grupo de nodos con flex-start:

    Host único

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION_NAME \
        --node-locations=NODE_ZONES \
        --machine-type=MACHINE_TYPE \
        --reservation-affinity=none \
        --enable-autoscaling \
        --flex-start \
        --num-nodes 0 \
        --min-nodes=0 \
        --max-nodes=1
    

    Reemplaza lo siguiente:

    • NODE_POOL_NAME: es el nombre que eliges para el grupo de nodos.
    • CLUSTER_NAME: el nombre del clúster
    • LOCATION_NAME: Es la región de procesamiento del plano de control del clúster.
    • NODE_ZONES: La lista separada por comas de una o más zonas en las que GKE crea el grupo de nodos.
    • MACHINE_TYPE: Es el tipo de máquina que se usará para los nodos. Para obtener más información sobre los tipos de máquinas compatibles con TPU, usa la tabla en Elige la versión de TPU.

    Varios hosts

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=LOCATION_NAME \
        --node-locations=NODE_ZONES \
        --machine-type=MACHINE_TYPE \
        --tpu-topology=TPU_TOPOLOGY \
        --flex-start \
        --enable-autoscaling \
        --num-nodes=0 \
        --max-nodes=2 \
        --reservation-affinity=none \
        --no-enable-autorepair
    

    Reemplaza lo siguiente:

    • NODE_POOL_NAME: es el nombre que eliges para el grupo de nodos.
    • CLUSTER_NAME: el nombre del clúster
    • LOCATION_NAME: Es la región de procesamiento del plano de control del clúster.
    • NODE_ZONES: La lista separada por comas de una o más zonas en las que GKE crea el grupo de nodos.
    • MACHINE_TYPE: Es el tipo de máquina que se usará para los nodos. Por ejemplo, puedes usar ct6e-standard-4t para la TPU Trillium. Para obtener más información sobre los tipos de máquinas disponibles, consulta Elige la versión de TPU.
    • TPU_TOPOLOGY: la topología física para la porción de TPU. El formato de la topología depende de la versión de la TPU. Para obtener más información sobre las topologías de TPU, usa la tabla de Elige una topología.

    El comando anterior usa las siguientes marcas obligatorias cuando creas un grupo de nodos con inicio flexible:

    • --enable-autoscaling: flex-start aprovisiona solo los recursos de procesamiento necesarios cuando se ejecuta tu carga de trabajo. Debes configurar los siguientes parámetros:

      • --num-nodes=0
      • --min-nodes=0
      • --max-nodes se establece en la cantidad de máquinas virtuales que requiere tu porción de TPU.

        Por ejemplo, el comando de creación del grupo de nodos puede incluir los siguientes parámetros:

        ...
        --machine-type=ct6e-standard-4t \
        --tpu-topology=4x4 \
        --enable-autoscaling \
        --num-nodes=0 \
        --max-nodes=4 \
        

        Este comando establece el campo --max-nodes en 4 porque una topología 4x4 consta de 16 chips y cada VM ct6e-standard-4t tiene 4 chips.

      El escalador automático del clúster se ajusta verticalmente a la cantidad de nodos que requiere tu carga de trabajo. Una vez que se completa tu carga de trabajo, el escalador automático de clústeres reduce la escala a cero nodos.

    • --reservation-affinity=none: flex-start no usa ni requiere reservas.

  2. Verifica el estado de flex-start en el grupo de nodos:

    gcloud container node-pools describe NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --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 un trabajo que programa un nodo TPU con inicio flexible. Un controlador de Job en Kubernetes crea uno o más Pods y garantiza 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 consola de Google Cloud .

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

    Host único

    Usa el siguiente manifiesto para el archivo 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-tpu-accelerator: ACCELERATOR_TYPE
            cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
          containers:
          - name: container-1
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["3600s"] # Sleep for 1 hour
            resources:
              requests:
                  google.com/tpu: NUM_CHIPS
              limits:
                  google.com/tpu: NUM_CHIPS
          restartPolicy: OnFailure
    

    Varios hosts

    Usa el siguiente manifiesto para el archivo dws-flex-start.yaml:

    apiVersion: v1
    kind: Service
    metadata:
      name: headless-svc
    spec:
      clusterIP: None
      selector:
        job-name: job-1
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      backoffLimit: 0
      completions: 2
      parallelism: 2
      completionMode: Indexed
      template:
        spec:
          subdomain: headless-svc
          restartPolicy: Never
          nodeSelector:
              cloud.google.com/gke-flex-start: "true"
              cloud.google.com/gke-tpu-accelerator: ACCELERATOR_TYPE
              cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY
          containers:
          - name: tpu-job
            image: python:3.10
            ports:
            - containerPort: 8471 # Default port using which TPU VMs communicate
            - containerPort: 8431 # Port to export TPU runtime metrics, if supported.
            securityContext:
              privileged: true
            command:
            - bash
            - -c
            - |
              pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html
              python -c 'import jax; print("TPU cores:", jax.device_count())'
            resources:
              requests:
                google.com/tpu: NUM_CHIPS
              limits:
                google.com/tpu: NUM_CHIPS
    

    Reemplaza lo siguiente:

    • ACCELERATOR_TYPE: El tipo de acelerador de TPU que usaste cuando creaste los grupos de nodos. Por ejemplo, tpu-v4-podslice o tpu-v5-lite-podslice.
    • TPU_TOPOLOGY: la topología física para la porción de TPU. Por ejemplo, el valor puede ser 4x4x4 o 2x2, según la versión de la TPU.
    • NUM_CHIPS: La cantidad de chips TPU en cada VM es uno, cuatro u ocho. Para obtener más información, consulta Versiones de TPU.
  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
    

    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>
    

Realiza una limpieza

Para evitar que se apliquen cargos a tu cuenta de Google Cloud 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. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

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 LOCATION_NAME
    
  3. Borra el clúster:

    gcloud container clusters delete CLUSTER_NAME
    

¿Qué sigue?