GPUs mit mehreren Instanzen ausführen


Auf dieser Seite finden Sie eine Anleitung zum Partitionieren von NVIDIA® A100-Grafikprozessoren (GPU) zur gemeinsamen Nutzung einer einzelnen GPU in mehreren Containern in Google Kubernetes Engine (GKE).

Auf dieser Seite wird davon ausgegangen, dass Sie mit Kubernetes-Konzepten wie Pods, Knoten, Deployments und Namespaces sowie mit GKE-Konzepten wie Knotenpools, Autoscaling und automatische Nutzerverwaltung vertraut sind.

Einführung

Kubernetes weist pro Container eine vollständige GPU zu, auch wenn der Container nur einen Bruchteil der GPU für seine Arbeitslast benötigt. Dadurch kann es zur Verschwendung von Ressourcen und zu höheren Kosten kommen, insbesondere wenn Sie die neueste Generation leistungsstarker GPUs verwenden. Zur Verbesserung der GPU-Auslastung bieten GPUs mit mehreren Instanzen die Möglichkeit, eine einzelne NVIDIA A100-GPU in bis zu sieben Segmente zu partitionieren. Jedes Slice kann jeweils einem Container auf dem Knoten zugewiesen werden, für maximal sieben Container pro NVIDIA A100-GPU. GPUs mit mehreren Instanzen bieten Hardwareisolation zwischen den Arbeitslasten sowie konsistente und vorhersehbare Dienstqualität für alle Container, die auf der GPU ausgeführt werden.

Bei CUDA®-Anwendungen sind GPUs mit mehreren Instanzen weitgehend transparent. Jede GPU-Partition wird als reguläre GPU-Ressource angezeigt und das Programmiermodell bleibt unverändert.

Weitere Informationen zu GPUs mit mehreren Instanzen finden Sie im NVIDIA-Nutzerhandbuch für GPUs mit mehreren Instanzen.

GPU-Partitionen mit mehreren Instanzen

Die A100-GPU besteht aus sieben Recheneinheiten und acht Speichereinheiten, die in GPU-Instanzen unterschiedlicher Größe partitioniert werden können. Die GPU-Partitionsgrößen verwenden die folgende Syntax: [compute]g.[memory]gb. Zum Beispiel bezieht sich eine GPU-Partitionsgröße von 1g.5gb auf eine GPU-Instanz mit einer Recheneinheit (ein Siebtel der Streaming-Multiprozessoren auf der GPU) und einer Speichereinheit (5 GB). Die Partitionsgröße für A100-GPUs kann beim Erstellen eines Clusters angegeben werden. Ein Beispiel finden Sie im Abschnitt Cluster mit aktivierten GPUs mit mehreren Instanzen erstellen.

In der Partitionierungstabelle im NVIDIA-Nutzerhandbuch für GPUs mit mehreren Instanzen werden alle verschiedenen GPU-Partitionsgrößen sowie die Anzahl der auf jeder GPU-Partition verfügbaren Rechen- und Speicherressourcen aufgelistet. Die Tabelle zeigt auch die Anzahl der GPU-Instanzen für jede Partitionsgröße, die auf der A100-GPU erstellt werden kann.

In der folgenden Tabelle sind die von GKE unterstützten Partitionsgrößen aufgeführt:

Partitionsgröße GPU-Instanzen Recheneinheiten pro Instanz Speichereinheiten pro Instanz
1g.5gb 7 1 1
2g.10gb 3 2 2
3g.20gb 2 3 4
7g.40gb 1 7 8

Jede GPU auf jedem Knoten innerhalb eines Knotenpools wird auf dieselbe Weise partitioniert. Betrachten Sie beispielsweise einen Knotenpool mit zwei Knoten, vier GPUs auf jedem Knoten und einer Partitionsgröße von 1g.5gb. GKE erstellt sieben Partitionen der Größe 1g.5gb auf jeder GPU. Da pro Knoten vier GPUs vorhanden sind, sind auf jedem Knoten 28 1g.5gb-GPU-Partitionen verfügbar. Da der Knotenpool zwei Knoten enthält, sind im gesamten Knotenpool insgesamt 56 1g.5gb-GPU-Partitionen verfügbar.

Sie müssen mehrere Knotenpools erstellen, um einen GKE-Cluster mit unterschiedlichen GPU-Partitionen zu erstellen. Wenn Sie z. B. Knoten mit den GPU-Partitionen 1g.5gb und 3g.20gb in einem Cluster verwenden möchten, müssen Sie zwei Knotenpools erstellen, einen mit der GPU-Partitionsgröße 1g.5gb und einen mit 3g.20gb.

