GPU-Freigabestrategien in GKE


Auf dieser Seite werden die in Google Kubernetes Engine (GKE) verfügbaren GPU-Freigabestrategien erläutert und verglichen. 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 automatischer Nutzerverwaltung.

Funktionsweise von GPU-Anfragen in Kubernetes

Mit Kubernetes können Arbeitslasten genau die Ressourcenmengen anfordern, die sie benötigen. Sie können unvollständige CPU-Einheiten für Arbeitslasten anfordern, aber keine unvollständigen GPU-Einheiten. Pod-Manifeste müssen GPU-Ressourcen in Ganzzahlen anfordern. Dies bedeutet, dass einem Container eine vollständige physische GPU zugewiesen wird, auch wenn der Container nur einen Bruchteil der Ressourcen benötigt, um ordnungsgemäß zu funktionieren. Dies ist ineffizient und kann kostspielig sein, insbesondere wenn Sie mehrere Arbeitslasten mit ähnlich niedrigen GPU-Anforderungen ausführen. Wir empfehlen die Verwendung von GPU-Freigabestrategien, um die GPU-Auslastung zu verbessern, wenn Ihre Arbeitslasten nicht alle GPU-Ressourcen verwenden.

Was sind GPU-Freigabestrategien?

Mit GPU-Freigabestrategien können mehrere Container Ihre angehängten GPUs effizient nutzen und Kosten sparen. GKE bietet die folgenden GPU-Freigabestrategien:

  • GPU mit mehreren Instanzen: GKE unterteilt eine einzelne unterstützte GPU in bis zu sieben Segmente. Jedes Slice kann unabhängig einem Container auf dem Knoten zugewiesen werden, für maximal sieben Container pro GPU. Eine GPU mit mehreren Instanzen bietet Hardwareisolation zwischen den Arbeitslasten sowie eine konsistente und vorhersehbare Dienstqualität für alle Container, die auf der GPU ausgeführt werden.
  • GPU-Zeitfreigabe: GKE verwendet die integrierte Zeitfreigabefunktion, die von der NVIDIA-GPU und dem Softwarestack bereitgestellt wird. Beginnend mit der Pascal-Architektur unterstützen NVIDIA-GPUs das vorzeitige Beenden auf Anweisungsebene. Beim Kontextwechsel zwischen Prozessen, die auf einer GPU ausgeführt werden, sorgt das vorzeitige Beenden auf Anweisungsebene dafür, dass jeder Prozess einen fairen Zeitabschnitt erhält. Die GPU-Zeitfreigabe bietet eine Softwareisolation zwischen den Arbeitslasten in Bezug auf Arbeitsspeicher- (Adressraum)-Isolation, Leistungsisolation und Fehlerisolation.
  • NVIDIA MPS: GKE verwendet NVIDIA Multi-Process-Dienst (MPS). NVIDIA MPS ist eine alternative, binär kompatible Implementierung der CUDA API, die dafür entwickelt wurde, kooperative Multiprozess-CUDA-Arbeitslasten transparent für die gleichzeitige Ausführung auf einem einzelnen GPU-Gerät zu ermöglichen. GPUs mit NVIDIA MPS bieten Softwareisolation in Bezug auf Ressourcenlimits (Prozentsatz aktiver Thread und angepinnter Gerätespeicher).

Zu verwendende GPU-Freigabestrategie

In der folgenden Tabelle werden die Merkmale der verfügbaren GPU-Freigabestrategien zusammengefasst und verglichen:

GPU mit mehreren Instanzen GPU-Zeitfreigabe NVIDIA MPS
Allgemein Parallele GPU-Freigabe zwischen Containern Schneller Kontextwechsel. Parallele GPU-Freigabe zwischen Containern
Isolation Eine einzelne GPU wird in bis zu sieben Segmente aufgeteilt und jeder Container auf derselben physischen GPU verfügt über dediziertes Computing, Arbeitsspeicher und Bandbreite. Daher hat ein Container in einer Partition einen vorhersehbaren Durchsatz und eine vorhersehbare Latenz, auch wenn andere Container andere Partitionen belegen.

Jeder Container greift auf die volle Kapazität der zugrunde liegenden physischen GPU zu. Dazu wird ein Kontextwechsel zwischen Prozessen durchgeführt, die auf einer GPU ausgeführt werden.

