Esecuzione di GPU a più istanze


Questa pagina fornisce istruzioni su come aumentare l'utilizzo e e ridurre i costi eseguendo GPU multi-istanza. Con questa configurazione, esegui il partizionamento di una scheda grafica NVIDIA A100 o H100 di un'unità di elaborazione (GPU) per condividere una singola GPU in più container Google Kubernetes Engine (GKE).

In questa pagina si presuppone che tu abbia familiarità con i concetti di base di Kubernetes, ad esempio: Pod, nodi, deployment, e spazi dei nomi e hanno familiarità con i concetti di base di GKE come i pool di nodi, scalabilità automatica, e provisioning automatico.

Introduzione

Kubernetes alloca una GPU completa per container anche se il container necessita di una frazione della GPU per il proprio carico di lavoro, il che potrebbe portare a uno spreco di risorse e il superamento dei costi, soprattutto se utilizzate di GPU potenti. Per migliorare l'utilizzo delle GPU, le GPU multi-istanza consentono di partizionare una singola GPU supportata in un massimo di sette sezioni. Ogni sezione può essere allocati a un container sul nodo in modo indipendente, per un massimo container per GPU. Le GPU multi-istanza forniscono isolamento tra i carichi di lavoro e QoS coerente e prevedibile per tutti di container in esecuzione sulla GPU.

Per CUDA® nelle applicazioni, le GPU multi-istanza sono ampiamente trasparenti. Ogni partizione GPU viene visualizzato come una normale risorsa GPU e il modello di programmazione rimane invariato.

Per ulteriori informazioni sulle GPU multi-istanza, consulta la guida dell'utente per le GPU multi-istanza di NVIDIA.

GPU supportate

I seguenti tipi di GPU supportano GPU multi-istanza:

  • NVIDIA A100 (40GB)
  • NVIDIA A100 (80GB)
  • NVIDIA H100 (80GB)

Partizioni GPU multiistanza

La GPU A100 e la GPU H100 sono composte da sette unità di calcolo e otto unità di memoria, partizionate in istanze GPU di varie dimensioni. Le dimensioni delle partizioni GPU utilizzano la seguente sintassi: [compute]g.[memory]gb. Ad esempio, una partizione GPU la dimensione 1g.5gb si riferisce a un'istanza GPU con una unità di calcolo (1/7 del multiprocessore in streaming sulla GPU) e un'unità di memoria (5 GB). La per le GPU possono essere specificate durante il deployment carico di lavoro o quando crei un cluster Standard.

La tabella di partizionamento nella guida dell'utente per le GPU multi-istanza NVIDIA elenca tutte le diverse GPU delle partizioni, insieme alla quantità di risorse di calcolo e di memoria disponibili su ogni partizione GPU. La tabella mostra anche il numero di istanze GPU per ogni delle partizioni che possono essere create sulla GPU.

La seguente tabella elenca le dimensioni delle partizioni supportate da GKE:

Dimensione partizione Istanze GPU
GPU: NVIDIA A100 (40GB) (nvidia-tesla-a100)
1g.5gb 7
2g.10gb 3
3g.20gb 2
7g.40gb 1
GPU: NVIDIA A100 (80GB) (nvidia-a100-80gb)
1g.10gb 7
2g.20gb 3
3g.40gb 2
7g.80gb 1
GPU: NVIDIA H100 (80GB) (nvidia-h100-80gb)
1g.10gb 7
1g.20gb 4
2g.20gb 3
3g.40gb 2
7g.80gb 1

Ogni GPU su ciascun nodo all'interno di un pool di nodi è partizionata allo stesso modo. Per Ad esempio, consideriamo un pool di nodi con due nodi, quattro GPU su ciascun nodo e dimensione della partizione 1g.5gb. GKE crea sette partizioni di dimensioni 1g.5gb su ogni GPU. Poiché su ciascun nodo ci sono quattro GPU, sono disponibili 28 1g.5gb partizioni GPU disponibili su ciascun nodo. Poiché ci sono due nodi pool di nodi, sono disponibili un totale di 56 1g.5gb partizioni GPU nell'intero pool pool di nodi.

