Esegui un piccolo carico di lavoro batch con TPU e VM con avvio flessibile

Questa guida mostra come ottimizzare il provisioning delle TPU per carichi di lavoro di addestramento su media e piccola scala utilizzando le VM con inizio flessibile. Le VM con avvio flessibile vengono create utilizzando l'opzione di consumo flex-start. In questa guida, utilizzi le VM con inizio flessibile per eseguire il deployment di un carico di lavoro costituito da un pool di nodi di sezioni di TPU.

Questa guida è destinata a ingegneri di machine learning (ML), amministratori e operatori di piattaforme e a specialisti di dati e AI interessati a utilizzare le funzionalità di orchestrazione dei container Kubernetes per l'esecuzione di batch workload. Per maggiori informazioni sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti, consulta Ruoli e attività comuni degli utenti GKE. Google Cloud

Prezzi con avvio flessibile

L'avvio flessibile è consigliato se il tuo workload richiede risorse di cui viene eseguito il provisioning in modo dinamico in base alle necessità, per un massimo di sette giorni con prenotazioni a breve termine, senza gestione complessa delle quote e con accesso conveniente. L'inizio flessibile è basato su Dynamic Workload Scheduler e viene fatturato in base ai prezzi di Dynamic Workload Scheduler:

  • Scontati (fino al 53%) per vCPU, GPU e TPU.
  • Paghi in base al consumo.

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:

  • Attiva l'API Google Kubernetes Engine.
  • Attiva l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installala e poi inizializza gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo il comando gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
  • Verifica di avere un cluster Autopilot o un cluster standard che esegue la versione 1.33.0-gke.1712000 o successive.
  • Verifica di avere familiarità con le limitazioni dell'avvio flessibile.
  • Quando utilizzi un cluster Standard, verifica di mantenere almeno un pool di nodi senza l'avvio flessibile abilitato per il corretto funzionamento del cluster.
  • Verifica di disporre della quota per le TPU prerilasciabili nelle località dei nodi.

Crea un pool di nodi con avvio flessibile

Se utilizzi un cluster in modalità Autopilot, salta questa sezione e vai alla sezione Esegui un carico di lavoro batch.

Per creare un pool di nodi con flex-start abilitato in un cluster Standard esistente, utilizza gcloud CLI.

Crea un pool di nodi TPU single-host

Puoi creare un pool di nodi di sezioni TPU single-host con avvio flessibile:

  1. Crea un pool di nodi con avvio flessibile:

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

    Sostituisci quanto segue:

    • NODE_POOL_NAME: il nome che scegli per il tuo pool di nodi.
    • CLUSTER_NAME: il nome del cluster.
    • CONTROL_PLANE_LOCATION: la regione di computing per il control plane del cluster.
    • NODE_ZONES: l'elenco separato da virgole di una o più zone in cui GKE crea il pool di nodi.
    • MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi. Per ulteriori informazioni sui tipi di macchina compatibili con le TPU, utilizza la tabella in Scegliere la versione di TPU.

      Ad esempio, il comando di creazione del pool di nodi può includere i seguenti parametri:

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

      Questo comando imposta il campo --max-nodes su 4 perché una topologia 4x4 è composta da 16 chip e ogni VM ct6e-standard-4t ha 4 chip.

      Il gestore della scalabilità automatica dei cluster aumenta il numero di nodi in base a quanto richiesto dal tuo workload. Al termine del carico di lavoro, il gestore della scalabilità automatica dei cluster esegue lo scale down a zero nodi.

    • --reservation-affinity=none: l'avvio flessibile non utilizza né richiede prenotazioni.

Crea un pool di nodi TPU slice multi-host

I passaggi per creare un pool di nodi TPU slice multi-host variano a seconda che utilizzi Ironwood (TPU7x) o una versione precedente della TPU.

Ironwood (TPU7x)

Puoi creare un node pool slice TPU multi-host nella versione Ironwood (TPU7x) utilizzando Google Cloud CLI o Terraform:

gcloud

