Esecuzione di GPU a più istanze


Questa pagina fornisce istruzioni su come eseguire il partizionamento di un'unità di elaborazione grafica (GPU) NVIDIA A100 o H100 per condividere una singola GPU in più container su Google Kubernetes Engine (GKE).

In questa pagina si presuppone che tu abbia familiarità con i concetti di Kubernetes come pod, nodi, deployment e spazi dei nomi e abbia familiarità con i concetti di GKE come i pool di nodi, la scalabilità automatica e il provisioning automatico.

Introduzione

Kubernetes alloca una GPU completa per container anche se il container ha bisogno solo di una frazione della GPU per il carico di lavoro, il che potrebbe portare a uno spreco di risorse e a un superamento dei costi, soprattutto se utilizzi GPU potenti di ultima generazione. Per migliorare l'utilizzo delle GPU, le GPU multi-istanza consentono di eseguire il partizionamento di una singola GPU supportata in un massimo di sette sezioni. Ogni sezione può essere allocata a un container sul nodo in modo indipendente, per un massimo di sette container per GPU. Le GPU multi-istanza 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 ampiamente trasparenti. Ogni partizione GPU appare 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, che possono essere partizionate in istanze GPU di varie dimensioni. Le dimensioni delle partizioni GPU utilizzano la seguente sintassi: [compute]g.[memory]gb. Ad esempio, una dimensione della partizione GPU 1g.5gb si riferisce a un'istanza GPU con un'unità di calcolo (1/7 dei 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 partizionamento nella guida dell'utente per le GPU a più istanze NVIDIA elenca tutte le diverse dimensioni di partizione GPU, 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 dimensione di partizione che può essere creata 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. Ad esempio, considera un pool di nodi con due nodi, quattro GPU su ciascun nodo e una dimensione di partizione pari a 1g.5gb. GKE crea sette partizioni di dimensioni 1g.5gb su ogni GPU. Poiché ci sono quattro GPU su ciascun nodo, sono disponibili 28 1g.5gb partizioni GPU su ciascun nodo. Poiché il pool di nodi contiene due nodi, nell'intero pool sono disponibili un totale di 56 partizioni GPU 1g.5gb.

Per creare un cluster GKE Standard con più tipi di partizioni GPU, devi creare più pool di nodi. Ad esempio, se vuoi che i 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 dimensioni di partizioni diverse.

A ogni nodo è assegnata un'etichetta con la dimensione delle partizioni GPU disponibili sul nodo. Questa etichettatura consente ai carichi di lavoro di scegliere come target nodi con le dimensioni di partizione GPU necessarie. Ad esempio, su un nodo con 1g.5gb istanze GPU, il nodo è 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 ai prezzi per le GPU corrispondenti, in aggiunta a qualsiasi altro prodotto utilizzato per eseguire i carichi di lavoro. Puoi collegare GPU intere ai nodi nel cluster solo per il partizionamento. Per informazioni sui prezzi delle GPU, consulta la pagina sui prezzi delle GPU.

Limitazioni

  • L'utilizzo di partizioni GPU multi-istanza con GKE non è consigliato per i carichi di lavoro non attendibili.
  • La scalabilità automatica e il provisioning automatico delle partizioni GPU sono completamente supportate in GKE versione 1.20.7-gke.400 o successive. Nelle versioni precedenti, solo i pool di nodi con almeno un nodo possono essere scalati automaticamente in base alla domanda di dimensioni di partizioni GPU specifiche dai 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'istanza GPU con più istanze può accedere solo alle risorse di CPU e memoria disponibili per 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à:

  • Abilita l'API Google Kubernetes Engine.
  • Abilita l'API Google Kubernetes Engine
  • Se vuoi utilizzare Google Cloud CLI per questa attività, installa e quindi initialize 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 1.29.3-gke.1093000 e versioni successive.
  • Devi avere una quota GPU NVIDIA A100 sufficiente. Consulta Richiesta di aumento della quota.
  • Se vuoi utilizzare GPU multi-istanza con Autopilot, puoi scoprire di più sull'utilizzo delle GPU con Autopilot in Eseguire il deployment dei carichi di lavoro GPU in Autopilot.
  • GKE assegna la classe di computing Accelerator a tutti i carichi di lavoro delle GPU multi-istanza nei cluster Autopilot.

Crea un cluster con GPU multiistanza abilitate

Se utilizzi GKE Standard, devi abilitare GPU a più istanze nel cluster. Autopilot che eseguono la versione 1.29.3-gke.1093000 e in seguito abilitano GPU multi-istanze per impostazione predefinita. Per utilizzare GPU multi-istanza in Autopilot, consulta la sezione Eseguire il deployment dei container utilizzando GPU multi-istanza in questo documento.

Quando crei un cluster Standard con GPU multi-istanza, 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 in questa pagina utilizzano una dimensione della partizione GPU di 1g.5gb, che crea sette partizioni su ogni 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 da installare. Può essere uno dei seguenti:
    • default: installa la versione del driver predefinita per la tua versione GKE.
    • latest: installa l'ultima versione 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, fai riferimento all'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 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 multi-istanza richiedono un driver NVIDIA 450.80.02 o successivo.

Una volta installato il driver, viene attivata la modalità GPU a più istanze. 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 questo comando per verificare che la capacità e il conteggio allocabile delle risorse nvidia.com/gpu sia 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. In questo esempio, con una dimensione della partizione pari a 1g.5gb, sul nodo sono disponibili sette partizioni GPU multi-istanza. Di conseguenza, puoi eseguire il deployment di massimo 7 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 esempio sono presenti sette container e ogni container riceve una partizione GPU. Questo esempio imposta anche il selettore di nodi cloud.google.com/gke-gpu-partition-size in modo che abbia 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 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 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