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 batch workload. Per maggiori informazioni sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud , consulta Ruoli utente e attività comuni di GKE Enterprise.
Prezzi con avvio flessibile
L'avvio flessibile è consigliato se il tuo workload richiede risorse di cui viene eseguito il provisioning 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 in base ai prezzi di Dynamic Workload Scheduler:
- Scontato (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
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 località 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 avvio flessibile:
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 calcolo 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 calcolo 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 utilizzarect6e-standard-4t
per TPU Trillium. Per scoprire di più sui tipi di macchina disponibili, vedi 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 in Scegliere una topologia.
Il comando precedente utilizza i seguenti flag obbligatori quando crei un pool di nodi con avvio flessibile:
--enable-autoscaling
: il provisioning con avvio flessibile fornisce 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
su4
perché una topologia4x4
è composta da 16 chip e ogni VMct6e-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.
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 suTrue
.
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 assicura che eseguano correttamente un'attività specifica.Nella Google Cloud console, avvia una sessione Cloud Shell facendo clic su
Attiva Cloud Shell. Si apre una sessione nel riquadro inferiore della console Google Cloud .
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
otpu-v5-lite-podslice
.TPU_TOPOLOGY
: la topologia fisica per lo slice TPU. Ad esempio, il valore potrebbe essere4x4x4
o2x2
, a seconda della versione della TPU.NUM_CHIPS
: il numero di chip TPU in ogni VM è 1, 4 o 8. Per saperne di più, consulta la sezione Versioni TPU.
Applica il manifest
dws-flex-start.yaml
:kubectl apply -f dws-flex-start.yaml
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Elimina la singola risorsa
Elimina i job:
kubectl delete job -l "job-name in (job-1,job-2)"
Elimina il pool di nodi:
gcloud container node-pools delete NODE_POOL_NAME \ --location LOCATION_NAME
Elimina il cluster:
gcloud container clusters delete CLUSTER_NAME
Passaggi successivi
- Scopri di più sulle TPU in GKE.
- Scopri di più sul provisioning automatico dei nodi.
- Scopri di più sulle best practice per l'esecuzione dei workload batch su GKE.