Jeder Knoten wird mit der Größe der auf dem Knoten verfügbaren GPU-Partitionen gekennzeichnet. Dank dieser Kennzeichnung können Arbeitslasten auf Knoten mit der erforderlichen GPU-Partitionsgröße ausgerichtet werden. Auf einem Knoten mit 1g.5gb-GPU-Instanzen wird der Knoten beispielsweise so gekennzeichnet:

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

So gehts:

Führen Sie die folgenden Aufgaben aus, um GPUs mit mehreren Instanzen zu verwenden:

  1. Cluster mit aktivierten GPUs mit mehreren Instanzen erstellen
  2. Treiber installieren und GPU-Partitionen konfigurieren.
  3. Anzahl der GPU-Ressourcen auf dem Knoten prüfen.
  4. Container auf dem Knoten bereitstellen.

Preise

GPUs mit mehreren Instanzen sind ausschließlich für A100-GPUs verfügbar und unterliegen zusätzlich zu den anderen Produkten, die zum Ausführen Ihrer Arbeitslasten verwendet werden, den A100-GPU-Preisen. Sie können nur ganze A100-GPUs zur Partitionierung an Knoten in Ihrem Cluster anhängen. Informationen zu GPU-Preisen finden Sie auf der Seite GPU-Preise.

Beschränkungen

  • Die Verwendung von GPU-Partitionen mit mehreren Instanzen mit GKE wird für nicht vertrauenswürdige Arbeitslasten nicht empfohlen.
  • Autoscaling und die automatische Nutzerverwaltung von GPU-Partitionen wird bei GKE-Version 1.20.7-gke.400 oder höher vollständig unterstützt. In früheren Versionen können nur Knotenpools mit mindestens einem Knoten automatisch bedarfsabhängig für bestimmte GPU-Partitionsgrößen von Arbeitslasten skaliert werden.
  • GPU-Auslastungsmesswerte (z. B. duty_cycle) sind für GPU-Instanzen nicht verfügbar.

Hinweis

Führen Sie die folgenden Aufgaben aus, bevor Sie beginnen:

Mit den folgenden Methoden können Sie die gcloud-Einstellungen festlegen:

  • Verwenden Sie gcloud init, wenn Sie die Standardeinstellungen ansehen möchten.
  • Verwenden Sie gcloud config, um Ihre Projekt-ID, Zone und Region individuell festzulegen.

gcloud init verwenden

Wenn Sie die Fehlermeldung One of [--zone, --region] must be supplied: Please specify location erhalten, führen Sie diesen Abschnitt aus.

  1. Führen Sie gcloud init aus und folgen Sie der Anleitung:

    gcloud init

    Wenn Sie SSH auf einem Remote-Server verwenden, können Sie mit dem Flag --console-only verhindern, dass mit dem Befehl ein Browserfenster geöffnet wird:

    gcloud init --console-only
  2. Folgen Sie der Anleitung, um gcloud zur Verwendung Ihres Google Cloud-Kontos zu autorisieren.
  3. Erstellen Sie eine neue Konfiguration oder wählen Sie eine vorhandene aus.
  4. Wählen Sie ein Google Cloud-Projekt aus.
  5. Wählen Sie eine Compute Engine-Standardzone für zonale Cluster oder eine Region für regionale oder Autopilot-Cluster aus.

gcloud config verwenden

  • Legen Sie Ihre standardmäßige Projekt-ID fest:
    gcloud config set project PROJECT_ID
  • Wenn Sie mit zonalen Clustern arbeiten, legen Sie die Standardzone für Compute Engine fest:
    gcloud config set compute/zone COMPUTE_ZONE
  • Wenn Sie mit Autopilot oder regionalen Clustern arbeiten, legen Sie die Compute-Standardregion fest:
    gcloud config set compute/region COMPUTE_REGION
  • Aktualisieren Sie gcloud auf die neueste Version:
    gcloud components update
  • GPUs mit mehreren Instanzen werden in der GKE-Version 1.19.7-gke.2503 oder höher unterstützt.
  • Sie müssen ein ausreichendes NVIDIA A100-GPU-Kontingent haben. Weitere Informationen finden Sie unter Höheres Kontingent anfordern.

Cluster mit aktivierten GPUs mit mehreren Instanzen erstellen

Wenn Sie einen Cluster mit GPUs mit mehreren Instanzen erstellen, müssen Sie gpuPartitionSize zusammen mit acceleratorType und acceleratorCount angeben. Da GPUs mit mehreren Instanzen nur auf A100-GPUs unterstützt werden, muss acceleratorType auf nvidia-tesla-a100 eingestellt sein.