Per creare un cluster GKE Standard con più tipi della partizione GPU, devi creare più pool di nodi. Ad esempio, se vuoi nodi con partizioni GPU 1g.5gb e 3g.20gb in un cluster, devi creare due pool di nodi: uno con la dimensione della partizione GPU impostata su 1g.5gb e l'altro con 3g.20gb.

Un cluster GKE Autopilot crea automaticamente nodi con la configurazione di partizione corretta quando crei carichi di lavoro che richiedono diverse dimensioni della partizione.

Ogni nodo è etichettato con la dimensione delle partizioni GPU disponibili nodo. Questa etichettatura consente ai carichi di lavoro di scegliere come target i nodi con la GPU necessaria dimensioni della partizione. Ad esempio, su un nodo con 1g.5gb istanze GPU, il nodo viene etichettato come:

cloud.google.com/gke-gpu-partition-size=1g.5gb

Come funziona

Per utilizzare GPU multi-istanza, devi eseguire le seguenti attività:

  1. Crea un cluster con GPU multi-istanza abilitate.
  2. Installa manualmente i driver.
  3. Verifica quante risorse GPU sono presenti sul nodo.
  4. Esegui il deployment dei container utilizzando GPU multi-istanza.

Prezzi

Le GPU multi-istanza sono esclusive per le GPU A100 e H100 e sono soggette a i prezzi delle GPU corrispondenti oltre a qualsiasi altro prodotto usato per eseguire i tuoi carichi di lavoro. Puoi allegare solo intere GPU in nodi nel cluster per il partizionamento. Per i prezzi delle GPU informazioni, consulta la pagina sui prezzi delle GPU.

Limitazioni

  • L'utilizzo di partizioni GPU multi-istanza con GKE consigliata per carichi di lavoro non attendibili.
  • La scalabilità automatica e il provisioning automatico delle partizioni GPU sono completamente supportate GKE versione 1.20.7-gke.400 o successiva. Solo nelle versioni precedenti i pool di nodi con almeno un nodo possono essere scalati automaticamente in base alla domanda per specifiche di dimensioni delle partizioni GPU da carichi di lavoro.
  • Le metriche di utilizzo della GPU (ad esempio duty_cycle) non sono disponibili per le GPU a più istanze.
  • L'istanza multi-istanza suddivide una GPU fisica in istanze discrete, ciascuna delle quali è isolata dalle altre a livello di hardware. Un container che utilizza un oggetto un'istanza GPU a più istanze può accedere solo alle risorse di CPU e memoria disponibili a quell'istanza.
  • Un pod può utilizzare al massimo un'istanza GPU multi-istanza.

Prima di iniziare

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

  • Attiva l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, install e poi inizializzare con gcloud CLI. Se hai già installato gcloud CLI, scarica la versione più recente eseguendo gcloud components update.
  • In Autopilot, sono supportate GPU multi-istanza in GKE versione 1.29.3-gke.1093000 e successive.
  • Devi avere una quota GPU NVIDIA A100 sufficiente. Consulta Richiesta di aumento della quota.
  • Se vuoi usare GPU multi-istanza con Autopilot, puoi scoprire sull'uso delle GPU con Autopilot Esegui il deployment dei carichi di lavoro GPU in Autopilot.
  • GKE assegna la classe di computing Accelerator a tutte le istanze multi-istanza Carichi di lavoro GPU nei cluster Autopilot.

Crea un cluster con GPU multiistanza abilitate

Se utilizzi GKE Standard, devi abilitare l'istanza multi-istanza GPU nel cluster. Cluster Autopilot che eseguono la versione 1.29.3-gke.1093000 e abilitare GPU multiistanza per impostazione predefinita. Per utilizzare GPU multi-istanza Autopilot, in questo documento, consulta Eseguire il deployment dei container utilizzando GPU multi-istanza .

