GPUs mit mehreren Arbeitslasten mithilfe der GPU-Zeitfreigabe freigeben


Auf dieser Seite wird beschrieben, wie Sie mehreren Arbeitslasten GPU-zeitgeteilt Zugriff auf einen einzelnen NVIDIA® GPU-Hardwarebeschleuniger in Ihren Google Kubernetes Engine-Knoten (GKE) gewähren. Weitere Informationen zur Funktionsweise der GPU-Zeitfreigabe sowie zu Einschränkungen und Beispielen für die Verwendung der GPU-Zeitfreigabe finden Sie unter GPU-Zeitfreigabe in GKE.

Überblick

Die GPU-Zeitfreigabe ist ein GKE-Feature, mit dem mehrere Container eine einzelne physische GPU, die an einen Knoten angehängt ist, gemeinsam nutzen können. Mit der GPU-Zeitfreigabe in GKE können Sie Ihre angehängten GPUs effizienter nutzen und Kosten sparen.

Zielgruppe dieses Leitfadens

Die Anleitung in diesem Leitfaden gilt für folgende Themen:

  • Plattformadministrator: Erstellt und verwaltet einen GKE-Cluster, plant Anforderungen für Infrastruktur und Ressourcen und überwacht die Leistung des Clusters.
  • Anwendungsentwickler: Entwirft Arbeitslasten in GKE-Clustern und stellt sie bereit. Eine Anleitung zum Anfordern der GPU-Zeitfreigabe finden Sie unter Arbeitslasten bereitstellen, die GPU-Zeitfreigabe verwenden.

Voraussetzungen

  • GKE-Version: Sie können die GPU-Zeitfreigabe auf GKE-Standardclustern aktivieren, auf denen GKE-Version 1.23.7-gke.1400 und höher ausgeführt wird. Sie können GPUs mit Zeitfreigabe in GKE Autopilot-Clustern verwenden, auf denen GKE Version 1.29.3-gke.1093000 und höher ausgeführt wird.
  • GPU-Typ: Sie können die GPU-Zeitfreigabe für alle NVIDIA-GPU-Modelle aktivieren.

Hinweise

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

  • Aktivieren Sie die Google Kubernetes Engine API.
  • Google Kubernetes Engine API aktivieren
  • Wenn Sie die Google Cloud CLI für diese Aufgabe verwenden möchten, müssen Sie die gcloud CLI installieren und dann initialisieren. Wenn Sie die gcloud CLI bereits installiert haben, rufen Sie die neueste Version mit gcloud components update ab.
  • Achten Sie darauf, dass Ihr Kontingent für NVIDIA-GPU-Modelle ausreicht. Informationen zum Anfordern eines höheren Kontingents finden Sie unter Höheres Kontingent anfordern.
  • Planen Sie die GPU-Kapazität anhand der Ressourcenanforderungen der Arbeitslasten und der Kapazität der zugrunde liegenden GPU.
  • Lesen Sie die Einschränkungen der GPU-Zeitfreigabe.

GPU-Zeitfreigabe für GKE-Cluster und -Knotenpools aktivieren

Als Plattformadministrator müssen Sie die Zeitfreigabe von GPUs in einem GKE-Standardcluster aktivieren, bevor Entwickler Arbeitslasten für die Verwendung der GPUs bereitstellen können. So aktivieren Sie die GPU-Zeitfreigabe:

  1. GPU-Zeitfreigabe in einem GKE-Cluster aktivieren
  2. NVIDIA-GPU-Gerätetreiber installieren (falls erforderlich)
  3. Prüfen Sie die GPU-Ressourcen, die auf Ihren Knoten verfügbar sind.

Autopilot-Cluster, auf denen Version 1.29.3-gke.1093000 oder höher ausgeführt wird, aktivieren standardmäßig GPUs mit Zeitfreigabe. Die Zeitfreigabe für Autopilot-Cluster wird in der Arbeitslastspezifikation konfiguriert. Weitere Informationen finden Sie im Abschnitt Arbeitslasten bereitstellen, die GPUs mit Zeitfreigabe verwenden.

GPU-Zeitfreigabe in einem GKE-Standardcluster aktivieren

Sie können die GPU-Zeitfreigabe aktivieren, wenn Sie GKE-Standardcluster erstellen. Diese Funktion ist im Standardknotenpool im Cluster aktiviert. Die GPU-Zeitfreigabe muss noch aktiviert werden, wenn Sie neue Knotenpools in diesem Cluster manuell erstellen.

gcloud container clusters create CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --cluster-version=CLUSTER_VERSION \
    --machine-type=MACHINE_TYPE \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

