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:
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 utilizzarect6e-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
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 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.
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 garantisce che eseguano correttamente un'attività specifica.Nella Trusted Cloud console, avvia una sessione Cloud Shell facendo clic su
Attiva Cloud Shell. Si apre una sessione nel riquadro inferiore della console Trusted 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 è uno, quattro o otto. Per scoprire 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 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
- In the Trusted 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.