GPUs ausführen

Auf dieser Seite erfahren Sie, wie Sie NVIDIA®-Grafikprozessoren (GPUs) zur Hardwarebeschleunigung in den Knoten Ihrer GKE-Cluster (Google Kubernetes Engine) verwenden.

Übersicht

Mit GKE können Sie Knotenpools erstellen, die mit den NVIDIA Tesla® GPUs K80, P100, P4, V100, T4 und A100 (Beta) ausgestattet sind. GPUs bieten Rechenleistung für Deep-Learning-Aufgaben wie Bilderkennung, Natural Language Processing und andere rechenintensive Aufgaben wie Videotranscodierung und Bildverarbeitung.

Sie können GPUs auch mit VMs auf Abruf verwenden, wenn Ihre Arbeitslasten häufige Knotenunterbrechungen tolerieren können. Bei Verwendung von VMs auf Abruf reduziert sich der Preis für die Ausführung von GPUs. Weitere Informationen finden Sie unter GPUs auf Instanzen auf Abruf.

Anforderungen

GPUs in GKE setzen Folgendes voraus:

  • Kubernetes-Version: Für Knotenpools, die das Knoten-Image Container-Optimized OS verwenden, sind GPU-Knoten ab GKE-Version 1.9 verfügbar. Für Knotenpools, die das Ubuntu-Knoten-Image verwenden, sind GPU-Knoten ab GKE-Version 1.11.3 verfügbar.
  • GPU-Kontingent: Sie müssen ein Compute Engine-GPU-Kontingent in der gewünschten Zone haben, bevor Sie GPU-Knoten erstellen können. Auf der Seite Kontingente der Google Cloud Console können Sie prüfen, ob in Ihrem Projekt ein ausreichendes GPU-Kontingent vorhanden ist.

    Wenn Sie ein höheres GPU-Kontingent benötigen, können Sie in der Cloud Console eine Aufstockung des GPU-Kontingents anfordern. Falls Sie ein Abrechnungskonto eingerichtet haben, müsste Ihr Projekt nach dem Einreichen Ihrer Kontingentanfrage automatisch ein Kontingent erhalten.

  • NVIDIA-GPU-Treiber: Sie müssen NVIDIA-GPU-Treiber manuell auf Ihren Knoten installieren. Weiter unten auf dieser Seite wird erläutert, wie Sie die Treiber installieren.

  • A100-GPUs: A100-GPUs werden nur auf a2-Maschinentypen unterstützt. Sie benötigen die GKE-Version 1.18.6-gke.3504 oder höher.

Beschränkungen

Beachten Sie vor Verwendung von GPUs in GKE die folgenden Beschränkungen:

  • Sie können vorhandenen Knotenpools keine GPUs hinzufügen.
  • Innerhalb von Wartungsereignissen ist eine Live-Migration von GPU-Knoten nicht möglich.
  • GPUs werden nur mit N1-Maschinentypen für allgemeine Zwecke unterstützt.

Verfügbarkeit

GPUs sind in bestimmten Regionen und Zonen verfügbar. Berücksichtigen Sie also bei Ihrer GPU-Kontingentanfrage die Regionen, in denen Sie Ihre Cluster ausführen möchten.

Eine vollständige Liste der betreffenden Regionen und Zonen finden Sie unter GPUs in Compute Engine.

Mit dem gcloud-Befehlszeilentool können Sie ebenfalls GPUs auflisten, die in Ihrer Zone verfügbar sind. Führen Sie folgenden Befehl aus, um eine Liste aller GPU-Beschleunigertypen aufzurufen, die in den einzelnen Zonen unterstützt werden:

gcloud compute accelerator-types list

Preise

Informationen zu GPU-Preisen finden Sie in der Preistabelle auf der GPU-Seite der GCP.

GPU-Kontingent

Ihr GPU-Kontingent stellt die Gesamtzahl der GPUs dar, die in Ihrem GCP-Projekt ausgeführt werden können. Damit Sie Cluster mit GPUs erstellen können, muss in Ihrem Projekt ein ausreichend hohes GPU-Kontingent vorhanden sein.

Ihr GPU-Kontingent sollte mindestens der Gesamtzahl der GPUs entsprechen, die Sie in Ihrem Cluster ausführen möchten. Wenn Sie Cluster-Autoscaling aktivieren, sollte das angeforderte GPU-Kontingent mindestens der maximalen Anzahl von Knoten in Ihrem Cluster multipliziert mit der Anzahl von GPUs pro Knoten entsprechen.

