Esegui un piccolo workload batch con GPU e modalità di provisioning con avvio flessibile


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

  1. 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 a gcloud 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.

  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.

Terraform

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

  1. 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.

  1. Nella Google 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 Google Cloud .

  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"
          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
    
  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>
    

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

  1. In the Google 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