Die Zeitfreigabe bietet jedoch keine Speicherisolation zwischen gemeinsam genutzten Jobs und der schnelle Kontextwechsel für den gemeinsamen Zugriff kann zu Mehraufwand führen.

NVIDIA MPS hat eine begrenzte Ressourcenisolation, bietet jedoch mehr Flexibilität bei anderen Dimensionen (z. B. GPU-Typen und maximale Anzahl gemeinsam genutzter Einheiten), die die Ressourcenzuweisung vereinfachen.
Für diese Arbeitslasten geeignet Empfohlen für Arbeitslasten, die parallel ausgeführt werden und eine bestimmte Ausfallsicherheit und Dienstqualität erfordern. Wenn Sie beispielsweise KI-Inferenzarbeitslasten ausführen, können auf der GPU mit mehreren Instanzen GPUs mehrere Inferenzabfragen gleichzeitig ausgeführt werden, um schnelle Antworten zu erhalten, ohne sich gegenseitig zu verlangsamen.

Empfohlen für stoßweise und interaktive Arbeitslasten, die Zeit bei Inaktivität haben. Diese Arbeitslasten sind mit einer vollständig dedizierten GPU nicht kostengünstig. Durch die Verwendung der Zeitfreigabe erhalten Arbeitslasten schnell Zugriff auf die GPU, wenn sie sich in aktiven Phasen befinden.

Die GPU-Zeitfreigabe ist optimal für Szenarien, in denen eine vollständige Isolierung und ein kontinuierlicher GPU-Zugriff möglicherweise nicht erforderlich sind, z. B. wenn mehrere Nutzer Arbeitslasten testen oder Prototypen erstellen, ohne teure GPUs zu verwenden.

Arbeitslasten, die Zeitfreigabe verwenden, müssen bestimmte Leistungs- und Latenzkompromisse tolerieren.

Empfohlen für die Batchverarbeitung für kleine Jobs, da MPS den Durchsatz und die gleichzeitige Verwendung einer GPU maximiert. Mit MPS können Batchjobs für kleine bis mittelgroße Arbeitslasten effizient parallel verarbeitet werden.

NVIDIA MPS ist optimal für kooperative Prozesse, die als eine einzelne Anwendung fungieren. Beispiel: MPI-Jobs mit Inter-MPI-Rang-Parallelität. Bei diesen Jobs kann jeder kleine CUDA-Prozess (normalerweise MPI-Rankings) gleichzeitig auf der GPU ausgeführt werden, um die gesamte GPU vollständig auszulasten.

Arbeitslasten, die CUDA MPS verwenden, müssen die Einschränkungen für Speicherschutz und Fehlereindämmung tolerieren.

Monitoring GPU-Auslastungsmesswerte sind für GPUs mit mehreren Instanzen nicht verfügbar. Verwenden Sie Cloud Monitoring, um die Leistung Ihrer GPU-Zeitfreigabe zu überwachen. Weitere Informationen zu den verfügbaren Messwerten finden Sie unter GPU-Zeitfreigabe oder NVIDIA MPS-Knoten überwachen. Verwenden Sie Cloud Monitoring, um die Leistung Ihres NVIDIA MPS zu überwachen. Weitere Informationen zu den verfügbaren Messwerten finden Sie unter GPU-Zeitfreigabe oder NVIDIA MPS-Knoten überwachen.
Freigegebene GPUs in Arbeitslasten anfordern GPUs mit mehreren Instanzen ausführen GPUs mit Zeitfreigabe ausführen GPUs mit NVIDIA MPS ausführen

Wenn Sie Ihre GPU-Auslastung maximieren möchten, können Sie die GPU-Freigabestrategien kombinieren, um entweder die Zeitfreigabe oder NVIDIA MPS für jede GPU-Partition mit mehreren Instanzen zu verwenden. Sie können dann mehrere Container in jeder Partition ausführen, wobei diese Container die Ressourcen in dieser Partition gemeinsam nutzen. Wir empfehlen, eine der folgenden Kombinationen zu verwenden:

  • GPU- und GPU-Zeitfreigabe für mehrere Instanzen
  • GPU mit mehreren Instanzen und NVIDIA MPS.

