Esecuzione di GPU a più istanze


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

Questa pagina presuppone che tu abbia familiarità con i concetti di base di Kubernetes come pod, nodi, deployment e spazi dei nomi e che abbia familiarità con concetti di GKE come pool di nodi, scalabilità automatica e 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 comportare sprechi di risorse e superamento dei costi, soprattutto se utilizzi l'ultima generazione di GPU potenti. Per migliorare l'utilizzo della GPU, le GPU multi-istanza consentono di partizionare 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 l'isolamento hardware tra i carichi di lavoro e una qualità del servizio (QoS) coerente e prevedibile per tutti i container in esecuzione sulla GPU.

Per le applicazioni CUDA®, le GPU multi-istanza sono ampiamente trasparenti. Ogni partizione GPU viene visualizzata 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 le GPU multi-istanza:

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

Partizioni GPU multi-istanza

Le GPU A100 e 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 di 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 multi-istanza NVIDIA elenca tutte le diverse dimensioni di partizione GPU, insieme alla quantità di risorse di calcolo e di memoria disponibili per ogni partizione GPU. La tabella mostra anche il numero di istanze GPU per ogni dimensione partizione che è possibile creare nella GPU.

La tabella seguente 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 nello stesso modo. Ad esempio, considera un pool di nodi con due nodi, quattro GPU su ciascun nodo e una partizione con dimensione 1g.5gb. GKE crea sette partizioni di dimensione 1g.5gb su ogni GPU. Poiché sono presenti quattro GPU su ciascun nodo, saranno disponibili 28 1g.5gb partizioni GPU su ogni nodo. Poiché il pool di nodi contiene due nodi, sono disponibili un totale di 56 partizioni GPU 1g.5gb nell'intero pool di nodi.

Per creare un cluster GKE Standard con più di un tipo di 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 delle partizioni corretta quando crei carichi di lavoro che richiedono dimensioni delle partizioni diverse.

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 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 delle GPU A100 e delle GPU H100 e sono soggette ai prezzi per le GPU corrispondenti, oltre che a qualsiasi altro prodotto utilizzato per eseguire i carichi di lavoro. Per il partizionamento, puoi collegare solo intera GPU ai nodi nel tuo 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 carichi di lavoro non attendibili.
  • La scalabilità automatica e il provisioning automatico delle partizioni GPU sono completamente supportate su GKE versione 1.20.7-gke.400 o successive. Nelle versioni precedenti, è possibile scalare automaticamente solo i pool di nodi con almeno un nodo in base alla domanda di dimensioni di partizioni GPU specifiche dei carichi di lavoro.
  • Le metriche di utilizzo della GPU (ad esempio duty_cycle) non sono disponibili per le istanze GPU.
  • La 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 multi-istanza può accedere solo alle risorse di CPU e memoria disponibili per l'istanza.
  • Un pod può consumare fino a 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 initialize gcloud CLI. Se hai già installato gcloud CLI, scarica 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 Richiedere un aumento della quota.
  • Se vuoi utilizzare GPU multi-istanza con Autopilot, scopri 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 computing Accelerator a tutti i carichi di lavoro GPU multi-istanza nei cluster Autopilot.

Crea un cluster con GPU multi-istanza abilitate

Se utilizzi GKE Standard, devi abilitare GPU multi-istanza nel cluster. I cluster Autopilot che eseguono la versione 1.29.3-gke.1093000 e successive abilitano le GPU multi-istanza 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 dimensione 1g.5gb sul nodo. Gli altri passaggi in questa pagina utilizzano una dimensione della partizione GPU pari a 1g.5gb, che crea sette partizioni su ogni GPU. Puoi anche utilizzare una qualsiasi delle dimensioni di partizione GPU supportate menzionate in precedenza.

  1. Per creare un cluster con GPU multi-istanza abilitate utilizzando Google Cloud CLI, esegui questo comando:

    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 predefinita del driver per la tua versione di GKE.
      • latest: installa la versione più recente del driver disponibile per la tua versione di 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.
  2. 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 versione 450.80.02 o successiva.

Una volta installato il driver, verrà attivata la modalità GPU multi-istanza. Se hai installato automaticamente i driver, i nodi si riavvieranno quando il plug-in del dispositivo GPU viene avviato per creare partizioni GPU. Se hai installato i driver manualmente, 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 il numero di risorse allocabili e di capacità di nvidia.com/gpu sia pari a 7:

kubectl describe nodes

Ecco l'output del comando:

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

Deployment dei container utilizzando GPU multi-istanza

Puoi eseguire il deployment di un massimo di container per dispositivo GPU multi-istanza sul nodo. 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 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, ci sono sette container e ogni container riceve una partizione GPU. Questo esempio imposta anche il selettore di nodi cloud.google.com/gke-gpu-partition-size per scegliere come target i nodi con partizioni GPU 1g.5gb.

    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
          

    Il file manifest svolge le seguenti operazioni:

    • Consente di richiedere il tipo di GPU nvidia-tesla-a100 impostando il selettore di nodi cloud.google.com/gke-accelerator.
    • Suddivide la GPU nella dimensione 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
          

    Il file manifest svolge le seguenti operazioni:

    • Richiede 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 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