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

Questa guida mostra come ottimizzare il provisioning delle GPU per i carichi di lavoro di addestramento di medie e piccole dimensioni utilizzando le VM con avvio flessibile. Le VM con avvio flessibile vengono create utilizzando l'opzione di consumo con avvio flessibile. In questa guida, utilizzerai le VM con avvio flessibile 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 saperne di più, 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 specialisti di dati e AI interessati a utilizzare le funzionalità di orchestrazione dei container Kubernetes per eseguire carichi di lavoro batch. Per saperne di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività utente GKE comuni.

Prezzi dell'avvio flessibile

L'avvio flessibile è consigliato se il tuo carico di lavoro richiede risorse di cui viene eseguito il provisioning dinamico in base alle esigenze, per un massimo di sette giorni con prenotazioni a breve termine, nessuna gestione complessa delle quote e accesso conveniente. L'avvio flessibile è basato su Dynamic Workload Scheduler e viene fatturato utilizzando i prezzi di Dynamic Workload Scheduler:

  • Puoi ricevere uno sconto (fino al 53%) per vCPU, GPU, TPU e tutti i dischi SSD locali collegati.
  • Paghi in base al consumo (PAYG).

Prima di iniziare

Prima di iniziare, assicurati di aver eseguito le seguenti attività:

  • Abilita l'API Google Kubernetes Engine.
  • Abilita 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 gcloud components update comando. 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 conoscere i limiti 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 avere una quota per le GPU prerilasciabili nelle località dei nodi.

Se non hai un cluster o il cluster non soddisfa i requisiti, puoi creare un cluster regionale Standard utilizzando gcloud CLI. Aggiungi i seguenti flag per scoprire di più sull'avvio flessibile:

--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8

Quando crei un pool di nodi con avvio flessibile , utilizza i flag menzionati in precedenza e --accelerator type=nvidia-l4,count=1.

Se hai un cluster Standard che soddisfa i requisiti, le sezioni successive ti guideranno nella selezione di un tipo di acceleratore GPU e di un tipo di macchina per il cluster.

Scegli un tipo di acceleratore GPU

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

La disponibilità delle GPU è specifica per ogni zona. Devi trovare un tipo di acceleratore GPU disponibile in una zona in cui si trova il cluster Standard. Se hai un cluster Standard regionale, la zona in cui è disponibile il tipo di acceleratore GPU deve trovarsi nella regione in cui si trova il cluster. Quando crei il pool di nodi, devi specificare il tipo di acceleratore e le zone per i nodi. Se specifichi un tipo di acceleratore non disponibile nella località del cluster, la creazione del pool di nodi non riesce.

Esegui i seguenti comandi per ottenere la località del cluster e un tipo di acceleratore GPU supportato.

  1. Ottieni la località in cui si trova il cluster:

    gcloud container clusters list
    

    L'output è simile al seguente:

    NAME                LOCATION  MASTER_VERSION      MASTER_IP     MACHINE_TYPE  NODE_VERSION        NUM_NODES  STATUS   STACK_TYPE
    example-cluster-1   us-west2  1.33.2-gke.1111000  34.102.3.122  e2-medium     1.33.2-gke.1111000  9          RUNNING  IPV4
    
  2. Elenca i tipi di acceleratori GPU disponibili, escluse le workstation virtuali nella località:

    gcloud compute accelerator-types list | grep CONTROL_PLANE_LOCATION | grep -v "Workstation"
    

    Sostituisci CONTROL_PLANE_LOCATION con la località del cluster.

    Ad esempio, per ottenere un elenco dei tipi di acceleratori GPU nella regione us-west2, esegui il seguente comando:

    gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
    

    L'output è simile al seguente:

    nvidia-b200            us-west2-c                 NVIDIA B200 180GB
    nvidia-tesla-p4        us-west2-c                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-c                 NVIDIA T4
    nvidia-tesla-p4        us-west2-b                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-b                 NVIDIA T4
    

Scegli un tipo di macchina compatibile

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

Dopo aver individuato le GPU disponibili nella località del cluster, puoi determinare i tipi di macchine compatibili. Google Cloud limita le GPU a serie di macchine specifiche. Segui questi passaggi per trovare un tipo di macchina:

  1. Consulta la tabella dei modelli di GPU disponibili.
  2. Individua la riga relativa al tipo di acceleratore GPU che hai scelto.
  3. Esamina la colonna "Serie di macchine" della stessa riga. Questa colonna indica la serie di macchine che devi utilizzare.
  4. Per visualizzare i nomi tipo di macchina che puoi specificare, fai clic sul link della serie di macchine.

L'unica eccezione è la serie di macchine N1, che fornisce indicazioni aggiuntive sui tipi di macchine N1 che puoi utilizzare con il tipo di acceleratore scelto.

Prima di utilizzare una macchina ottimizzata per gli acceleratori, assicurati che sia supportata con la modalità di provisioning con avvio flessibile, come mostrato in Disponibilità dell'opzione di consumo per tipo di macchina.