Quando crei un cluster Standard con GPU multi-istanza, devi specificare gpuPartitionSize insieme a acceleratorType e acceleratorCount. La acceleratorType deve essere nvidia-tesla-a100, nvidia-a100-80gb o nvidia-h100-80gb.

L'esempio seguente mostra come creare un cluster GKE con uno e sette partizioni GPU di dimensioni 1g.5gb sul nodo. Gli altri passaggi questa pagina utilizza una dimensione della partizione GPU di 1g.5gb, che crea sette partizioni su ciascuna GPU. Puoi anche utilizzare una qualsiasi delle dimensioni delle partizioni GPU supportate menzionate in precedenza.

Puoi usare Google Cloud CLI o Terraform.

gcloud

Crea un cluster con GPU multi-istanza abilitate:

gcloud container clusters create CLUSTER_NAME  \
    --project=PROJECT_ID  \
    --zone ZONE  \
    --cluster-version=CLUSTER_VERSION  \
    --accelerator type=nvidia-tesla-a100,count=1,gpu-partition-size=1g.5gb,gpu-driver-version=DRIVER_VERSION  \
    --machine-type=a2-highgpu-1g  \
    --num-nodes=1

Sostituisci quanto segue:

  • CLUSTER_NAME: il nome del nuovo cluster.
  • PROJECT_ID: l'ID del tuo progetto Google Cloud.
  • ZONE: la zona di computing per il piano di controllo del cluster.
  • CLUSTER_VERSION: la versione deve essere 1.19.7-gke.2503 o successiva.
  • DRIVER_VERSION: la versione del driver NVIDIA per installare l'app. Può essere uno dei seguenti:
    • default: installa la versione del driver predefinita per GKE completamente gestita.
    • latest: installa l'ultima versione del driver disponibile per GKE completamente gestita. Disponibile solo per i nodi che utilizzano Container-Optimized OS.
    • disabled: salta l'installazione automatica del driver. Devi installare manualmente un driver dopo la creazione nel cluster. Se ometti gpu-driver-version, questa è l'opzione predefinita.

Terraform

Per creare un cluster con GPU multi-istanza abilitate utilizzando Terraform, consulta al seguente esempio:

resource "google_container_cluster" "default" {
  name               = "gke-standard-zonal-gpu"
  location           = "us-central1-a"
  initial_node_count = 1

  node_config {
    guest_accelerator {
      type  = "nvidia-tesla-t4"
      count = 1
      gpu_driver_installation_config {
        gpu_driver_version = "LATEST"
      }
    }
    machine_type = "n1-standard-2"
  }

  # Set `deletion_protection` to `true` will ensure that one cannot
  # accidentally delete this instance by use of Terraform.
  deletion_protection = false
}

Per saperne di più sull'utilizzo di Terraform, consulta Supporto Terraform per GKE.

Connettiti al cluster

Configura kubectl per la connessione al cluster appena creato:

gcloud container clusters get-credentials CLUSTER_NAME

Installa driver

Se hai scelto di disabilitare l'installazione automatica dei driver durante la creazione del cluster, o se esegui una versione di GKE precedente alla 1.27.2-gke.1200, devi installare manualmente un driver NVIDIA compatibile al termine della creazione. Le GPU a più istanze richiedono una versione del driver NVIDIA 450.80.02 o versioni successive.

Una volta installato il driver, viene attivata la modalità GPU a più istanze. Se driver installati automaticamente, i nodi si riavviano quando il dispositivo GPU inizia a creare partizioni GPU. Se hai installato manualmente i driver, i nodi si riavviano al termine dell'installazione del driver. Il riavvio potrebbe richiedere alcuni minuti.

Verifica quante risorse GPU sono presenti sul nodo

Esegui questo comando per verificare che la capacità e il conteggio allocabile nvidia.com/gpu risorsa è 7:

kubectl describe nodes

Ecco l'output del comando:

...
Capacity:
  ...
  nvidia.com/gpu:             7