Das folgende Beispiel zeigt, wie Sie einen GKE-Cluster mit einem Knoten und sieben GPU-Partitionen der Größe 1g.5gb auf dem Knoten erstellen. In den anderen Schritten dieser Seite wird eine GPU-Partitionsgröße von 1g.5gb verwendet, die sieben Partitionen pro GPU erstellt. Sie können auch die zuvor erwähnten unterstützten Größen von GPU-Partitionen verwenden.

  1. Führen Sie den folgenden Befehl aus, um mit dem gcloud-Befehlszeilentool einen Cluster mit GPUs mit mehreren Instanzen zu erstellen:

    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  \
        --machine-type=a2-highgpu-1g  \
        --num-nodes=1
    

    Dabei gilt:

    • CLUSTER_NAME: Der Name des neuen Clusters.
    • PROJECT_ID ist die ID Ihres Google Cloud-Projekts.
    • ZONE: Die Computing-Zone für die Clustersteuerungsebene.
    • CLUSTER_VERSION: Die Version muss 1.19.7-gke.2503 oder höher sein.
  2. Konfigurieren Sie kubectl, um eine Verbindung zum neu erstellten Cluster herzustellen:

    gcloud container clusters get-credentials CLUSTER_NAME
    

    Hier sehen Sie die Ausgabe des Befehls get-credentials:

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for CLUSTER_NAME.
    

Treiber installieren und GPU-Partitionen konfigurieren

Nach dem Erstellen des Clusters müssen Sie das Geräte-Plug-in aktualisieren und die NVIDIA-Gerätetreiber auf den Knoten installieren.

  1. Aktualisieren Sie das Geräte-Plug-in, um die Erkennung von GPU-Instanzen zu aktivieren:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/cmd/nvidia_gpu/device-plugin.yaml
    
  2. Für mehrere Instanzen ist die NVIDIA-Treiberversion 450.80.02 oder höher erforderlich. Nachdem der Treiber installiert wurde, muss der GPU-Modus für mehrere Instanzen aktiviert werden, gefolgt von einem Neustart des Knotens, damit die Änderungen wirksam werden. Wenn sich die GPUs im GPU-Modus für mehrere Instanzen befinden, müssen die erforderlichen GPU-Partitionen erstellt werden.

    Führen Sie den folgenden DaemonSet-Befehl aus, um alle diese Aktionen auszuführen:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-nvidia-mig.yaml
    

    Bei dieser Aufgabe wird der Knoten neu gestartet, um den GPU-Modus für mehrere Instanzen zu aktivieren. Dies kann einige Minuten dauern.

Anzahl der GPU-Ressourcen auf dem Knoten prüfen

Führen Sie den folgenden Befehl aus, um zu prüfen, ob die Kapazität und die zuweisbare Anzahl von nvidia.com/gpu-Ressourcen den Wert 7 haben:

kubectl describe nodes

Hier sehen Sie die Ausgabe des Befehls:

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

Container auf dem Knoten bereitstellen

Sie können bis zu einen Container pro GPU-Gerät mit mehreren Instanzen auf dem Knoten bereitstellen. In diesem Beispiel mit der Partitionsgröße 1g.5gb sind auf dem Knoten sieben GPU-Partitionen mit mehreren Instanzen verfügbar. Daher können Sie bis zu sieben Container bereitstellen, die GPUs auf diesem Knoten anfordern.

  1. Im folgenden Beispiel wird der Container cuda:11.0-base gestartet und nvidia-smi ausgeführt, um die UUID der GPU im Container auszugeben. In diesem Beispiel gibt es sieben Container, die jeweils eine GPU-Partition erhalten. In diesem Beispiel wird der Knotenselektor auch auf Knoten mit 1g.5gb-GPU-Partitionen ausgerichtet.

    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-base
            command:
            - bash
            - -c
            - |
              /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
            resources:
              limits:
                nvidia.com/gpu: 1
    EOF
    
  2. Prüfen Sie, ob alle sieben Pods ausgeführt werden:

    kubectl get pods
    

    Hier sehen Sie die Ausgabe des Befehls:

    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. Rufen Sie die Logs mit der GPU-UUID anhand des Namens eines Pods aus dem vorherigen Befehl auf:

    kubectl logs cuda-simple-849c47f6f6-4twr2
    

    Hier sehen Sie die Ausgabe des Befehls:

    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)
    
  4. Wiederholen Sie diese Schritte für alle anderen Logs, die Sie aufrufen möchten:

    kubectl logs cuda-simple-849c47f6f6-8cjrb
    

    Hier sehen Sie die Ausgabe des Befehls:

    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/7/0)
    

Nächste Schritte