Determina il conteggio degli acceleratori

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

Per creare un pool di nodi, devi determinare il numero di acceleratori da collegare a ogni nodo del pool di nodi. I valori validi dipendono dal tipo di acceleratore e dal tipo di macchina. Ogni tipo di macchina ha un limite al numero di GPU che può supportare. Per determinare il valore da utilizzare (oltre al valore predefinito 1):

  1. Consulta la sezione Tipi di macchina GPU.
  2. Nella tabella, cerca il tipo di acceleratore per il tipo di serie di macchine.
  3. Utilizza il valore nella colonna "Conteggio GPU".

Crea un pool di nodi con avvio flessibile

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

Per creare un pool di nodi con l'avvio flessibile abilitato in un cluster Standard esistente, puoi utilizzare gcloud CLI o Terraform.

gcloud

  1. Crea un pool di nodi con avvio flessibile:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --project PROJECT_ID \
        --accelerator type=ACCELERATOR_TYPE,count=COUNT \
        --machine-type MACHINE_TYPE \
        --max-run-duration MAX_RUN_DURATION \
        --flex-start \
        --node-locations NODE_ZONES \
        --num-nodes 0 \
        --enable-autoscaling \
        --total-min-nodes 0 \
        --total-max-nodes 5 \
        --location-policy ANY \
        --reservation-affinity none \
        --no-enable-autorepair \
        --consolidation-delay=CONSOLIDATION_DELAY
    

    Sostituisci quanto segue:

    • NODE_POOL_NAME: il nome che scegli per il pool di nodi.
    • CLUSTER_NAME: il nome del cluster Standard che vuoi modificare.
    • CONTROL_PLANE_LOCATION: la regione di Compute per il control plane del cluster.
    • PROJECT_ID: il tuo ID progetto.
    • ACCELERATOR_TYPE: il tipo specifico di acceleratore (ad esempio, nvidia-tesla-t4 per NVIDIA T4) da collegare alle istanze.
    • COUNT: il numero di acceleratori da collegare alle istanze. Il valore predefinito è 1.
    • MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi.
    • MAX_RUN_DURATION: facoltativo. La durata massima di esecuzione di un nodo in secondi, fino al valore predefinito di sette giorni. Il numero che inserisci deve terminare con s. Ad esempio, per specificare un giorno, inserisci 86400s.
    • CONSOLIDATION_DELAY: facoltativo. La durata di attesa del gestore della scalabilità automatica dei cluster prima di poter fare lo scale down dei nodi sottoutilizzati. Utilizza questa impostazione per ritardare lo scale down e conservare il pool di nodi per un riutilizzo successivo da parte di altri pod. Il numero che inserisci deve terminare con s. Ad esempio, per specificare un'ora, inserisci 3600s. Disponibile in GKE versione 1.34.1-gke.2364000 e successive.
    • NODE_ZONES: un elenco separato da virgole di una o più zone in cui GKE crea il pool di nodi.

    In questo comando, il flag --flex-start indica a gcloud di creare un pool di nodi con VM con avvio flessibile.

    GKE crea un pool di nodi con nodi che contengono due istanze del tipo di acceleratore specificato. Inizialmente, il pool di nodi non ha nodi e la scalabilità automatica è abilitata.

Terraform

Puoi utilizzare l'avvio flessibile con le GPU utilizzando un modulo Terraform.

  1. Aggiungi il seguente blocco alla configurazione di Terraform:
resource "google_container_node_pool" "gpu_dws_pool" {
name = "gpu-dws-pool"

queued_provisioning {
    enabled = false
}

}
node_config {
    machine_type = "MACHINE_TYPE"
    accelerator_type = "ACCELERATOR_TYPE"
    accelerator_count = COUNT
    node_locations = ["NODE_ZONES"]
    flex_start = true
}

Sostituisci quanto segue:

  • MACHINE_TYPE: il tipo di macchina da utilizzare per i nodi.
  • ACCELERATOR_TYPE: il tipo specifico di acceleratore (ad esempio, nvidia-tesla-t4 per NVIDIA T4) da collegare alle istanze.
  • COUNT: il numero di acceleratori da collegare a istanze. Il valore predefinito è 1.
  • NODE_ZONES: l'elenco separato da virgole di una o più zone in cui GKE crea il pool di nodi.

Terraform chiama Google Cloud le API per creare un cluster con un pool di nodi che utilizza VM con avvio flessibile con GPU. Inizialmente, il pool di nodi non ha nodi e la scalabilità automatica è abilitata. Per saperne di più su Terraform, consulta la google_container_node_pool specifica della risorsa su terraform.io.

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, creerai due job Kubernetes che richiedono una GPU ciascuno. Un controller Job in Kubernetes crea uno o più pod e contribuisce a garantire 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. Una sessione si apre nel riquadro inferiore della Google Cloud console.

  2. 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"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          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"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          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
    
  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 "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>
    

Libera spazio

Per evitare che al tuo Google Cloud account 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. Nella Google Cloud console, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.

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