Ersetzen Sie Folgendes:

  • CLUSTER_NAME: Der Name des neuen Clusters.
  • COMPUTE_REGION: die Compute Engine-Region für den neuen Cluster Geben Sie für zonale Cluster --zone=COMPUTE_ZONE an.
  • CLUSTER_VERSION ist die GKE-Version für die Steuerungsebene und die Knoten des Clusters. Verwenden Sie die GKE-Version 1.23.7-gke.1400 oder höher. Alternativ können Sie mit dem Flag --release-channel=RELEASE_CHANNEL eine Release-Version mit dieser GKE-Version angeben.
  • MACHINE_TYPE ist der Compute Engine-Maschinentyp für Ihre Knoten. Wir empfehlen die Auswahl eines beschleunigungsoptimierten Maschinentyps.
  • GPU_TYPE ist der GPU-Typ, der eine NVIDIA-GPU-Plattform wie nvidia-tesla-v100 sein muss.
  • GPU_QUANTITY ist die Anzahl der physischen GPUs, die an jeden Knoten im Standardknotenpool angehängt werden.
  • CLIENTS_PER_GPU ist die maximale Anzahl von Containern, die jede physische GPU gemeinsam nutzen können.
  • DRIVER_VERSION: die zu installierende NVIDIA-Treiberversion. Kann eines der Folgenden sein:
    • default: Installieren Sie die Standardtreiberversion für Ihre GKE-Version.
    • latest: Installieren Sie die neueste verfügbare Treiberversion für Ihre GKE-Version. Nur für Knoten verfügbar, die Container-Optimized OS verwenden.
    • disabled: Automatische Treiberinstallation überspringen. Sie müssen einen Treiber manuell installieren, nachdem Sie den Knotenpool erstellt haben. Wenn Sie gpu-driver-version weglassen, ist dies die Standardoption.

GPU-Zeitfreigabe in einem GKE-Knotenpool aktivieren

Sie können die GPU-Zeitfreigabe aktivieren, wenn Sie neue Knotenpools in einem GKE-Cluster manuell erstellen.

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --region=COMPUTE_REGION \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

Ersetzen Sie Folgendes:

  • NODEPOOL_NAME ist der Name des neuen Knotenpools.
  • CLUSTER_NAME ist der Name Ihres Clusters, auf dem die GKE-Version 1.23.7-gke.1400 oder höher ausgeführt werden muss.
  • COMPUTE_REGION ist die Compute Engine-Region des Clusters. Geben Sie für zonale Cluster --zone=COMPUTE_ZONE an.
  • MACHINE_TYPE ist der Compute Engine-Maschinentyp für Ihre Knoten. Wir empfehlen die Auswahl eines beschleunigungsoptimierten Maschinentyps.
  • GPU_TYPE ist der GPU-Typ, der eine NVIDIA-GPU-Plattform wie nvidia-tesla-v100 sein muss.
  • GPU_QUANTITY ist die Anzahl der physischen GPUs, die an jeden Knoten im Knotenpool angehängt werden sollen.
  • CLIENTS_PER_GPU ist die maximale Anzahl von Containern, die jede physische GPU gemeinsam nutzen können.
  • DRIVER_VERSION: die zu installierende NVIDIA-Treiberversion. folgende Arten von Werten sind möglich:

    • default: Installieren Sie die Standardtreiberversion für Ihre GKE-Version.
    • latest: Installieren Sie die neueste verfügbare Treiberversion für Ihre GKE-Version. Nur für Knoten verfügbar, die Container-Optimized OS verwenden.
    • disabled: Automatische Treiberinstallation überspringen. Sie müssen einen Treiber manuell installieren, nachdem Sie den Knotenpool erstellt haben. Wenn Sie gpu-driver-version weglassen, ist dies die Standardoption.

NVIDIA-GPU-Gerätetreiber installieren

Bevor Sie fortfahren, stellen Sie mit folgendem Befehl eine Verbindung zu Ihrem Cluster her:

gcloud container clusters get-credentials CLUSTER_NAME

Wenn Sie bei der Erstellung des Clusters die automatische Treiberinstallation deaktiviert haben oder wenn Sie eine GKE-Version vor 1.27.2-gke.1200 verwenden, müssen Sie manuell einen kompatiblen NVIDIA-Treiber installieren, der die GPU-Zeitfreigabe der physischen GPUs verwaltet. Zum Installieren der Treiber stellen Sie ein GKE-Installations-DaemonSet bereit, das die Treiber einrichtet.

Eine Anleitung finden Sie unter NVIDIA-GPU-Gerätetreiber installieren.