Funktionsweise der GPU-Freigabestrategien

Sie können die maximale Anzahl von Containern angeben, die eine physische GPU gemeinsam nutzen dürfen. In Autopilot-Clustern ist dies in Ihrer Arbeitslastspezifikation konfiguriert. In Standardclustern wird dies konfiguriert, wenn Sie einen neuen Knotenpool mit angehängten GPUs erstellen. Jede GPU im Knotenpool wird anhand der Einstellung freigegeben, die Sie auf Knotenpoolebene angeben.

In den folgenden Abschnitten werden das Planungsverhalten und der Betrieb jeder GPU-Freigabestrategie erläutert.

GPU mit mehreren Instanzen

Sie können eine GPU mit mehreren Instanzen in Arbeitslasten anfordern. Geben Sie dazu das Label cloud.google.com/gke-gpu-partition-size im Feld nodeSelector der Pod-Spezifikation unter spec: nodeSelector an.

GKE plant Arbeitslasten in verfügbaren Knoten, die diesen Labels entsprechen. Wenn keine Knoten verfügbar sind, verwendet GKE Autoscaling und die automatische Knotenbereitstellung, um neue Knoten oder Knotenpools zu erstellen, die mit dem Label übereinstimmen.

GPU-Zeitfreigabe oder NVIDIA MPS

Sie können die GPU-Zeitfreigabe oder NVIDIA MPS in Arbeitslasten anfordern. Geben Sie dazu die folgenden Labels im Feld nodeSelector der Pod-Spezifikation unter spec:nodeSelector an.

  • cloud.google.com/gke-max-shared-clients-per-gpu: Wählen Sie Knoten aus, mit denen eine bestimmte Anzahl von Clients die zugrunde liegende GPU gemeinsam nutzen kann.
  • cloud.google.com/gke-gpu-sharing-strategy: Wählen Sie Knoten aus, die die Zeitfreigabe- oder NVIDIA MPS-Strategie für GPUs verwenden.

In der folgenden Tabelle wird beschrieben, wie sich das Planungsverhalten basierend auf den Knotenlabelkombinationen ändert, die Sie in Ihren Manifesten angeben.

Knotenlabels
cloud.google.com/gke-max-shared-clients-per-gpu

und

cloud.google.com/gke-gpu-sharing-strategy

GKE plant Arbeitslasten für verfügbare Knoten, die mit beiden Labels übereinstimmen.

Wenn keine Knoten verfügbar sind, verwendet GKE Autoscaling und die automatische Knotenbereitstellung, um neue Knoten oder Knotenpools zu erstellen, die mit beiden Labels übereinstimmen.

Nur cloud.google.com/gke-max-shared-clients-per-gpu

Autopilot: GKE lehnt die Arbeitslast ab.

Standard: GKE plant Arbeitslasten für verfügbare Knoten, die mit dem Label übereinstimmen. Wenn keine Knoten verfügbar sind, verwendet GKE Autoscaling und die automatische Knotenbereitstellung, um neue Knoten oder Knotenpools zu erstellen, die mit dem Label übereinstimmen. Standardmäßig erhalten automatisch bereitgestellte Knoten für jede Strategie das folgende Label und den folgenden Wert:

  • GPU-Zeitfreigabe: cloud.google.com/gke-gpu-sharing-strategy=TIME_SHARING
  • NVIDIA MPS: cloud.google.com/gke-gpu-sharing-strategy=MPS
Nur cloud.google.com/gke-gpu-sharing-strategy

Autopilot: GKE lehnt die Arbeitslast ab.

Standard: GKE plant Arbeitslasten in verfügbaren Knoten, die bestimmte Freigabestrategien verwenden.

  • Wenn es mehrere Knotenpools mit Freigabe und unterschiedlichen Werten für cloud.google.com/gke-max-shared-clients-per-gpu gibt, kann die Arbeitslast auf jedem verfügbaren Knoten geplant werden.
  • Wenn in keinem Knotenpool Knoten verfügbar sind, skaliert Cluster Autoscaler den Knotenpool vertikal mit dem niedrigsten Wert für cloud.google.com/gke-max-shared-clients-per-gpu.
  • Wenn alle Knotenpools ausgelastet sind, erstellt die automatische Knotenbereitstellung einen neuen Knotenpool mit dem Standardwert cloud.google.com/gke-max-shared-clients-per-gpu=2.