Wenn Sie beispielsweise einen Cluster mit drei Knoten erstellen, auf dem zwei GPUs pro Knoten ausgeführt werden, benötigt Ihr Projekt mindestens ein Kontingent von sechs GPUs.

GPU-Kontingent anfordern

Zum Anfordern eines GPU-Kontingents verwenden Sie die Cloud Console. Weitere Informationen zum Anfordern von Kontingenten finden Sie in der Compute Engine-Dokumentation unter Weitere Kontingente anfordern.

Führen Sie die folgenden Schritte in der Cloud Console aus, um nach GPU-Kontingenten zu suchen:

  1. Rufen Sie in der Cloud Console das IAM-Menü (Identity and Access Management) "Kontingente" auf.

    Zum Menü "Kontingente"

  2. Klicken Sie im Drop-down-Menü Messwerte auf Keine und geben Sie dann "gpus" in das Suchfeld ein.

  3. Wählen Sie im Suchergebnis die gewünschten GPUs aus:

    Screenshot des Drop-down-Menüs

  4. Schließen Sie das Drop-down-Menü Messwert.

Kontingentanfrage senden

Führen Sie die folgenden Schritte in der Cloud Console aus, um eine Kontingentanfrage zu senden:

  1. Wählen Sie aus der Liste der GPU-Kontingente die Kontingente für die gewünschten Regionen wie us-central1 aus.
  2. Klicken Sie auf Kontingente bearbeiten. Rechts in der Cloud Console wird ein Anfrageformular geöffnet.
  3. Füllen Sie das Feld Neues Kontingentlimit für jede Kontingentanfrage aus.
  4. Geben Sie im Feld Beschreibung der Anfrage die Details zur Anfrage ein.
  5. Klicken Sie auf Fertig.
  6. Klicken Sie auf Anfrage senden.

GPUs ausführen

In den folgenden Abschnitten wird erläutert, wie GPUs in GKE-Clustern ausgeführt werden.

GPU-Knotenpool mit automatischer Skalierung erstellen

Damit Sie GPUs in GKE so kosteneffizient wie möglich einsetzen und vom Cluster-Autoscaling profitieren können, sollten Sie separate GPU-Knotenpools in Ihren Clustern erstellen.

Wenn Sie einen GPU-Knotenpool in einen vorhandenen Cluster aufnehmen, der bereits einen Knotenpool ohne GPUs ausführt, kennzeichnet GKE die GPU-Knoten automatisch mit folgender Knotenmarkierung:

  • Schlüssel: nvidia.com/gpu
  • Auswirkung: NoSchedule

Außerdem wendet GKE automatisch die entsprechenden Toleranzen für Pods an, die GPUs anfordern. Hierfür wird der Admission-Controller ExtendedResourceToleration ausgeführt.

Dadurch werden nur Pods, die GPUs anfordern, auf GPU-Knoten eingeplant, was ein effizienteres Autoscaling ermöglicht: Ihre GPU-Knoten können schnell herunter skaliert werden, wenn nicht genug Pods GPUs anfordern.

Sie können einen GPU-Knotenpool in einem vorhandenen Cluster mithilfe der Cloud Console oder des gcloud-Befehlszeilentools erstellen.

gcloud

Führen Sie zum Erstellen eines Knotenpools mit GPUs folgenden Befehl aus:

gcloud container node-pools create pool-name \
  --accelerator type=gpu-type,count=amount \
  --zone compute-zone --cluster cluster-name \
  [--num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling
  --machine-type a2-highgpu-1g]

Ersetzen Sie Folgendes:

  • pool-name: Der Name, den Sie für den Knotenpool auswählen.
  • gpu-type: Der GPU-Typ, entweder nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100, nvidia-tesla-t4 oder nvidia-tesla-a100.
  • amount: Die Anzahl der GPUs, die an Knoten im Knotenpool angehängt werden sollen.
  • compute-zone: Die Computing-Zone, in der der Knotenpool erstellt werden soll, z. B. us-central1-c. Der Cluster muss bereits in der angegebenen Zone ausgeführt werden.
  • cluster-name: Der Name des Clusters, in dem der Knotenpool erstellt werden soll.