Per creare un pool di nodi TPU slice multi-host con Ironwood (TPU7x), devi prima creare una policy del carico di lavoro.

  1. Crea una policy del workload:

    gcloud compute resource-policies create workload-policy WORKLOAD_POLICY_NAME \
        --type=HIGH_THROUGHPUT \
        --accelerator-topology=TPU_TOPOLOGY \
        --project=PROJECT_ID \
        --region=REGION
    

    Sostituisci quanto segue:

    • WORKLOAD_POLICY_NAME: un nome per la policy del workload.
    • TPU_TOPOLOGY: la topologia TPU Ironwood (TPU7x). Ad esempio, 2x2x2. Per visualizzare tutte le topologie Ironwood (TPU7x) supportate, consulta la sezione relativa alla topologia.
    • PROJECT_ID: il tuo ID progetto Google Cloud .
    • REGION: la regione della policy del workload. Una policy del workload è una risorsa di regione e può essere riutilizzata in pool di nodi che condividono la stessa topologia.
  2. Crea il pool di nodi con la policy del workload:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=us-central1 \
        --node-locations=us-central1-c \
        --machine-type=tpu7x-standard-4t \
        --reservation-affinity=none \
        --enable-autoscaling \
        --num-nodes=0 --min-nodes=0 --max-nodes=MAX_NODES \
        --flex-start \
        --placement-policy=WORKLOAD_POLICY
    

    Sostituisci quanto segue:

    • NODE_POOL_NAME: il nome del nuovo pool di nodi.
    • WORKLOAD_POLICY: il nome della policy del workload che hai creato.
    • MAX_NODES: La dimensione massima del node pool. Il flag --max-nodes è obbligatorio se viene fornito --enable-autoscaling e deve essere uguale al prodotto dei valori definiti in TPU_TOPOLOGY ({A}x{B}x{C}) diviso per il numero di chip in ogni VM. Ad esempio, se TPU_TOPOLOGY è 2x2x2, il prodotto è 8. Poiché ogni VM in tpu7x-standard-4t ha 4 chip, il numero di nodi è 2.

    Questo comando crea un pool di nodi denominato NODE_POOL_NAME con le seguenti caratteristiche:

    • --machine-type=tpu7x-standard-4t specifica il tipo di macchina Ironwood (TPU7x).
    • --flex-start consente l'avvio flessibile.

