Esegui un workload batch di piccole dimensioni con le TPU e la modalità di provisioning con avvio flessibile


Questa guida mostra come ottimizzare il provisioning delle TPU per i workload di addestramento su media e piccola scala utilizzando la modalità di provisioning con avvio flessibile. In questa guida utilizzi l'avvio flessibile per eseguire il deployment di un workload costituito da un pool di nodi di slice 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 workload batch. Per maggiori informazioni sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Trusted Cloud by S3NS , consulta Ruoli utente e attività comuni di GKE Enterprise.

Prezzi per l'avvio flessibile

L'avvio flessibile è consigliato se il tuo carico di lavoro 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 una gestione complessa delle quote e con un accesso conveniente. L'avvio flessibile è basato su Dynamic Workload Scheduler e viene fatturato utilizzando i 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 inizializzala. Se hai già installato gcloud CLI, scarica l'ultima versione eseguendo gcloud components update.
  • 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'orario 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 posizioni dei nodi.

Crea un pool di nodi con avvio flessibile

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

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

Puoi creare un pool di nodi TPU single-host o multi-host con flex-start:

  1. Crea un pool di nodi con avvio flessibile:

    Host singolo

    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
    

    Sostituisci quanto segue:

    • NODE_POOL_NAME: il nome che scegli per il tuo pool di nodi.
    • CLUSTER_NAME: il nome del cluster.
    • LOCATION_NAME: 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 saperne di più sui tipi di macchina compatibili con le TPU, utilizza la tabella in Scegliere la versione della TPU.

    Multi-host

    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
    

    Sostituisci quanto segue:

    • NODE_POOL_NAME: il nome che scegli per il tuo pool di nodi.
    • CLUSTER_NAME: il nome del cluster.
    • LOCATION_NAME: 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. Ad esempio, puoi utilizzare ct6e-standard-4t per TPU Trillium. Per saperne di più sui tipi di macchina disponibili, consulta Scegliere la versione della TPU.
    • TPU_TOPOLOGY: la topologia fisica della sezione TPU. Il formato della topologia dipende dalla versione della TPU. Per saperne di più sulle topologie TPU, utilizza la tabella nella sezione Scegliere una topologia.

    Il comando precedente utilizza i seguenti flag obbligatori quando crei un pool di nodi con avvio flessibile:

    • --enable-autoscaling: il provisioning flessibile avvia solo le risorse di calcolo necessarie quando viene eseguito il carico di lavoro. Devi impostare i seguenti parametri:

      • --num-nodes=0
      • --min-nodes=0
      • --max-nodes impostato sul numero di macchine virtuali richieste dalla sezione 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 carico di lavoro. 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.

  2. Verifica lo stato dell'avvio flessibile nel pool di nodi:

    gcloud container node-pools describe NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --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, creerai un job che pianifica un nodo TPU con avvio flessibile. Un controller Job in Kubernetes crea uno o più pod e garantisce che eseguano correttamente un'attività specifica.

  1. Nella Trusted Cloud console, avvia una sessione Cloud Shell facendo clic su Icona di attivazione di Cloud Shell Attiva Cloud Shell. Si apre una sessione nel riquadro inferiore della console Trusted 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: 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
    

    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 scoprire 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 Trusted Cloud by S3NS 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 Trusted 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 LOCATION_NAME
    
  3. Elimina il cluster:

    gcloud container clusters delete CLUSTER_NAME
    

Passaggi successivi