Weitere Optionen:

  • --num-nodes gibt die anfängliche Anzahl der Knoten an, die erstellt werden sollen.
  • --min-nodes gibt die Mindestanzahl der Knoten an, die an einem beliebigen angegebenen Zeitpunkt ausgeführt werden sollen.
  • --max-nodes gibt die Höchstanzahl der Knoten an, die ausgeführt werden können.
  • --enable-autoscaling ermöglicht, dass der Knotenpool automatisch skaliert wird, wenn sich die Arbeitslast ändert.
  • --machine-type gibt den Maschinentyp für die Knoten an. Erforderlich für nvidia-tesla-a100-GPUs, die nur auf a2-Maschinentypen ausgeführt werden können.

Der folgende Befehl erstellt beispielsweise einen Autoscaling-Knotenpool p100 und zwei P100-GPUs im Cluster p100-cluster:

gcloud container node-pools create p100 \
  --accelerator type=nvidia-tesla-p100,count=2 \
  --zone us-central1-c --cluster p100-cluster \
  --num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling

Console

  1. Rufen Sie in der Cloud Console das Kubernetes Engine-Menü auf.

    Zum Google Kubernetes Engine-Menü

  2. Wählen Sie den gewünschten Cluster aus.

  3. Klicken Sie auf Bearbeiten.

  4. Klicken Sie auf Knotenpool hinzufügen.

  5. Klicken Sie optional das Kästchen Autoscaling aktivieren an.

  6. Konfigurieren Sie den Knotenpool wie gewünscht.

  7. Wählen Sie im linken Bereich die Option Knoten aus und maximieren Sie dann CPU-Plattform und GPU.

  8. Klicken Sie auf GPU hinzufügen.

  9. Wählen Sie in der Drop-down-Liste Anzahl der GPUs die gewünschte Anzahl von GPUs aus, die pro Knoten ausgeführt werden sollen.

  10. Wählen Sie in der Drop-down-Liste GPU-Typ den gewünschten GPU-Typ aus.

  11. Bestätigen Sie die Warnung durch Auswählen des Kontrollkästchens Ich habe die Einschränkungen verstanden.

  12. Klicken Sie auf Speichern.

Neuen zonalen Cluster mit GPUs erstellen

Zonale Cluster, die GPUs ausführen, können mit der Cloud Console oder dem gcloud-Befehlszeilentool erstellt werden.

gcloud

Führen Sie folgenden Befehl aus, um einen zonalen Cluster mit GPUs zu erstellen, die im Standardknotenpool des Clusters ausgeführt werden:

gcloud container clusters create cluster-name \
  --accelerator type=gpu-type,count=amount \
  --zone compute-zone

Ersetzen Sie Folgendes:

  • cluster-name: Der Name, den Sie für den Cluster auswählen.
  • gpu-type: Der GPU-Typ, entweder nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100, nvidia-tesla-t4 oder nvidia-tesla-a100.
  • amount: Die Anzahl der GPUs, die im Standardknotenpool ausgeführt werden sollen.
  • compute-zone: Die Computing-Zone des Clusters, z. B. us-central1-c.

Der folgende Befehl erstellt beispielsweise den Cluster p100 mit drei Knoten (der Standardwert, wenn --num-nodes weggelassen wird) und zwei P100-GPUs pro Knoten:

gcloud container clusters create p100 \
  --accelerator type=nvidia-tesla-p100,count=2 \
  --zone us-central1-c

Console

  1. Öffnen Sie die Clustervorlage GPU-beschleunigtes Computing.

    Zur Vorlage "GPU-beschleunigtes Computing"

  2. Konfigurieren Sie den Cluster wie gewünscht. Passen Sie dann den GPU-Knotenpool an oder fügen Sie weitere GPU-Knotenpools hinzu.

  3. Bestätigen Sie die Warnung durch Auswählen von Ich habe die Einschränkungen verstanden.

  4. Klicken Sie auf Erstellen.

Neuen regionalen Cluster mit GPUs erstellen

Regionale Cluster werden standardmäßig mit Knoten in drei Zonen einer Region erstellt. Allerdings gibt es keine Google Cloud-Region, die GPUs in allen drei Zonen bietet. Wenn Sie einen regionalen Cluster mit GPUs erstellen, müssen Sie Zonen mit dem Befehl --node-locations angeben. Sie können diesen Befehl auch verwenden, nachdem Sie den Cluster erstellt haben. Unter Verfügbarkeit erfahren Sie, welche Zonen GPUs bieten.

Sie erstellen einen regionalen GPU-Cluster mit dem gcloud-Befehlszeilentool oder der Cloud Console.