Wenn Sie die automatische Knotenbereitstellung in Ihrem Cluster verwenden möchten, müssen Sie auch die automatische Knotenbereitstellung mit den Bereichen konfigurieren, in denen GKE die GPU-Gerätetreiber für Sie installieren kann. Eine Anleitung finden Sie unter Automatische Knotenbereitstellung mit GPUs verwenden.

Prüfen Sie die auf Ihren Knoten verfügbaren GPU-Ressourcen

Beschreiben Sie Ihre Knoten, wenn Sie überprüfen möchten, ob die Anzahl der in Ihren Knoten sichtbaren GPUs mit der Anzahl übereinstimmt, die Sie bei der Aktivierung der GPU-Zeitfreigabe angegeben haben:

kubectl describe nodes NODE_NAME

Die Ausgabe sieht in etwa so aus:

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

In dieser Beispielausgabe beträgt die Anzahl der GPU-Ressourcen auf dem Knoten 3, da der für max-shared-clients-per-gpu angegebene Wert 3 und der count der physischen GPUs war, die zum Knoten hinzugefügt wurde, 1 war. Ein weiteres Beispiel: Wenn der count der physischen GPUs 2 wäre, würde die Ausgabe 6 zuweisbare GPU-Ressourcen zeigen, drei pro jeder physischen GPU.

Arbeitslasten bereitstellen, die die GPU-Zeitfreigabe verwenden

Als Anwendungsoperator, der GPU-Arbeitslasten bereitstellt, können Sie die GPU-Zeitfreigabe aktiviert wählen. Geben Sie dazu die entsprechenden Knotenlabels in einer nodeSelector in Ihren Manifesten an. Überprüfen Sie bei der Planung Ihrer Anfragen die Anfragelimits, damit GKE Ihre Bereitstellungen nicht ablehnt.

Führen Sie die folgenden Schritte aus, um eine Arbeitslast für die Nutzung der GPU-Zeitfreigabe bereitzustellen:

  1. Fügen Sie dem Arbeitslastmanifest für die folgenden Labels einen nodeSelector hinzu:

    • cloud.google.com/gke-gpu-sharing-strategy: time-sharing wählt Knoten aus, die die GPU-Zeitfreigabe verwenden.
    • cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU" wählt Knoten aus, die einer bestimmten Anzahl von Containern die zugrunde liegende GPU gemeinsam nutzen können.
  2. Fügen Sie der Containerspezifikation in spec.containers.resources.limits die GPU-Ressourcenanfrage nvidia.com/gpu=1 hinzu.

In den folgenden Schritten wird beispielsweise gezeigt, wie Sie drei Pods in einem Knotenpool mit GPU-Zeitfreigabe bereitstellen. GKE weist jeden Container derselben physischen GPU zu. Die Container geben die UUID der GPU aus, die mit diesem Container verknüpft ist.

  1. Speichern Sie das folgende Manifest als gpu-timeshare.yaml:

Autopilot

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: cuda-simple
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: cuda-simple
          template:
            metadata:
              labels:
                app: cuda-simple
            spec:
              nodeSelector:
                cloud.google.com/gke-accelerator: "GPU_TYPE"
                cloud.google.com/gke-gpu-sharing-strategy: "time-sharing"
                cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
                cloud.google.com/gke-accelerator-count: "GPU_COUNT"
              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
      

Ersetzen Sie Folgendes:

  • GPU_TYPE: Der GPU-Typ.
  • CLIENTS_PER_GPU ist die Anzahl der Arbeitslasten, die diese GPU verwenden. Verwenden Sie für dieses Beispiel 3.
  • GPU_COUNT: die Anzahl der GPUs, die dem Knoten hinzugefügt werden sollen. Verwenden Sie für dieses Beispiel 1.

Standard

        apiVersion: apps/v1
        kind: Deployment
        metadata:
          name: cuda-simple
        spec:
          replicas: 3
          selector:
            matchLabels:
              app: cuda-simple
          template:
            metadata:
              labels:
                app: cuda-simple
            spec:
              nodeSelector:
                cloud.google.com/gke-gpu-sharing-strategy: "SHARING_STRATEGY"
                cloud.google.com/gke-max-shared-clients-per-gpu: "CLIENTS_PER_GPU"
              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
      

