Questa guida mostra come ottimizzare il provisioning delle GPU per carichi di lavoro di addestramento di medie e piccole dimensioni utilizzando la modalità di provisioning con avvio flessibile. In questa guida utilizzi flex-start per eseguire il deployment di un carico di lavoro costituito da due job Kubernetes. Ogni job richiede una GPU. GKE esegue automaticamente il provisioning di un singolo nodo con due GPU A100 per eseguire entrambi i job.
Se il tuo carico di lavoro richiede l'elaborazione distribuita su più nodi, valuta la possibilità di utilizzare l'avvio flessibile con provisioning in coda. Per maggiori informazioni, consulta Eseguire un carico di lavoro su larga scala con l'avvio flessibile con provisioning in coda.
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 Google Cloud , 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 GPU 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, puoi utilizzare gcloud CLI o Terraform.
Se utilizzi un cluster in modalità Autopilot, salta questa sezione e vai alla sezione Esegui un workload batch.
gcloud
Crea un pool di nodi con avvio flessibile:
gcloud container node-pools create NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --project PROJECT_ID \ --accelerator type=nvidia-a100-80gb,count=2 \ --machine-type a2-ultragpu-2g \ --max-run-duration MAX_RUN_DURATION \ --flex-start \ --num-nodes 0 \ --enable-autoscaling \ --total-min-nodes 0 \ --total-max-nodes 5 \ --location-policy ANY \ --reservation-affinity none \ --no-enable-autorepair
Sostituisci quanto segue:
NODE_POOL_NAME
: il nome che scegli per il tuo pool di nodi.LOCATION_NAME
: la regione di computing per il control plane del cluster.PROJECT_ID
: il tuo ID progetto.CLUSTER_NAME
: il nome del cluster Standard che vuoi modificare.MAX_RUN_DURATION
: facoltativo. Il runtime massimo di un nodo in secondi, fino al valore predefinito di sette giorni.
In questo comando, il flag
--flex-start
indica agcloud
di creare un pool di nodi con avvio flessibile abilitato.GKE crea un pool di nodi con nodi che contengono due GPU A100 (
a2-ultragpu-2g
). Questo pool di nodi scala automaticamente i nodi da zero a un massimo di cinque nodi.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
.
Terraform
Puoi utilizzare l'avvio flessibile con le GPU utilizzando un modulo Terraform.
- Aggiungi il seguente blocco alla configurazione Terraform:
```hcl
resource "google_container_node_pool" " "gpu_dws_pool" {
name = "gpu-dws-pool"
queued_provisioning {
enabled = false
}
}
node_config {
machine_type = "a3-highgpu-8g"
flex_start = true
}
```
Terraform chiama le API Google Cloud per creare un cluster con un pool di nodi che utilizza l'avvio flessibile con le GPU. Il pool di nodi inizialmente ha zero
nodi e la scalabilità automatica è abilitata. Per scoprire di più su Terraform, consulta la
specifica della risorsa google_container_node_pool
su terraform.io.
Esegui un carico di lavoro batch
In questa sezione, creerai due job Kubernetes che richiedono una GPU ciascuno. Un controller Job in Kubernetes crea uno o più pod e garantisce 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
:apiVersion: batch/v1 kind: Job metadata: name: job-1 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" containers: - name: container-1 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure --- apiVersion: batch/v1 kind: Job metadata: name: job-2 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" containers: - name: container-2 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure
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 "job-name in (job-1,job-2)" -o wide
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> job-2 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 GPU in GKE.
- Scopri di più sul provisioning automatico dei nodi.
- Scopri di più sulle best practice per l'esecuzione dei workload batch su GKE.