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.
Übersicht
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.
Vorbereitung
Führen Sie die folgenden Schritte durch, 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:
- GPU-Zeitfreigabe in einem GKE-Cluster aktivieren
- NVIDIA-GPU-Gerätetreiber installieren (falls erforderlich)
- 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 dabei 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 wienvidia-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 Siegpu-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 dabei 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 wienvidia-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 Siegpu-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:
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.
Fügen Sie der Containerspezifikation in
spec.containers.resources.limits
die GPU-Ressourcenanfragenvidia.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.
- 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 dabei Folgendes:
GPU_TYPE
: Der GPU-Typ.CLIENTS_PER_GPU
ist die Anzahl der Arbeitslasten, die diese GPU verwenden. Verwenden Sie für dieses Beispiel3
.GPU_COUNT
: die Anzahl der GPUs, die dem Knoten hinzugefügt werden sollen. Verwenden Sie für dieses Beispiel1
.
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 dabei 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 Beispiel3
.
Wenden Sie das Manifest an:
kubectl apply -f gpu-timeshare.yaml
Prüfen Sie, ob alle Pods ausgeführt werden:
kubectl get pods -l=app=cuda-simple
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)
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
- Weitere Informationen zu in GKE verfügbaren GPU-Freigabestrategien
- Weitere Informationen zu GPUs
- GPUs mit mehreren Instanzen ausführen
- Weitere Informationen zum vorzeitigen Beenden von Berechnungen für die NVIDIA GPU finden Sie im NVIDIA Pascal Tuning Guide.