Ersetzen Sie Folgendes:

  • SHARING_STRATEGY durch "time-share", um eine Zeitfreigabe für Ihre GPU anzufordern.
  • CLIENTS_PER_GPU ist die Anzahl der Arbeitslasten, die diese GPU verwenden. Verwenden Sie für dieses Beispiel 3.
  1. Wenden Sie das Manifest an:

    kubectl apply -f gpu-timeshare.yaml
    
  2. Prüfen Sie, ob alle Pods ausgeführt werden:

    kubectl get pods -l=app=cuda-simple
    
  3. Prüfen Sie die Logs für jeden Pod, um die UUID der GPU aufzurufen:

    kubectl logs POD_NAME
    

    Die Ausgabe sieht in etwa so aus:

    GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
    
  4. Prüfen Sie die Logs für jeden anderen Pod auf demselben Knoten, um sicherzustellen, dass die GPU-UUID identisch ist, wenn an Ihre Knoten eine physische GPU angehängt ist:

    kubectl logs POD2_NAME
    

    Die Ausgabe sieht in etwa so aus:

    GPU 0: Tesla V100-SXM2-16GB (UUID: GPU-0771302b-eb3a-6756-7a23-0adcae8efd47)
    

GPU-Zeitfreigabe mit GPUs mit mehreren Instanzen verwenden

Als Plattformadministrator können Sie mehrere GKE-GPU-Features kombinieren. Die GPU-Zeitfreigabe funktioniert mit GPUs mit mehreren Instanzen, die eine einzelne physische GPU in bis zu sieben Segmente partitionieren. Diese Partitionen sind voneinander isoliert. Sie können die GPU-Zeitfreigabe für jede GPU-Partition mit mehreren Instanzen konfigurieren.

Wenn Sie beispielsweise gpu-partition-size auf 1g.5gb festlegen, wird die zugrunde liegende GPU in sieben Partitionen aufgeteilt. Wenn Sie max-shared-clients-per-gpu auch auf 3 setzen, unterstützt jede Partition bis zu drei Container. Insgesamt sind also bis zu 21 GPU-Geräte mit Zeitfreigabe verfügbar, die in dieser physischen GPU zugewiesen werden können. Informationen darüber, wie gpu-partition-size in tatsächliche Partitionen umgewandelt wird, finden Sie unter GPU-Partitionen mit mehreren Instanzen.

Führen Sie den folgenden Befehl aus, um einen GPU-Cluster mit mehreren Instanzen mit aktivierter GPU-Zeitfreigabe zu erstellen:

Autopilot

Mit Autopilot können GPU-Zeitfreigabe und GPUs mit mehreren Instanzen zusammen verwendet werden, indem beide Gruppen von Knotenselektoren verwendet werden.

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-gpu-sharing-strategy: time-sharing
        cloud.google.com/gke-max-shared-clients-per-gpu: "3"
        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

Standard

Bei Standard müssen Sie einen GPU-Cluster mit mehreren Instanzen mit Zeitfreigabe erstellen. Führen Sie dazu den folgenden Befehl aus:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --region=COMPUTE_REGION \
    --accelerator=type=nvidia-tesla-a100,count=GPU_QUANTITY,gpu-partition-size=PARTITION_SIZE,gpu-sharing-strategy=time-sharing,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

Ersetzen Sie PARTITION_SIZE durch die gewünschte GPU-Partitionsgröße für mehrere Instanzen, z. B. 1g.5gb.

Beschränkungen

  • Mit der GPU-Zeitfreigabe erzwingt GKE die Isolation von Arbeitsspeicher, Leistungsisolation und Fehlerisolation zwischen Containern, die eine physische GPU gemeinsam nutzen. Speicherlimits werden jedoch bei GPUs nicht erzwungen. Damit nicht Probleme wegen Arbeitsspeichermangel auftreten, legen Sie GPU-Arbeitsspeicherlimits in Ihren Arbeitslasten fest. Damit Sicherheitsprobleme vermieden werden, stellen Sie nur Arbeitslasten bereit, die sich in derselben Vertrauensgrenze für die GPU-Zeitfreigabe befinden.
  • Um unerwartetes Verhalten während der Kapazitätszuweisung zu vermeiden, lehnt GKE möglicherweise bestimmte Anfragen zur GPU-Zeitfreigabe ab. Weitere Informationen finden Sie unter GPU-Anfragen für die GPU-Zeitfreigabe.
  • Die maximale Anzahl von Containern, die die Zeitfreigabe in einer einzelnen physischen GPU verwenden können, beträgt 48. Berücksichtigen Sie bei der Planung der Zeitfreigabekonfiguration von GPU den Ressourcenbedarf Ihrer Arbeitslasten und die Kapazität der zugrunde liegenden physischen GPUs, um die Leistung und die Reaktionsfähigkeit zu optimieren.

Nächste Schritte