gcloud

Führen Sie folgenden Befehl aus, um einen regionalen Cluster mit GPUs zu erstellen:

gcloud container clusters create cluster-name \
  --accelerator type=gpu-type,count=amount \
  --region compute-region \
  --node-locations compute-zone,compute-zone

Ersetzen Sie Folgendes:

  • cluster-name: Der Name, den Sie für den Cluster auswählen.
  • gpu-type: Der GPU-Typ, entweder nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100, nvidia-tesla-t4 oder nvidia-tesla-a100.
  • amount: Die Anzahl der pro Knoten auszuführenden GPUs.
  • compute-region: Die Region des Clusters, z. B. us-central1.
  • compute-zone: Eine Computing-Zone innerhalb der Region, z. B. us-central1-c. Die von Ihnen angegebenen GPU-Typen müssen in den Zonen verfügbar sein.

Der folgende Befehl erstellt beispielsweise den Cluster p100 mit drei Knoten (der Standardwert, wenn --num-nodes weggelassen wird) und zwei P100-GPUs pro Knoten in zwei Zonen innerhalb von us-central1:

gcloud container clusters create p100 \
  --accelerator type=nvidia-tesla-p100,count=2 \
  --region us-central1 \
  --node-locations us-central1-a,us-central1-c

Console

  1. Öffnen Sie die Clustervorlage GPU-beschleunigtes Computing.

    Zur Vorlage "GPU-beschleunigtes Computing"

  2. Wählen Sie unter Standorttyp die Option Regional aus. Wählen Sie unter Region die gewünschte Region aus.

  3. Konfigurieren Sie den Cluster wie gewünscht. Passen Sie dann den GPU-Knotenpool an oder fügen Sie weitere GPU-Knotenpools hinzu.

  4. Bestätigen Sie die Warnung durch Auswählen von Ich habe die Einschränkungen verstanden.

  5. Klicken Sie auf Erstellen.

NVIDIA-GPU-Gerätetreiber installieren

Nachdem Sie Ihrem Cluster GPU-Knoten hinzugefügt haben, müssen Sie die NVIDIA-Gerätetreiber auf den Knoten installieren. Google stellt ein DaemonSet bereit, das die Treiber automatisch für Sie installiert.

Im folgenden Abschnitt finden Sie Installationsanleitungen für COS- (Container-Optimized OS) und Ubuntu-Knoten.

COS

Führen Sie den folgenden Befehl aus, um das DaemonSet für die Installation bereitzustellen:

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

Die Installation kann mehrere Minuten dauern. Sobald das NVIDIA-GPU-Geräte-Plug-in installiert ist, wird die Kapazität der NVIDIA-GPU über die Kubernetes-APIs angezeigt.

In der folgenden Tabelle sind die von den Nvidia-Treiberversionen unterstützten GKE-Versionen aufgeführt:

GKE-Version Nvidia-Treiber
1.18.6-gke.3504 und höher 418.51.06
1.14.x und höher 418.67

Ubuntu

GPU-Unterstützung erfordert v1.11.3 oder höher für Ubuntu-Knoten.

Führen Sie den folgenden Befehl aus, um das DaemonSet für die Installation bereitzustellen:

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

Die Installation kann mehrere Minuten dauern. Sobald das NVIDIA-GPU-Geräte-Plug-in installiert ist, wird die Kapazität der NVIDIA-GPU über die Kubernetes-APIs angezeigt.

In der folgenden Tabelle sind die von den Nvidia-Treiberversionen unterstützten GKE-Versionen aufgeführt:

GKE-Version Nvidia-Treiber
1.14.6-gke.13 und höher 418.74
1.14.6-gke.12 und niedriger 410.104
1.13.9-gke.11 und höher 418.74
1.13.9-gke.10 und niedriger 410.104
1.12.6-gke.6 und höher 410.104
1.12.6-gke.5 und niedriger 384.111
1.11.8-gke.4 und höher 410.104
1.11.8-gke.3 und niedriger 384.111

Pods zur Nutzung von GPUs konfigurieren

Für die Nutzung von GPUs durch Pods konfigurieren Sie ein Ressourcenlimit. Dieses Ressourcenlimit geben Sie in einer Pod-Spezifikation mit folgendem Schlüssel/Wert-Paar an:

  • Schlüssel: nvidia/gpu
  • Wert: Anzahl der zu nutzenden GPUs