Terraform

  1. Assicurati di utilizzare la versione 4.84.0 o successive del provider google.
  2. Crea una policy del workload:

    resource "google_compute_resource_policy" {
      name   = "WORKLOAD_POLICY_NAME"
      region = CLUSTER_LOCATION
      workload_policy {
        type = "HIGH_THROUGHPUT"
        accelerator_topology = "TPU_TOPOLOGY"
      }
    }
    

    Sostituisci quanto segue:

    • WORKLOAD_POLICY_NAME: un nome per la policy del workload.
    • CLUSTER_LOCATION: la località di computing per il cluster. Consigliamo di utilizzare un cluster regionale per una maggiore affidabilità del control plane Kubernetes. Puoi anche utilizzare un cluster zonale. Per maggiori informazioni, vedi Selezionare una versione e una topologia TPU.
    • TPU_TOPOLOGY: la topologia TPU Ironwood (TPU7x). Ad esempio, 2x2x2. Per visualizzare tutte le topologie Ironwood (TPU7x) supportate, consulta la sezione Pianificare le TPU.

    Per saperne di più sul riferimento google_compute_resource_policy, consulta Provider Terraform.

  3. Nella configurazione di Terraform, aggiungi il seguente blocco:

    resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" {
      provider           = google
      project            = PROJECT_ID
      cluster            = CLUSTER_NAME
      name               = POOL_NAME
      location           = CLUSTER_LOCATION
      node_locations     = [NODE_ZONES]
      initial_node_count = NUM_NODES
    
      autoscaling {
        max_node_count = MAX_NODES
        location_policy      = "ANY"
      }
      node_config {
        machine_type = MACHINE_TYPE
        reservation_affinity {
          consume_reservation_type = "SPECIFIC_RESERVATION"
          key = "compute.googleapis.com/reservation-name"
          values = [RESERVATION_LABEL_VALUES]
        }
        flex_start = true
      }
    
      placement_policy {
        policy_name = WORKLOAD_POLICY_NAME
      }
    }
    

    Sostituisci quanto segue:

    • NODE_POOL_RESOURCE_NAME: il nome della risorsa del node pool nel modello Terraform.
    • PROJECT_ID: il tuo ID progetto.
    • CLUSTER_NAME: il nome del cluster esistente a cui aggiungere il pool di nodi.
    • POOL_NAME: il nome del pool di nodi da creare.
    • NODE_ZONES: l'elenco separato da virgole di una o più zone in cui GKE crea il pool di nodi.
    • NUM_NODES: il numero di nodi nel node pool. Deve essere zero o il prodotto del numero di chip TPU diviso per quattro, perché nelle sezioni TPU multihost ogni nodo della sezione TPU ha quattro chip. Ad esempio, se TPU_TOPOLOGY è 4x8, allora ci sono 32 chip, il che significa che NUM_NODES deve essere 8. Per scoprire di più sulle topologie TPU, utilizza la tabella in Scegliere la versione della TPU.
    • TPU_TOPOLOGY: indica la topologia fisica selezionata per la sezione TPU. Il formato della topologia dipende dalla versione della TPU che stai utilizzando. Per saperne di più sulle topologie TPU, utilizza la tabella in Scegliere una topologia.

    Se vuoi, puoi utilizzare anche le seguenti variabili:

    • RESERVATION_NAME: se utilizzi una prenotazione TPU, fornisci un elenco di etichette delle risorse di prenotazione da utilizzare durante la creazione del pool di nodi. Per scoprire di più su come compilare ilRESERVATION_LABEL_VALUES nel campo reservation_affinity, consulta Provider Terraform.
    • autoscaling: crea un pool di nodi con la scalabilità automatica abilitata. Quando GKE scala unpool di nodil di sezioni TPU multi-host, lo scala in modo atomico da zero alle dimensioni massime.
      • MAX_NODES: la dimensione massima del node pool. Il valore deve essere uguale al prodotto dei valori definiti in TPU_TOPOLOGY ({A}x{B}x{C}) diviso per il numero di chip in ogni VM. Ad esempio, se TPU_TOPOLOGY è 2x2x2, il prodotto è 8. Poiché ogni VM in tpu7x-standard-4t ha 4 chip, il numero di nodi è 2.
    • spot: il pool di nodi che utilizzerà le VM spot per i nodi dello slice TPU. Questa impostazione non può essere modificata dopo la creazione del pool di nodi. Per saperne di più, consulta VM spot.
    • flex_start: il pool di nodi che utilizzerà l'opzione di consumo avvio flessibile. Questa impostazione non può essere impostata su true se spot è attivato.

Altre versioni di TPU

Puoi creare un pool di nodi slice TPU multihost nelle versioni v3, v4, v5p, v5e e Trillium (v6e) utilizzando Google Cloud CLI, Terraform o la console Google Cloud .

gcloud

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

Sostituisci quanto segue:

  • NODE_POOL_NAME: il nome del nuovo pool di nodi.
  • CLUSTER_NAME: il nome del cluster.
  • CONTROL_PLANE_LOCATION: il nome della zona in base alla versione della TPU che vuoi utilizzare. Per identificare una località disponibile, consulta Disponibilità di TPU in GKE.
  • NODE_ZONES: l'elenco separato da virgole di una o più zone in cui GKE crea il pool di nodi.
  • MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi. Per ulteriori informazioni sui tipi di macchina compatibili con le TPU, utilizza la tabella in Scegliere la versione di TPU.
  • TPU_TOPOLOGY: la topologia TPU. Ad esempio, 2x2x2. Per visualizzare tutte le topologie TPU supportate, consulta la sezione Topologia.
  • MAX_NODES: la dimensione massima del node pool. Il flag --max-nodes è obbligatorio se viene fornito --enable-autoscaling e deve essere uguale al prodotto dei valori definiti in TPU_TOPOLOGY ({A}x{B}x{C}) diviso per il numero di chip in ogni VM.

    Questo comando crea un pool di nodi denominato NODE_POOL_NAME con l'avvio flessibile abilitato.