Der GPU-Anfrageprozess, den Sie ausführen, ist für die GPU-Zeitfreigabe und die NVIDIA MPS-Strategie identisch. Wenn Sie GPU-Anwendungen entwickeln, die auf der GPU-Zeitfreigabe oder mit NVIDIA MPS ausgeführt werden, können Sie nur eine GPU für jeden Container anfordern. GKE lehnt eine Anfrage für mehr als eine GPU in einem Container ab, um unerwartetes Verhalten zu vermeiden und weil die Anzahl der angeforderten GPU-Zeitfreigabe und NVIDIA MPS kein Maß für die verfügbare Rechenleistung für den Container ist.

Die folgende Tabelle zeigt, was Sie erwarten können, wenn Sie bestimmte Mengen an GPUs anfordern.

GPU-Anfragen, die für die GPU-Zeitfreigabe und NVIDIA MPS gelten
Eine GPU-Zeitfreigabe oder NVIDIA MPS pro Container GKE lässt die Anfrage zu, auch wenn der Knoten eine physische GPU oder mehrere physische GPUs hat.
Mehr als eine GPU-Zeitfreigabe pro Container

GKE lehnt die Anfrage ab.

Dieses Verhalten umfasst das Anfordern von mehr als einer Instanz einer GPU mit mehreren Instanzen in einem Container, da jede GPU-Instanz als separate GPU betrachtet wird.

Mehr als eine NVIDIA MPS pro Container

Abhängig von der Anzahl der physischen GPUs im Knoten führt GKE die folgenden Schritte aus:

  • GKE lässt die Anfrage zu, wenn der Knoten nur eine physische GPU hat.
  • GKE lehnt die Anfrage ab, wenn der Knoten mehrere physische GPUs hat, beispielsweise mehr als eine GPU-Instanz mit mehreren Instanzen in einem Container. Diese Ablehnung tritt auf, weil jede GPU-Instanz als separate GPU betrachtet wird.

Wenn GKE die Arbeitslast ablehnt, wird eine Fehlermeldung ähnlich der folgenden angezeigt:

status:
  message: 'Pod Allocate failed due to rpc error: code = Unknown desc = [invalid request
    for sharing GPU (time-sharing), at most 1 nvidia.com/gpu can be requested on GPU nodes], which is unexpected'
  phase: Failed
  reason: UnexpectedAdmissionError

GPU-Zeitfreigabe oder NVIDIA MPS-Knoten überwachen

Verwenden Sie Cloud Monitoring, um die Leistung Ihrer GPU-Zeitfreigabe- oder NVIDIA MPS-Knoten zu überwachen. GKE sendet Messwerte für jeden GPU-Knoten an Cloud Monitoring. Diese Messwerte unterscheiden sich von den Messwerten für reguläre GPUs, die keine Zeitfreigabe oder NVIDA-MPS-Knoten sind.

Sie können die folgenden Messwerte für jeden GPU-Zeitfreigabe-Knoten oder NVIDIA MPS-Knoten in Cloud Monitoring prüfen:

  • Arbeitszyklus (node/accelerator/duty_cycle): Prozentsatz der Zeit im letzten Beispielzeitraum (10 Sekunden), während der der GPU-Knoten aktiv verarbeitet wurde. Liegt im Bereich von 1 % bis 100 %.
  • Arbeitsspeichernutzung (node/accelerator/memory_used): Menge des dem Beschleuniger zugeteilten Arbeitsspeichers in Byte für jeden GPU-Knoten.
  • Arbeitsspeicherkapazität (node/accelerator/memory_total): Gesamter Arbeitsspeicher des Beschleunigers in Byte für jeden GPU-Knoten.

Diese GPU-Zeitfreigabe- oder NVIDIA MPS-Knotenmesswerte gelten auf Knotenebene (node/accelerator/) und die Messwerte fürreguläre physische GPUs auf Containerebene anwenden (container/accelerator) Die Messwerte für reguläre physische GPU-Messwerte sind nicht für Container erfasst, die auf einer GPU geplant sind, die GPU-Zeitfreigabe oder NVIDIA MPS verwendet.

Nächste Schritte