Esecuzione di GPU a più istanze


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

Prima di leggere questa pagina, assicurati di conoscere i concetti di Kubernetes come pod, nodi, deployment, e namespaces e di conoscere i concetti di GKE come pool di nodi, scalabilità automatica, e provisioning automatico.

Introduzione

Kubernetes alloca una GPU completa per contenitore anche se il contenitore necessita solo di una frazione della GPU per il proprio carico di lavoro, il che potrebbe comportare uno spreco di risorse e un aumento dei costi, soprattutto se utilizzi GPU potenti di ultima generazione. Per migliorare l'utilizzo della GPU, le GPU multi-istanza ti consentono di suddividere una singola GPU supportata in fino a sette slice. Ogni slice può essere allocato a un container sul nodo in modo indipendente, per un massimo di sette container per GPU. Le GPU a più istanze forniscono isolamento hardware tra i carichi di lavoro e QoS coerente e prevedibile per tutti i container in esecuzione sulla GPU.

Per le applicazioni CUDA®, le GPU a più istanze sono in gran parte trasparenti. Ogni partizione GPU viene visualizzata come una normale risorsa GPU e il modello di programmazione rimane invariato.

Per ulteriori informazioni sulle GPU a più istanze, consulta la guida dell'utente per le GPU a più istanze NVIDIA.

GPU supportate

I seguenti tipi di GPU supportano le GPU a più istanze:

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

Partizioni GPU a più istanze

Le GPU A100 e H100 sono costituite da sette unità di calcolo e otto unità di memoria, che possono essere suddivise in istanze GPU di dimensioni diverse. Le dimensioni della partizione della GPU utilizzano la seguente sintassi: [compute]g.[memory]gb. Ad esempio, una dimensione della partizione GPU di 1g.5gb si riferisce a un'istanza GPU con un'unità di calcolo (1/7 di multiprocessori in streaming sulla GPU) e un'unità di memoria (5 GB). La dimensione della partizione per le GPU può essere specificata quando esegui il deployment di un carico di lavoro Autopilot o quando crei un cluster standard.

La tabella di partizione nella guida dell'utente della GPU multi-istanza NVIDIA elenca tutte le diverse dimensioni delle partizioni GPU, nonché la quantità di risorse di calcolo e memoria disponibili su ogni partizione GPU. La tabella mostra anche il numero di istanze GPU per ogni dimensione della partizione che è possibile creare sulla GPU.

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

Dimensioni della 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 (80 GB) (nvidia-h100-80gb e nvidia-h100-mega-80gb)
1g.10gb 7
1g.20gb 4
2g.20gb 3
3g.40gb 2
7g.80gb 1

Ogni GPU su ogni nodo all'interno di un pool di nodi viene suddivisa nello stesso modo. Ad esempio, considera un pool di nodi con due nodi, quattro GPU su ogni nodo e una dimensione della partizione di 1g.5gb. GKE crea sette partizioni di dimensione1g.5gb su ogni GPU. Poiché su ogni nodo sono presenti quattro GPU, sono disponibili 28 1g.5gb partizioni GPU su ogni nodo. Poiché il pool di nodi contiene due nodi, nell'intero pool di nodi sono disponibili un totale di 56 partizioni GPU 1g.5gb.

Per creare un cluster GKE Standard con più di un tipo di partizione GPU, devi creare più pool di nodi. Ad esempio, se vuoi avere 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 su 3g.20gb.

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

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

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

Come funziona

Per utilizzare le GPU a più istanze, svolgi le seguenti attività:

  1. Crea un cluster con le GPU a più istanze abilitate.
  2. Installa manualmente i driver.
  3. Verifica quante risorse GPU sono presenti sul nodo.
  4. Esegui il deployment di container utilizzando GPU a più istanze.

Prezzi

Le GPU multi-istanza sono esclusive delle GPU A100 e H100 e sono soggette ai prezzi delle GPU corrispondenti, oltre a qualsiasi altro prodotto utilizzato per eseguire i tuoi carichi di lavoro. Per il partizionamento puoi collegare solo GPU intere ai nodi del cluster. Per informazioni sui prezzi delle GPU, consulta la pagina Prezzi delle GPU.