Terraform

  1. Assicurati di utilizzare la versione 4.84.0 o successive del provider google.
  2. Aggiungi il seguente blocco alla configurazione Terraform:

    resource "google_container_node_pool" "NODE_POOL_RESOURCE_NAME" {
      provider           = google
      project            = PROJECT_ID
      cluster            = CLUSTER_NAME
      name               = POOL_NAME
      location           = CLUSTER_LOCATION
      node_locations     = [NODE_ZONES]
      initial_node_count = NUM_NODES
    
      autoscaling {
        max_node_count = MAX_NODES
        location_policy      = "ANY"
      }
      node_config {
        machine_type = MACHINE_TYPE
        reservation_affinity {
          consume_reservation_type = "SPECIFIC_RESERVATION"
          key = "compute.googleapis.com/reservation-name"
          values = [RESERVATION_LABEL_VALUES]
        }
        flex_start = true
      }
    
      placement_policy {
        type = "COMPACT"
        tpu_topology = TPU_TOPOLOGY
      }
    }
    

    Sostituisci quanto segue:

    • NODE_POOL_RESOURCE_NAME: il nome della risorsa del node pool nel modello Terraform.
    • PROJECT_ID: il tuo ID progetto.
    • CLUSTER_NAME: il nome del cluster esistente a cui aggiungere il pool di nodi.
    • POOL_NAME: il nome del pool di nodi da creare.
    • CLUSTER_LOCATION: la località di computing del cluster. Consigliamo di utilizzare un cluster regionale per una maggiore affidabilità del control plane Kubernetes. Puoi anche utilizzare un cluster zonale. Per scoprire di più, consulta la sezione Selezionare una versione e una topologia TPU.
    • NODE_ZONES: l'elenco separato da virgole di una o più zone in cui GKE crea il pool di nodi.
    • NUM_NODES: il numero di nodi nel node pool. Deve essere zero o il prodotto del numero di chip TPU diviso per quattro, perché nelle sezioni TPU multihost ogni nodo della sezione TPU ha 4 chip. Ad esempio, se TPU_TOPOLOGY è 4x8, allora ci sono 32 chip, il che significa che NUM_NODES deve essere 8. Per scoprire di più sulle topologie TPU, utilizza la tabella in Scegliere la versione della TPU.
    • TPU_TOPOLOGY: indica la topologia fisica della sezione TPU. Il formato della topologia dipende dalla versione della TPU che stai utilizzando. Per saperne di più sulle topologie TPU, utilizza la tabella in Scegliere una topologia.

    Se vuoi, puoi utilizzare anche le seguenti variabili:

    • RESERVATION_NAME: se utilizzi la prenotazione TPU, questo è l'elenco delle etichette delle risorse di prenotazione da utilizzare durante la creazione del pool di nodi. Per scoprire di più su come compilare ilRESERVATION_LABEL_VALUES nel campo reservation_affinity, consulta Provider Terraform.
    • autoscaling: crea un pool di nodi con la scalabilità automatica abilitata. Quando GKE scala unpool di nodil di sezioni TPU multi-host, lo scala in modo atomico da zero alle dimensioni massime.
      • MAX_NODES: è la dimensione massima del node pool. Deve essere uguale al prodotto dei valori definiti in TPU_TOPOLOGY ({A}x{B}x{C}) diviso per il numero di chip in ogni VM.
    • spot: consente al pool di nodi di utilizzare le VM spot per i nodi della sezione TPU. Questo valore non può essere modificato dopo la creazione del pool di nodi. Per saperne di più, consulta VM spot.
    • flex_start: imposta il pool di nodi in modo che utilizzi l'opzione di consumo avvio flessibile. Non può essere impostato su true se spot è abilitato.

Console