Im Folgenden finden Sie ein Beispiel für eine Pod-Spezifikation, die GPUs nutzt:

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:10.0-runtime-ubuntu18.04
    command: ["/bin/bash"]
    resources:
      limits:
       nvidia.com/gpu: 2

Mehrere GPU-Typen nutzen

Wenn Sie mehrere GPU-Beschleunigertypen pro Cluster verwenden möchten, müssen Sie mehrere Knotenpools mit jeweils eigenem Beschleunigertyp erstellen. GKE fügt GPU-Knoten einen eindeutigen Knotenselektor hinzu, um GPU-Arbeitslasten auf Knoten mit bestimmten GPU-Typen zu verteilen:

  • Schlüssel: cloud.google.com/gke-accelerator
  • Wert: nvidia-tesla-k80, nvidia-tesla-p100, nvidia-tesla-p4, nvidia-tesla-v100, nvidia-tesla-t4 oder nvidia-tesla-a100.

Sie können bestimmte GPU-Typen gezielt auswählen. Dazu fügen Sie diesen Knotenselektor der Pod-Spezifikation Ihrer Arbeitslast hinzu. Beispiel:

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:10.0-runtime-ubuntu18.04
    command: ["/bin/bash"]
    resources:
      limits:
       nvidia.com/gpu: 2
  nodeSelector:
    cloud.google.com/gke-accelerator: nvidia-tesla-k80 # or nvidia-tesla-p100 or nvidia-tesla-p4 or nvidia-tesla-v100 or nvidia-tesla-t4 or nvidia-tesla-a100

CUDA-Bibliotheken

CUDA® ist die NVIDIA-Plattform für paralleles Computing und das Programmiermodell für GPUs. Die NVIDIA-Gerätetreiber, die Sie im Cluster installieren, beinhalten die CUDA-Bibliotheken.

CUDA-Bibliotheken und Dienstprogramme zur Fehlerbehebung werden im Container unter /usr/local/nvidia/lib64 bzw. /usr/local/nvidia/bin zur Verfügung gestellt.

CUDA-Anwendungen, die in Pods ausgeführt werden, die NVIDIA-GPUs verwenden, müssen CUDA-Bibliotheken dynamisch erkennen. Hierfür muss /usr/local/nvidia/lib64 in der Umgebungsvariable LD_LIBRARY_PATH angegeben werden.

Für CUDA-Anwendungen in GKE sollten Sie auf Ubuntu basierende CUDA-Docker-Basis-Images verwenden, für die LD_LIBRARY_PATH bereits entsprechend festgelegt ist. Die neueste unterstützte CUDA-Version ist 10.0 sowohl für COS (1.11.5+) als auch für Ubuntu (1.11.8-gke.4+, 1.12.6-gke.6+).

GPU-Knoten überwachen

GKE stellt folgende Stackdriver Monitoring-Messwerte für Container mit GPUs bereit. Mit diesen Messwerten können Sie die Leistung Ihrer GPU-Arbeitslasten überwachen:

  • Arbeitszyklus (container/accelerator/duty_cycle): Prozentsatz der Zeit im vergangenen Beispielzeitraum (10 Sekunden), während dessen der Beschleuniger aktiv verarbeitet wurde. Liegt zwischen 1 und 100.
  • Arbeitsspeichernutzung (container/accelerator/memory_used): Menge des dem Beschleuniger zugeteilten Arbeitsspeichers in Byte.
  • Speicherkapazität (container/accelerator/memory_total): Gesamter Arbeitsspeicher des Beschleunigers in Byte.

Diese Messwerte stehen in Stackdriver zur Verfügung.

Weitere Informationen zum Überwachen Ihrer Cluster und der zugehörigen Ressourcen finden Sie unter Monitoring.

Nutzungsmesswerte ansehen

Sie können die GPU-Nutzungsmesswerte Ihrer Arbeitslasten im Dashboard Arbeitslasten der Cloud Console ansehen.

Gehen Sie zum Abrufen der GPU-Nutzung Ihrer Arbeitslasten so vor:

  1. Rufen Sie das Menü Arbeitslasten in der Cloud Console auf.

    Zum Google Kubernetes Engine-Menü

  2. Wählen Sie die gewünschte Arbeitslast aus.

Im Dashboard "Arbeitslasten" werden die Arbeitsspeichernutzung und -kapazität der GPUs sowie der GPU-Arbeitszyklus in Form von Diagrammen angezeigt.

Weitere Informationen