Limitazioni

  • L'utilizzo di partizioni GPU multi-istanza con GKE non è consigliato per i carichi di lavoro non attendibili.
  • Le partizioni GPU con scalabilità automatica e provisioning automatico sono completamente supportate su GKE versione 1.20.7-gke.400 o successive. Nelle versioni precedenti, solo i node pool con almeno un nodo potevano essere sottoposti a scalabilità automatica in base alla domanda di dimensioni specifiche delle partizioni GPU dei workload.
  • Le metriche di utilizzo della GPU (ad esempio duty_cycle) non sono disponibili per le GPU a più istanze.
  • La multi-istanza suddivide una GPU fisica in istanze distinte, ciascuna delle quali è isolata dalle altre a livello hardware. Un contenitore che utilizza un'istanza GPU multi-istanza può accedere solo alle risorse di CPU e memoria disponibili per quell'istanza.
  • Un pod può utilizzare fino a una sola istanza GPU a più istanze.

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à, installa e poi inizializza gcloud CLI. Se hai già installato gcloud CLI, ottieni la versione più recente eseguendo gcloud components update.
  • In Autopilot, le GPU multi-istanza sono supportate in GKE versione 1.29.3-gke.1093000 e successive.
  • Devi disporre di una quota GPU NVIDIA A100 sufficiente. Consulta la sezione Richiesta di un aumento di quota.
  • Se vuoi utilizzare le GPU multi-istanza con Autopilot, puoi scoprire di più sull'utilizzo delle GPU con Autopilot nella pagina Eseguire il deployment dei carichi di lavoro GPU in Autopilot.
  • GKE assegna la classe di calcolo Accelerator a tutti i carichi di lavoro GPU multi-istanza nei cluster Autopilot.

Crea un cluster con GPU a più istanze abilitate

Se utilizzi GKE Standard, devi attivare le GPU con più istanze nel cluster. I cluster Autopilot che eseguono la versione 1.29.3-gke.1093000 e successive attivano le GPU a più istanze per impostazione predefinita. Per utilizzare le GPU a più istanze in Autopilot, consulta la sezione Eseguire il deployment di container utilizzando GPU a più istanze di questa pagina.

Quando crei un cluster standard con GPU a più istanze, devi specificare gpuPartitionSize insieme a acceleratorType e acceleratorCount. acceleratorType deve essere nvidia-tesla-a100, nvidia-a100-80gb o nvidia-h100-80gb.

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

Puoi utilizzare Google Cloud CLI o Terraform.

gcloud

Crea un cluster con GPU a più istanze 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 calcolo 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 da installare. Può essere uno dei seguenti:
    • default: installa la versione predefinita del driver per la tua versione GKE.
    • latest: installa la versione più recente del driver disponibile per la tua versione GKE. Disponibile solo per i nodi che utilizzano Container-Optimized OS.
    • disabled: salta l'installazione automatica del driver. Devi installare manualmente un driver dopo aver creato il cluster. Se ometti gpu-driver-version, questa è l'opzione predefinita.

Terraform

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

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 scoprire di più sull'utilizzo di Terraform, consulta Assistenza di Terraform per GKE.

Connettiti al cluster

Configura kubectl per connetterti al cluster appena creato:

gcloud container clusters get-credentials CLUSTER_NAME

Installa i driver

Se hai scelto di disattivare l'installazione automatica dei driver durante la creazione del cluster o se utilizzi una versione di GKE precedente alla 1.27.2-gke.1200, devi installare manualmente un driver NVIDIA compatibile al termine della creazione. Le GPU multi-istanza richiedono un driver NVIDIA versione 450.80.02 o successiva.

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

Verifica quante risorse GPU sono presenti sul nodo

Esegui il seguente comando per verificare che la capacità e il numero allocatile delle risorse nvidia.com/gpu siano pari a 7:

kubectl describe nodes

Ecco l'output del comando:

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

Esegui il deployment di container utilizzando GPU a più istanze

Sul nodo puoi eseguire il deployment di un solo container per dispositivo GPU multi-istanza. In questo esempio, con una dimensione della partizione pari a 1g.5gb, sono disponibili sette partizioni GPU multi-istanza sul nodo. Di conseguenza, puoi eseguire il deployment di un massimo di sette contenuti 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 esempio, ci sono sette contenitori e ogni contenitore riceve una partizione GPU. Questo esempio imposta anche il selettore dei cloud.google.com/gke-gpu-partition-size nodi in modo che abbia come target i nodi con partizioni GPU 1g.5gb.

    Autopilot

          cat &lt&ltEOF | 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 manifest esegue le seguenti operazioni:

    • Richiede il tipo di GPU nvidia-tesla-a100 impostando il selettore di nodi cloud.google.com/gke-accelerator.
    • Suddivide la GPU in partizioni di dimensioni 1g.5gb.
    • Collega una singola GPU al nodo impostando il selettore di nodi cloud.google.com/gke-accelerator-count.

    Standard

          cat &lt&ltEOF | 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 manifest esegue le seguenti operazioni:

    • Richiede una singola GPU con dimensioni 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 della 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