Auf dieser Seite werden die Eigenschaften und besten Arten von Arbeitslasten für jede in Google Kubernetes Engine (GKE) verfügbare GPU-Freigabestrategie erläutert, z. B. GPUs mit mehreren Instanzen, GPU-Zeitfreigabe und NVIDIA MPS.
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. Außerdem sollten Sie mit grundlegenden Kubernetes- und GKE-Deployments vertraut sein.
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 Isolation auf Softwareebene zwischen den Arbeitslasten in Bezug auf Adressbereichsisolation, 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 Isolation auf Software-Ebene 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 Speichereinschränkung für einen Grenzwert 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, um inaktive GPUs zu vermeiden, wenn keine vollständige Isolation und kein kontinuierlicher GPU-Zugriff erforderlich sind, z. B. wenn mehrere Nutzer Arbeitslasten testen oder Prototypen erstellen. 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 für die entsprechenden verfügbaren Knoten. Dazu ordnet es diese Labels zu. Wenn keine geeigneten 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 der Kombination von Knotenlabels ä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:
|
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.
|
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. Darüber hinaus ist die Anzahl der mit Zeitfreigabe und NVIDIA MPS angeforderten GPUs kein Maß für die Rechenleistung, die dem Container zur Verfügung steht.
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 ist das gleiche, wenn Sie mehr als eine Instanz einer GPU mit mehreren Instanzen in einem Container anfordern, da jede GPU-Instanz als separate physische 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:
|
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 GPU-Zeitfreigabe- oder NVIDIA MPS-Knotenmesswerte gelten auf Knotenebene (node/accelerator/
).
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 Messwerte unterscheiden sich von den Messwerten für reguläre GPUs, die keine Zeitfreigabe- oder NVIDA-MPS-Knoten sind.
Die Messwerte für reguläre physische GPUs gelten auf Containerebene (container/accelerator
) und werden nicht für geplante Container erfasst, die auf einer GPU geplant sind, die GPU-Zeitfreigabe oder NVIDIA MPS verwendet.
Nächste Schritte
- GPUs für mehrere Arbeitslasten mithilfe der GPU-Zeitfreigabe freigeben.
- GPUs für mehrere Arbeitslasten mithilfe von NVIDIA MPS freigeben.
- GPUs mit mehreren Instanzen ausführen
- Weitere Informationen zu GPUs
- Weitere Informationen zum vorzeitigen Beenden von Berechnungen für die NVIDIA GPU finden Sie im NVIDIA Pascal Tuning Guide.