Allocatable:
  ...
  nvidia.com/gpu:             7

Esegui il deployment dei container utilizzando GPU multi-istanza

Puoi eseguire il deployment di massimo un container per dispositivo GPU con più istanze sul nodo. Nella in questo esempio, con una dimensione della partizione di 1g.5gb, sono presenti sette istanze Partizioni GPU disponibili sul nodo. Di conseguenza, puoi eseguire il deployment di container che richiedono GPU su questo nodo.

  1. Ecco un esempio che avvia il container cuda:11.0.3-base-ubi7 ed esegue nvidia-smi per stampare l'UUID della GPU all'interno del container. In questo Ad esempio, ci sono sette container, ognuno dei quali riceve una GPU della partizione di testo. Questo esempio imposta anche cloud.google.com/gke-gpu-partition-size selettore di nodi per scegliere come target i nodi con 1g.5gb partizioni GPU.

    Autopilot

          cat <<EOF | kubectl apply -f -
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: cuda-simple
          spec:
            replicas: 7
            selector:
              matchLabels:
                app: cuda-simple
            template:
              metadata:
                labels:
                  app: cuda-simple
              spec:
                nodeSelector:
                  cloud.google.com/gke-gpu-partition-size: 1g.5gb
                  cloud.google.com/gke-accelerator: nvidia-tesla-a100
                  cloud.google.com/gke-accelerator-count: "1"
                containers:
                - name: cuda-simple
                  image: nvidia/cuda:11.0.3-base-ubi7
                  command:
                  - bash
                  - -c
                  - |
                    /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                  resources:
                    limits:
                      nvidia.com/gpu: 1
          EOF
          

    Questo file manifest esegue le seguenti operazioni:

    • Richiedi il tipo di GPU nvidia-tesla-a100 impostando il valore Selettore di nodi cloud.google.com/gke-accelerator.
    • Suddivide la GPU nelle dimensioni della partizione 1g.5gb.
    • Collega una singola GPU al nodo impostando il parametro Selettore di nodi cloud.google.com/gke-accelerator-count.

    Standard

          cat <<EOF | kubectl apply -f -
          apiVersion: apps/v1
          kind: Deployment
          metadata:
            name: cuda-simple
          spec:
            replicas: 7
            selector:
              matchLabels:
                app: cuda-simple
            template:
              metadata:
                labels:
                  app: cuda-simple
              spec:
                nodeSelector:
                  cloud.google.com/gke-gpu-partition-size: 1g.5gb
                containers:
                - name: cuda-simple
                  image: nvidia/cuda:11.0.3-base-ubi7
                  command:
                  - bash
                  - -c
                  - |
                    /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
                  resources:
                    limits:
                      nvidia.com/gpu: 1
          EOF
          

    Questo file manifest esegue le seguenti operazioni:

    • Richiedi una singola GPU con dimensione della partizione 1g.5gb.
  2. Verifica che tutti e sette i pod siano in esecuzione:

    kubectl get pods
    

    Ecco l'output del comando:

    NAME                           READY   STATUS    RESTARTS   AGE
    cuda-simple-849c47f6f6-4twr2   1/1     Running   0          7s
    cuda-simple-849c47f6f6-8cjrb   1/1     Running   0          7s
    cuda-simple-849c47f6f6-cfp2s   1/1     Running   0          7s
    cuda-simple-849c47f6f6-dts6g   1/1     Running   0          7s
    cuda-simple-849c47f6f6-fk2bs   1/1     Running   0          7s
    cuda-simple-849c47f6f6-kcv52   1/1     Running   0          7s
    cuda-simple-849c47f6f6-pjljc   1/1     Running   0          7s
    
  3. Visualizza i log per vedere l'UUID GPU, utilizzando il nome di qualsiasi pod del comando precedente:

    kubectl logs cuda-simple-849c47f6f6-4twr2
    

    Ecco l'output del comando:

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/11/0)
    

Passaggi successivi