Per creare un pool di nodi con TPU:

  1. Vai alla pagina Google Kubernetes Engine nella console Google Cloud .

    Vai a Google Kubernetes Engine

  2. Nell'elenco dei cluster, fai clic sul nome del cluster da modificare.

  3. Fai clic su Aggiungi pool di nodi.

  4. Nella sezione Dettagli del pool di nodi, seleziona la casella Specifica le località dei nodi.

  5. Seleziona il nome della zona in base alla versione della TPU che vuoi utilizzare. Per identificare una località disponibile, consulta Disponibilità di TPU in GKE.

  6. Nel riquadro di navigazione, fai clic su Nodi.

  7. Nella sezione Configurazione macchina, seleziona TPU.

  8. Nel menu a discesa Serie, seleziona una delle seguenti opzioni:

    • CT3: TPU v3, dispositivo host singolo
    • CT3P: TPU v3, sezione di pod multi-host
    • CT4P: TPU v4
    • CT5LP: TPU v5e
    • CT5P: TPU v5p
    • CT6E: TPU Trillium (v6e)
  9. Nel menu a discesa Tipo di macchina, seleziona il nome della macchina da utilizzare per i nodi. Utilizza la tabella Scegli la versione della TPU per scoprire come definire il tipo di macchina e la topologia TPU che creano un pool di nodi della sezione TPU multi-host.

  10. Nel menu a discesa Topologia TPU, seleziona la topologia fisica per la sezione TPU.

  11. Nella finestra di dialogo Modifiche necessarie, fai clic su Apporta modifiche.

  12. Assicurati che Tipo di disco di avvio sia Disco permanente standard o Disco permanente SSD.

  13. (Facoltativo) Seleziona la casella di controllo Abilita nodi sulle VM Spot per utilizzare le VM spot per i nodi nel pool di nodi.

  14. Fai clic su Crea.

Verifica lo stato dell'avvio flessibile nel pool di nodi

Esegui questo comando:

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

Se l'avvio flessibile è abilitato nel pool di nodi, il campo flexStart è impostato su True.

Esegui un carico di lavoro batch

In questa sezione crei un job che pianifica un nodo TPU con VM Flex-start. Un controller Job in Kubernetes crea uno o più pod e garantisce che eseguano correttamente un'attività specifica.

  1. Nella Google Cloud console, avvia una sessione di Cloud Shell facendo clic su Icona di attivazione di Cloud Shell Attiva Cloud Shell. Si apre una sessione nel riquadro inferiore della console Google Cloud .

  2. Crea un file denominato dws-flex-start.yaml:

    Host singolo

    Utilizza il seguente manifest per il file 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
    

    Multi-host

    Utilizza il seguente manifest per il file 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: us-docker.pkg.dev/cloud-tpu-images/jax-ai-image/tpu:latest
            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
            - |
              python -c 'import jax; print("TPU cores:", jax.device_count())'
            resources:
              requests:
                google.com/tpu: NUM_CHIPS
              limits:
                google.com/tpu: NUM_CHIPS
    

    Sostituisci quanto segue:

    • ACCELERATOR_TYPE: il tipo di acceleratore TPU che hai utilizzato durante la creazione dei node pool. Ad esempio, tpu-v4-podslice o tpu-v5-lite-podslice.
    • TPU_TOPOLOGY: la topologia fisica per lo slice TPU. Ad esempio, il valore potrebbe essere 4x4x4 o 2x2, a seconda della versione della TPU.
    • NUM_CHIPS: il numero di chip TPU in ogni VM è uno, quattro o otto. Per saperne di più, consulta la sezione Versioni TPU.
  3. Applica il manifest dws-flex-start.yaml:

    kubectl apply -f dws-flex-start.yaml
    
  4. Verifica che i job siano in esecuzione sullo stesso nodo:

    kubectl get pods
    

    L'output è simile al seguente:

    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>
    

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questa pagina, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

  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.

Elimina la singola risorsa

  1. Elimina i job:

    kubectl delete job -l "job-name in (job-1,job-2)"
    
  2. Elimina il pool di nodi:

    gcloud container node-pools delete NODE_POOL_NAME \
          --location CONTROL_PLANE_LOCATION
    
  3. Elimina il cluster:

    gcloud container clusters delete CLUSTER_NAME
    

Passaggi successivi