Auf dieser Seite erfahren Sie, wie Sie die Netzwerkbandbreite und den Durchsatz für leistungsstarke GPU-Arbeitslasten in Standardclustern der Google Kubernetes Engine (GKE) mithilfe von GPUDirect-TCPXO, GPUDirect-TCPX, gVNIC und Multi-Networking maximieren. Wenn Sie Autopilot-Cluster verwenden, lesen Sie den Hilfeartikel GPU-Netzwerkbandbreite in Clustern im Autopilot-Modus maximieren.
Diese Seite richtet sich an Entwickler von maschinellem Lernen (ML) und Plattformadministratoren, die ML-Arbeitslasten ermöglichen. Machen Sie sich vor dem Lesen dieser Seite mit Netzwerktechnologien wie Netzwerkkarten (NICs) und TCP sowie mit Beschleunigertechnologien wie der NVIDIA Collective Communications Library (NCCL) vertraut.
Anwendungen für künstliche Intelligenz (KI), maschinelles Lernen (ML) und Hochleistungs-Computing (HPC) erfordern eine leistungsstarke Beschleunigung, um die Leistung zu optimieren, indem die Zeit bis zur Jobausführung verkürzt wird. Beispielsweise erfordern ML-Modelle, die sich auf konversationelle KI und Bildgenerierung konzentrieren, eine hohe Skalierbarkeit und Rechenleistung.
Informationen zu Google Cloud GPU-Supercomputern
Google Cloud bietet beschleunigeroptimierte Supercomputer, die für skalierbare, riesige Modelle entwickelt wurden. Diese Maschinen bieten folgende Vorteile:
- Acht NVIDIA H100-GPUs pro Maschine.
- Bis zu 200 Gbit/s Bandbreite auf der primären NIC.
- Sekundäre NICs (bis zu acht bei A3 Mega-Maschinentypen und bis zu vier bei A3 High-Maschinentypen), die jeweils eine Bandbreite von bis zu 200 Gbit/s für die GPU-Datenübertragung unterstützen.
Eine vollständige Liste der Vorteile finden Sie in der Compute Engine-Dokumentation unter A3-Maschinenserie.
Ihre GKE-Arbeitslast muss alle verfügbaren GPUs und alle verfügbaren sekundären NICs auf einem einzelnen Knoten verwenden und einen erheblichen Teil der verfügbaren Bandbreite nutzen. Die in diesem Dokument beschriebene Lösung eignet sich ideal für Arbeitslasten, die eine hohe Leistung, einen hohen Durchsatz und eine geringe Latenz erfordern.
Erforderliche Funktionen für maximale Bandbreite
Verwenden Sie alle der folgenden Funktionen, um die Netzwerkbandbreite in GPU-Supercomputerknoten zu maximieren:
- GPUDirect-Netzwerkstack: Die A3-Maschinenreihe unterstützt zwei Netzwerkstacks für benutzerdefinierten Remote Direct Memory Access (RDMA):
- Verwenden Sie bei A3 High-Maschinentypen und NVIDIA H100-GPUs GPUDirect-TCPX, um den Overhead für die Übertragung von Paketnutzlasten an und von GPUs zu reduzieren. Dadurch wird der Durchsatz im Vergleich zu GPUs, die GPUDirect nicht verwenden, erheblich verbessert.
- Verwenden Sie bei A3 Mega-Maschinentypen und NVIDIA H100 Mega-GPUs GPUDirect-TCPXO, um die Kommunikation zwischen GPU und VM weiter zu verbessern.
- gVNIC: Aktivieren Sie GPUDirect-Funktionen wie Paketheaderaufteilung, Flusssteuerung und Verwaltung des Zwischenspeichers. gVNIC ist erforderlich, um GPUDirect-TCPX oder GPUDirect-TCPXO zu verwenden. Weitere Informationen zu gVNIC finden Sie unter Netzwerkgeschwindigkeit für GPU-Knoten erhöhen.
- Multi-Netzwerk: Fügen Sie der beschleunigungsoptimierten Maschine sekundäre NICs hinzu. Jede NIC ist einem separaten Subnetz in einem eigenen VPC zugeordnet, um Konflikte zu vermeiden. Weitere Informationen zur Unterstützung für mehrere Netzwerke finden Sie unter Unterstützung mehrerer Netzwerke für Pods einrichten.
- Platzierungsrichtlinien: Mit einer Ressourcenplatzierungsrichtlinie können Sie alle GPU-Knoten für eine bestimmte Arbeitslast auf physisch nahe gelegenen Servern platzieren, um die Latenz zu minimieren. Weitere Informationen finden Sie unter Kompakte Platzierung für GKE-Knoten definieren.
Prozedurübersicht
So verwenden Sie alle diese Funktionen zusammen:
- Virtual Private Clouds (VPCs) und Subnetze erstellen
- Erstellen Sie die GKE-Umgebung.
- GPUDirect-Binärprogramm und NCCL-Plug-in installieren
- NRI-Geräte-Injector-Plug-in bereitstellen
- Testarbeitslast bereitstellen, um die GPUDirect-Einrichtung zu prüfen
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 H100-GPUs ausreicht. Informationen zum Anfordern eines höheren Kontingents finden Sie unter GPU-Kontingente.
Voraussetzungen
Sofern nicht anders angegeben, gelten die folgenden Anforderungen sowohl für GPUDirect-TCPX als auch für GPUDirect-TCPXO.
- GPUDirect-TCPX wird in GKE Version 1.27 oder höher unterstützt und erfordert Folgendes:
- * Maschinentyp
a3-highgpu-8g
- Verwenden Sie für GKE-Version 1.27 die GKE-Patchversion 1.27.7-gke.1121000 oder höher.
- Verwenden Sie für die GKE-Version 1.28 die GKE-Patchversion 1.28.8-gke.1095000 oder höher.
- Verwenden Sie für GKE-Version 1.29 die GKE-Patchversion 1.29.3-gke.1093000 oder höher.
- * Maschinentyp
- GPUDirect-TCPXO wird in GKE Version 1.28 oder höher unterstützt und erfordert Folgendes:
- Maschinentyp
a3-megagpu-8g
- Verwenden Sie für die GKE-Version 1.28 die GKE-Patchversion 1.28.9-gke.1250000 oder höher.
- Verwenden Sie für die GKE-Version 1.29 die GKE-Patchversion 1.29.4-gke.1542000 oder höher.
- Maschinentyp
- Der GKE-Knoten muss ein Knoten-Image für Container-Optimized OS (COS) verwenden. Ubuntu- und Windows-Knoten-Images werden nicht unterstützt.
- Ihre GPU-Knoten müssen die NVIDIA-Treiberversion 535 oder höher verwenden.
- Sie müssen GKE Dataplane V2 verwenden.
Beschränkungen
Es gelten folgende Einschränkungen:
- GPUDirect-TCPX und GPUDirect-TCPXO werden nicht mit GPUs mit mehreren Instanzen, GPU-Timesharing oder NVIDIA MPS unterstützt.
- Sie können NCCL FastSocket nicht verwenden.
- Ihre GKE-Arbeitslast muss alle verfügbaren GPUs und alle verfügbaren sekundären NICs auf einem einzelnen Knoten verwenden. Mehrere Pods können GPUDirect-TCPX oder GPUDirect-TCPXO nicht auf einem einzelnen Knoten verwenden.
- Sie können nur die Maschinentypen
a3-highgpu-8g
unda3-megagpu-8g
verwenden. Andere A3-Maschinentypen werden nicht unterstützt.
VPCs und Subnetze erstellen
Erstellen Sie in Ihrem Projekt separate VPC-Netzwerke für jede virtuelle NIC, die Sie Ihren Knoten hinzufügen. Jedes VPC-Netzwerk muss ein Subnetz und eine Firewallregel haben, die den internen Netzwerkverkehr zulässt.
Erstellen Sie die VPC-Netzwerke für GPUDirect in Ihrem Projekt, jeweils mit einem Subnetz und einer Firewallregel. Wählen Sie für A3 High-Maschinentypen den Tab „GPUDirect-TCPX“ oder für A3 Mega-Maschinentypen den Tab „GPUDirect-TCPXO“ aus und führen Sie dann die folgenden Schritte aus:
GPUDirect-TCPXO
Um die Bandbreite zu maximieren, empfehlen wir, acht neue Netzwerke zu erstellen.
for N in $(seq 1 8); do gcloud compute networks create PREFIX-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PREFIX-sub-$N \ --network=PREFIX-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PREFIX-internal-$N \ --network=PREFIX-net-$N \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=SOURCE_RANGE done
Ersetzen Sie Folgendes:
PROJECT_ID
ist Ihre Google Cloud-Projekt-ID.REGION
: die Compute Engine-Region für jedes Subnetz.SUBNET_RANGE
: den IP-Adressbereich jedes Subnetzes in CIDR-Notation. Dieser Beispielbefehl wird für acht Subnetze ausgeführt. Verwenden Sie daher eine Variable, um die IP-Adresse für jedes Subnetz zu ändern. Geben Sie beispielsweise192.168.$N.0/24
an, damit das erste Subnetz192.168.1.0/24
, das zweite Subnetz192.168.2.0/24
usw. verwendet.SOURCE_RANGE
: Der Quell-IP-Adressbereich für die Firewallregel, um eingehenden Traffic zuzulassen, in CIDR-Notation. Beispiel:192.168.0.0/16
GPUDirect-TCPX
Um die Bandbreite zu maximieren, empfehlen wir, vier neue Netzwerke zu erstellen.
for N in $(seq 1 4); do gcloud compute networks create PREFIX-net-$N \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create PREFIX-sub-$N \ --network=PREFIX-net-$N \ --region=REGION \ --range=SUBNET_RANGE gcloud compute firewall-rules create PREFIX-internal-$N \ --network=PREFIX-net-$N \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=SOURCE_RANGE done
Ersetzen Sie Folgendes:
PROJECT_ID
ist Ihre Google Cloud-Projekt-ID.REGION
: die Compute Engine-Region für jedes Subnetz.SUBNET_RANGE
: den IP-Adressbereich jedes Subnetzes in CIDR-Notation. Dieser Beispielbefehl wird für vier Subnetze ausgeführt. Verwenden Sie daher eine Variable, um die IP-Adresse für jedes Subnetz zu ändern. Geben Sie beispielsweise192.168.$N.0/24
an, damit das erste Subnetz192.168.1.0/24
, das zweite Subnetz192.168.2.0/24
usw. verwendet.SOURCE_RANGE
: Der Quell-IP-Adressbereich für die Firewallregel, um eingehenden Traffic zuzulassen, in CIDR-Notation. Beispiel:192.168.0.0/16
Prüfen Sie, ob die Netzwerke erstellt wurden:
gcloud compute networks list
GKE-Umgebung erstellen
Erstellen Sie einen neuen GKE-Cluster, der Multi-Networking (Vorabversion) verwendet, und einen GPU-Knotenpool mit den folgenden Eigenschaften:- gVNIC aktiviert
- Für jede sekundäre NIC angegebene Subnetze mit mehreren Netzwerken
- A3-Maschinenserie mit H100-GPUs zur Unterstützung der Knoten
- Neueste NVIDIA-Treiber installiert
Sie können einen vorhandenen Cluster nicht aktualisieren, um Multi-Netzwerk zu verwenden.
GPUDirect-TCPXO
Wählen Sie eine verfügbare GKE-Version aus, die GPUDirect-TCPXO unterstützt. Führen Sie den folgenden Befehl aus, um die Versionen aufzulisten:
gcloud container get-server-config \ --format="yaml(validMasterVersions)" \ --region=REGION \ --project=PROJECT_ID
Ersetzen Sie Folgendes:
REGION
: die Computing-Region für die ClustersteuerungsebenePROJECT_ID
ist Ihre Google Cloud-Projekt-ID.
Erstellen Sie einen Cluster.
gcloud beta container clusters create CLUSTER_NAME \ --enable-dataplane-v2 --enable-ip-alias --zone=ZONE \ --enable-multi-networking --cluster-version=VERSION \ --no-enable-autoupgrade \ --project=PROJECT_ID
Ersetzen Sie Folgendes:
CLUSTER_NAME
: der Name des neuen Clusters.VERSION
: Eine GKE-Version, die GPUDirect-TCPXO unterstützt, wie in den Anforderungen beschrieben.ZONE
ist die Computing-Zone für den Cluster.
Erstellen Sie im Cluster die Ressourcen „Netzwerk“ und „GKENetworkParamSet“, die den von Ihnen erstellten VPC-Netzwerken und ‑Subnetzen entsprechen:
kubectl apply -f - <<EOF apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc1 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc1 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc2 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc2 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc3 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc3 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc4 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc4 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc5 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc5 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc6 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc6 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc7 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc7 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc8 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc8 type: Device --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc1 spec: vpc: PREFIX-net-1 vpcSubnet: PREFIX-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PREFIX-net-2 vpcSubnet: PREFIX-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PREFIX-net-3 vpcSubnet: PREFIX-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PREFIX-net-4 vpcSubnet: PREFIX-sub-4 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc5 spec: vpc: PREFIX-net-5 vpcSubnet: PREFIX-sub-5 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc6 spec: vpc: PREFIX-net-6 vpcSubnet: PREFIX-sub-6 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc7 spec: vpc: PREFIX-net-7 vpcSubnet: PREFIX-sub-7 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc8 spec: vpc: PREFIX-net-8 vpcSubnet: PREFIX-sub-8 deviceMode: NetDevice EOF
Diese Ressourcen weisen GKE an, die NICs für den GPU-Traffic im Passthrough-Modus zu konfigurieren. GKE wendet keine integrierte Netzwerkprogrammierung mit eBPF auf diesen Traffic an.
GPUDirect-TCPX
Erstellen Sie einen Cluster.
gcloud beta container clusters create CLUSTER_NAME \ --enable-dataplane-v2 --enable-ip-alias --zone=ZONE \ --enable-multi-networking --cluster-version=VERSION \ --no-enable-autoupgrade \ --project=PROJECT_ID
Ersetzen Sie Folgendes: *
CLUSTER_NAME
: der Name des neuen Clusters. *VERSION
: eine GKE-Version, die GPUDirect-TCPX unterstützt, wie in den Anforderungen beschrieben. *ZONE
: die Computing-Zone für den Cluster.Erstellen Sie im Cluster die Ressourcen „Netzwerk“ und „GKENetworkParamSet“, die den von Ihnen erstellten VPC-Netzwerken und ‑Subnetzen entsprechen:
kubectl apply -f - <<EOF apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc1 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc1 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc2 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc2 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc3 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc3 type: Device --- apiVersion: networking.gke.io/v1 kind: Network metadata: name: vpc4 spec: parametersRef: group: networking.gke.io kind: GKENetworkParamSet name: vpc4 type: Device --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc1 spec: vpc: PREFIX-net-1 vpcSubnet: PREFIX-sub-1 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc2 spec: vpc: PREFIX-net-2 vpcSubnet: PREFIX-sub-2 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc3 spec: vpc: PREFIX-net-3 vpcSubnet: PREFIX-sub-3 deviceMode: NetDevice --- apiVersion: networking.gke.io/v1 kind: GKENetworkParamSet metadata: name: vpc4 spec: vpc: PREFIX-net-4 vpcSubnet: PREFIX-sub-4 deviceMode: NetDevice EOF
Diese Ressourcen weisen GKE an, die NICs für den GPU-Traffic im Passthrough-Modus zu konfigurieren. GKE wendet keine integrierte Netzwerkprogrammierung mit eBPF auf diesen Traffic an.
GPU-Knotenpool erstellen
GPUDirect-TCPXO
Erstellen Sie einen Knotenpool für die H100-GPUs:
gcloud beta container node-pools create NODE_POOL_NAME \
--zone=ZONE \
--cluster=CLUSTER_NAME \
--project=PROJECT_ID \
--accelerator=type=nvidia-h100-mega-80gb,count=8,gpu-driver-version=LATEST \
--machine-type=a3-megagpu-8g \
--num-nodes=2 \
--additional-node-network network=PREFIX-net-1,subnetwork=PREFIX-sub-1 \
--additional-node-network network=PREFIX-net-2,subnetwork=PREFIX-sub-2 \
--additional-node-network network=PREFIX-net-3,subnetwork=PREFIX-sub-3 \
--additional-node-network network=PREFIX-net-4,subnetwork=PREFIX-sub-4 \
--additional-node-network network=PREFIX-net-5,subnetwork=PREFIX-sub-5 \
--additional-node-network network=PREFIX-net-6,subnetwork=PREFIX-sub-6 \
--additional-node-network network=PREFIX-net-7,subnetwork=PREFIX-sub-7 \
--additional-node-network network=PREFIX-net-8,subnetwork=PREFIX-sub-8 \
--enable-gvnic \
--no-enable-autoupgrade \
--scopes "https://www.googleapis.com/auth/cloud-platform" \
[--placement-policy=POLICY_NAME \
--reservation-affinity=specific \
--reservation=RESERVATION_NAME \
--host-maintenance-interval=PERIODIC]
Ersetzen Sie NODE_POOL_NAME
durch den Namen Ihres Knotenpools.
Im Beispiel wird mit dem --scopes
-Argument „https://www.googleapis.com/auth/cloud-platform“ der Bereich der Knoteninstanz zu Testzwecken auf cloud-platform
festgelegt. Für die Produktion können Sie den Umfang einschränken, um detailliertere Anmeldedaten zu konfigurieren.
Verwenden Sie die Flags --placement-policy
, --reservation-affinity
und --reservation
, wenn Sie eine Reservierung verwenden. Geben Sie diese Flags an, um den Richtliniennamen und die Reservierung im Knotenpool zu konfigurieren.
Wenn dieser Befehl fehlschlägt, haben Sie möglicherweise nicht genügend H100-GPU-Kontingent in Ihrem Projekt. Prüfen Sie, ob Ihr Kontingent ausreicht, und wiederholen Sie den Befehl.
GPUDirect-TCPX
Erstellen Sie einen Knotenpool für die H100-GPUs:
gcloud container node-pools create NODE_POOL_NAME \
--cluster=CLUSTER_NAME \
--location=LOCATION \
--machine-type=a3-highgpu-8g \
--accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=LATEST \
--additional-node-network=network=PREFIX-net-1,subnetwork=PREFIX-sub-1 \
--additional-node-network=network=PREFIX-net-2,subnetwork=PREFIX-sub-2 \
--additional-node-network=network=PREFIX-net-3,subnetwork=PREFIX-sub-3 \
--additional-node-network=network=PREFIX-net-4,subnetwork=PREFIX-sub-4 \
--enable-gvnic \
--no-enable-autoupgrade
Ersetzen Sie NODE_POOL_NAME
durch den Namen des Knotenpools.
Wenn dieser Befehl fehlschlägt, haben Sie möglicherweise nicht genügend H100-GPU-Kontingent in Ihrem Projekt. Prüfen Sie, ob Sie ein Kontingent haben, und wiederholen Sie den Befehl.
Prüfen Sie nach dem Erstellen des Knotenpools, ob jeder Knoten die angeschlossenen GPUs hat:
Rufen Sie eine Liste der Knoten im Cluster ab:
kubectl get nodes
Prüfen Sie, ob jeder GPU-Knoten acht GPUs hat:
kubectl describe node NODE_NAME
Ersetzen Sie
NODE_NAME
durch den Namen des Knotens, den Sie beschreiben möchten.Die Ausgabe sieht in etwa so aus:
Capacity: ... nvidia.com/gpu: 8 Allocatable: ... nvidia.com/gpu: 8
GPUDirect-Binärprogramm installieren und NCCL konfigurieren
In diesem Abschnitt erfahren Sie, wie Sie das GPUDirect-Binärprogramm basierend auf Ihrem A3-Maschinentyp (GPUDirect-TCPX für A3 High, GPUDirect-TCPXO für A3 Mega) und einer bestimmten NCCL-Bibliotheksversion mithilfe eines DaemonSet installieren.
GPUDirect-TCPXO
Dieses DaemonSet hat folgende Auswirkungen:
- Vorinstallation zum Einrichten von GPUDirect-TCPXO-Konfigurationen.
- Installiert die NCCL-Bibliothek und das GPUDirect-TCPXO-Binärprogramm auf dem Knoten.
- Speichert die Bibliothek und das Binärprogramm im Verzeichnis
/home/kubernetes/bin/nvidia/lib64
auf der VM. Standardmäßig wird dieses Verzeichnis von GKE in GPU-Containern, in denen NCCL und GPUDirect-TCPXO verwendet werden müssen, im Pfad/usr/local/nvidia/lib64
bereitgestellt.
So installieren Sie die Binärdatei und konfigurieren NCCL:
Sehen Sie sich das
nccl-tcpxo-installer.yaml
-Daemon-Set-Manifest in GitHub an.Stellen Sie das DaemonSet bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-tcpxo-installer.yaml
Es dauert etwa zwei Minuten, bis das NCCL-Plug-in gestartet wird.
Prüfen Sie den Status der DaemonSet-Pods:
kubectl get pods -n=kube-system -l=name=nccl-tcpxo-installer
Die Ausgabe sieht in etwa so aus:
# Output nccl-tcpxo-installer-6c2pv 1/1 Running 0 2m11s nccl-tcpxo-installer-qgg82 1/1 Running 0 2m11s
GPUDirect-TCPX
Dieses DaemonSet hat folgende Auswirkungen:
- Installiert die NCCL-Bibliothek und das GPUDirect-TCPX-Binärprogramm auf dem Knoten.
- Speichert die Bibliothek und das Binärprogramm im Verzeichnis
/home/kubernetes/bin/nvidia/lib64
auf der VM. Standardmäßig wird dieses Verzeichnis von GKE in GPU-Containern, in denen NCCL und GPUDirect-TCPX verwendet werden müssen, im Pfad/usr/local/nvidia/lib64
bereitgestellt.
So installieren Sie das Binärprogramm und konfigurieren NCCL:
Sehen Sie sich das
nccl-tcpx-installer.yaml
-Daemon-Set-Manifest in GitHub an.Stellen Sie das DaemonSet bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-tcpx-installer.yaml
Es dauert etwa zwei Minuten, bis das NCCL-Plug-in gestartet wird.
Prüfen Sie den Status der DaemonSet-Pods:
kubectl get pods -n=kube-system -l=name=nccl-tcpx-installer
Die Ausgabe sieht in etwa so aus:
nccl-tcpx-installer-6c2pv 1/1 Running 0 2m11s nccl-tcpx-installer-qgg82 1/1 Running 0 2m11s
NRI-Geräte-Injector-Plug-in bereitstellen
In diesem Abschnitt erfahren Sie, wie Sie den NRI-Geräte-Injektor mit einem DaemonSet installieren. Für beide H100-GPU-Maschinentypen wird dasselbe NRI-Geräte-Injector-Plug-in installiert. Dieses Plug-in bietet folgende Funktionen:
- Aktiviert die Node Resource Interface (NRI) auf dem Knoten mit H100-GPUs. NRI ist in GKE-Version 1.29 und höher standardmäßig aktiviert.
- Hiermit wird ein NRI-Geräte-Injector-Plug-in-Container bereitgestellt, der GPU-Geräte in durch Pod-Anmerkungen angegebene Container einschleust.
Gehen Sie zum Installieren des Plug-ins so vor:
Prüfen Sie das
nri-device-injector.yaml
-Deployment-Manifest in GitHub.Stellen Sie das DaemonSet bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nri_device_injector/nri-device-injector.yaml
Es dauert etwa zwei Minuten, bis das NCCL-Plug-in gestartet wird.
Prüfen Sie den Status der DaemonSet-Pods:
kubectl get pods -n=kube-system -l=name=device-injector
Die Ausgabe sieht in etwa so aus:
# Output device-injector-md6hb 1/1 Running 0 4h54m device-injector-vh9bm 1/1 Running 0 4h54m
Testarbeitslast bereitstellen
In diesem Abschnitt stellen Sie eine Beispielarbeitslast bereit, um zu prüfen, ob NCCL und GPUDirect-TCPX oder GPUDirect-TCPXO wie erwartet funktionieren. Diese Beispielarbeitslast tut Folgendes:
- Es werden zwei Pods bereitgestellt, die jeweils auf einem Knoten mit H100-GPUs ausgeführt werden.
- Es wird ein Sidecar-Container in jedem Pod bereitgestellt, damit diese Pods GPUDirect-TCPXO oder GPUDirect-TCPX verwenden können.
So stellen Sie diese Beispielarbeitslast bereit:
GPUDirect-TCPXO
Diese Arbeitslast umfasst einen Sidecar-Container namens tcpxo-daemon, in dem ein Dienst ausgeführt wird, mit dem der Pod GPUDirect-TCPXO verwenden kann. Sie müssen diesen Sidecar-Container allen Pods in Ihrer eigenen Umgebung hinzufügen, die GPUDirect-TCPXO verwenden müssen. Ein Auszug der erforderlichen Felder, die Sie Ihren Manifesten hinzufügen müssen, finden Sie unter GPUDirect zu Manifesten hinzufügen.
Sehen Sie sich das
nccl-test-latest.yaml
-Manifest in GitHub an.Stellen Sie zwei Pods mit der Testarbeitslast bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpxo/nccl-test-latest.yaml
Nach der Bereitstellung der Pods einen All-Gather-Test auslösen:
kubectl exec --stdin --tty --container=nccl-test nccl-test-host-1 -- /scripts/allgather.sh nccl-host-1 nccl-host-2
Die Ausgabe sieht in etwa so aus:
# out-of-place in-place # size count type redop root time algbw busbw #wrong time algbw busbw #wrong # (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s) 0 0 float none -1 0.24 0.00 0.00 0 0.18 0.00 0.00 0 0 0 float none -1 0.19 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 0 0 float none -1 0.17 0.00 0.00 0 0.17 0.00 0.00 0 256 4 float none -1 235.2 0.00 0.00 0 235.1 0.00 0.00 0 512 8 float none -1 241.0 0.00 0.00 0 236.1 0.00 0.00 0 1024 16 float none -1 236.3 0.00 0.00 0 233.3 0.00 0.00 0 2048 32 float none -1 234.1 0.01 0.01 0 233.4 0.01 0.01 0 4096 64 float none -1 237.1 0.02 0.02 0 235.3 0.02 0.02 0 8192 128 float none -1 236.2 0.03 0.03 0 235.2 0.03 0.03 0 16384 256 float none -1 236.6 0.07 0.06 0 238.5 0.07 0.06 0 32768 512 float none -1 237.9 0.14 0.13 0 238.8 0.14 0.13 0 65536 1024 float none -1 242.3 0.27 0.25 0 239.4 0.27 0.26 0 131072 2048 float none -1 263.0 0.50 0.47 0 275.1 0.48 0.45 0 262144 4096 float none -1 279.2 0.94 0.88 0 269.9 0.97 0.91 0 524288 8192 float none -1 273.5 1.92 1.80 0 273.5 1.92 1.80 0 1048576 16384 float none -1 315.1 3.33 3.12 0 314.1 3.34 3.13 0 2097152 32768 float none -1 319.2 6.57 6.16 0 311.5 6.73 6.31 0 4194304 65536 float none -1 331.8 12.64 11.85 0 331.3 12.66 11.87 0 8388608 131072 float none -1 356.3 23.54 22.07 0 353.8 23.71 22.23 0 16777216 262144 float none -1 409.1 41.01 38.45 0 405.2 41.40 38.81 0 33554432 524288 float none -1 451.4 74.34 69.69 0 447.7 74.94 70.26 0 67108864 1048576 float none -1 713.4 94.07 88.19 0 713.8 94.01 88.13 0 134217728 2097152 float none -1 1122.1 119.62 112.14 0 1116.3 120.23 112.72 0 268435456 4194304 float none -1 1785.8 150.32 140.92 0 1769.2 151.72 142.24 0 536870912 8388608 float none -1 2859.7 187.74 176.00 0 2852.6 188.20 176.44 0 1073741824 16777216 float none -1 5494.1 195.44 183.22 0 5568.2 192.83 180.78 0 2147483648 33554432 float none -1 10841 198.09 185.71 0 10798 198.88 186.45 0 4294967296 67108864 float none -1 21453 200.21 187.70 0 21490 199.86 187.37 0 8589934592 134217728 float none -1 42603 201.63 189.03 0 42670 201.31 188.73 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 45.7587 #
GPUDirect-TCPX
Diese Arbeitslast umfasst einen Sidecar-Container namens tcpx-daemon, der einen Dienst ausführt, mit dem der Pod GPUDirect-TCPX verwenden kann. Sie müssen diesen Sidecar-Container allen Pods in Ihrer eigenen Umgebung hinzufügen, die GPUDirect-TCPX verwenden müssen. Ein Auszug der erforderlichen Felder, die Sie Ihren Manifesten hinzufügen müssen, finden Sie unter GPUDirect zu Manifesten hinzufügen.
Prüfen Sie das ConfigMap-Manifest
nccl-config.yaml
in GitHub. Dieses Manifest stellt Scripts bereit, die einen NCCL-Allgather-Test initialisieren und NCCL-spezifische Konfigurationseinstellungen festlegen.Prüfen Sie das
nccl-test-latest.yaml
-Deployment-Manifest in GitHub.Stellen Sie die ConfigMap und die Testarbeitslast bereit:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-config.yaml kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/gpudirect-tcpx/nccl-test-latest.yaml
Führen Sie die folgenden Befehle aus, um einen NCCL-Test-All-Gather-Test für die Knoten auszulösen:
kubectl exec \ --stdin --tty --container=nccl-test nccl-test-host-1 \ -- /configs/allgather.sh nccl-host-1 nccl-host-2
Die Ausgabe sieht in etwa so aus:
# out-of-place in-place # size count type redop root time algbw busbw #wrong time algbw busbw #wrong # (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s) 1048576 16384 float none -1 696.8 1.50 1.41 0 729.0 1.44 1.35 0 2097152 32768 float none -1 776.4 2.70 2.53 0 726.7 2.89 2.71 0 4194304 65536 float none -1 774.3 5.42 5.08 0 805.1 5.21 4.88 0 8388608 131072 float none -1 812.1 10.33 9.68 0 817.6 10.26 9.62 0 16777216 262144 float none -1 1035.2 16.21 15.19 0 1067.8 15.71 14.73 0 33554432 524288 float none -1 1183.3 28.36 26.59 0 1211.8 27.69 25.96 0 67108864 1048576 float none -1 1593.4 42.12 39.49 0 1510.5 44.43 41.65 0 134217728 2097152 float none -1 2127.8 63.08 59.13 0 2312.7 58.03 54.41 0 268435456 4194304 float none -1 3603.0 74.50 69.85 0 3586.2 74.85 70.17 0 536870912 8388608 float none -1 7101.7 75.60 70.87 0 7060.9 76.03 71.28 0 # Out of bounds values : 0 OK # Avg bus bandwidth : 29.8293
Erforderliche NCCL-Konfigurationseinstellungen zur Leistungsverbesserung verwenden
Die folgenden Schlüssel/Wert-Paare sind die erforderlichen NCCL-Konfigurationseinstellungen für GPUDirect-TCPX und GPUDirect-TCPXO. Legen Sie beim Bereitstellen Ihrer Arbeitslasten, die NCCL verwenden, diese als Umgebungsvariablen fest, um die Leistung zu optimieren.
GPUDirect-TCPXO
## required
"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/nvidia/lib64\"",
"NCCL_FASTRAK_CTRL_DEV=eth0",
"NCCL_FASTRAK_IFNAME=eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8",
"NCCL_SOCKET_IFNAME=eth0",
"NCCL_CROSS_NIC=0",
"NCCL_ALGO=Ring,Tree",
"NCCL_PROTO=Simple",
"NCCL_MIN_NCHANNELS=4",
"NCCL_TUNER_PLUGIN=libnccl-tuner.so",
"NCCL_TUNER_CONFIG_PATH=/usr/local/nvidia/lib64/a3plus_tuner_config.textproto",
"NCCL_SHIMNET_GUEST_CONFIG_CHECKER_CONFIG_FILE=/usr/local/nvidia/lib64/a3plus_guest_config.textproto",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_FASTRAK_NUM_FLOWS=2",
"NCCL_FASTRAK_USE_SNAP=1",
"NCCL_FASTRAK_PLUGIN_ACCEPT_TIMEOUT_MS=600000",
"NCCL_FASTRAK_ENABLE_CONTROL_CHANNEL=0",
"NCCL_BUFFSIZE=8388608",
"CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_FASTRAK_ENABLE_HOTPATH_LOGGING=0",
"NCCL_FASTRAK_USE_LLCM=1",
"NCCL_NVLS_ENABLE=0"
## recommended, to log NCCL errors
"NCCL_DEBUG=WARN",
"NCCL_DEBUG_SUBSYS=INIT,NET,ENV,COLL,GRAPH"
Optional können Sie alle Konfigurationen gleichzeitig festlegen. Gehen Sie dazu so vor:
Fügen Sie das folgende Schlüssel/Wert-Paar als Umgebungsvariable in das Arbeitslastcontainermanifest ein:
NCCL_LIB_DIR="/usr/local/nvidia/lib64"
Achten Sie darauf, dass das
nccl-env-profile.sh
-Script beim Starten des Arbeitslastcontainers ausgeführt wird. Sie können dies beispielsweise in Ihrer Pod-Spezifikation tun, indem Sie den Befehl des Containers überschreiben, um Folgendes anzugeben:source ${NCCL_LIB_DIR}/nccl-env-profile.sh
GPUDirect-TCPX
"LD_LIBRARY_PATH=\"${LD_LIBRARY_PATH}:/usr/local/tcpx/lib64\"",
"NCCL_SOCKET_IFNAME=\"eth0\"",
"NCCL_ALGO=Ring",
"NCCL_PROTO=Simple",
"NCCL_CROSS_NIC=0",
"NCCL_NET_GDR_LEVEL=PIX",
"NCCL_P2P_PXN_LEVEL=0",
"NCCL_GPUDIRECTTCPX_SOCKET_IFNAME=eth1,eth2,eth3,eth4",
"NCCL_GPUDIRECTTCPX_CTRL_DEV=eth0",
"NCCL_DYNAMIC_CHUNK_SIZE=524288",
"NCCL_P2P_NET_CHUNKSIZE=524288",
"NCCL_P2P_PCI_CHUNKSIZE=524288",
"NCCL_P2P_NVL_CHUNKSIZE=1048576",
"NCCL_BUFFSIZE=4194304",
"NCCL_NSOCKS_PERTHREAD=4",
"NCCL_SOCKET_NTHREADS=1",
"NCCL_GPUDIRECTTCPX_TX_BINDINGS=\"eth1:8-21,112-125;eth2:8-21,112-125;eth3:60-73,164-177;eth4:60-73,164-177\"",
"NCCL_GPUDIRECTTCPX_RX_BINDINGS=\"eth1:22-35,126-139;eth2:22-35,126-139;eth3:74-87,178-191;eth4:74-87,178-191\"",
"NCCL_GPUDIRECTTCPX_PROGRAM_FLOW_STEERING_WAIT_MICROS=500000"
GPUDirect zu Manifesten hinzufügen
In diesem Abschnitt werden die erforderlichen Felder aufgeführt, die Sie Ihren Kubernetes-Manifesten hinzufügen müssen, damit Ihre Pods GPUDirect verwenden können.
Gehen Sie je nach GPUDirect-Typ so vor:
GPUDirect-TCPXO
Fügen Sie den Pod-Metadaten die folgenden Anmerkungen hinzu. Ohne diese Anmerkungen ist
hostNetwork:true
für den Pod undprivileged:true
für dentcpxo-daemon
-Container erforderlich.metadata: annotations: devices.gke.io/container.tcpxo-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm - path: /dev/dmabuf_import_helper networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, {"interfaceName":"eth5","network":"vpc5"}, {"interfaceName":"eth6","network":"vpc6"}, {"interfaceName":"eth7","network":"vpc7"}, {"interfaceName":"eth8","network":"vpc8"} ]
Fügen Sie der Pod-Spezifikation die folgenden Felder hinzu:
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys - name: aperture-devices hostPath: path: /dev/aperture_devices
Fügen Sie dem Manifest den folgenden Container hinzu, um den
tcpxo-daemon
-Dienst auszuführen. Ersetzen Sie (TCPXO_DAEMON_IMAGE
) durch das neueste Bildus-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.12
:- name: tcpxo-daemon image: TCPXO_DAEMON_IMAGE imagePullPolicy: Always command: ["/bin/sh", "-c"] args: - | set -ex chmod 755 /fts/entrypoint_rxdm_container.sh /fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr securityContext: capabilities: add: - NET_ADMIN - NET_BIND_SERVICE volumeMounts: - name: libraries mountPath: /usr/local/nvidia - name: sys mountPath: /hostsysfs - name: proc-sys mountPath: /hostprocsysfs env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Fügen Sie jedem GPU-Container die folgende Umgebungsvariable hinzu:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64 - name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY value: /dev/aperture_devices
Fügen Sie jedem GPU-Container die folgenden volumeMounts hinzu. Ohne
aperture_devices
-Konfigurationen istprivileged:true
für GPU-Container erforderlich:volumeMounts: - name: aperture-devices mountPath: /dev/aperture_devices
Fügen Sie Umgebungsvariablen hinzu, um NCCL-Optionen zu konfigurieren. Weitere Informationen finden Sie unter Empfohlene NCCL-Konfigurationseinstellungen zur Leistungsverbesserung verwenden.
Eine fertige Pod-Spezifikation sieht so aus:
apiVersion: v1
kind: Pod
metadata:
name: a3plus-workloads
annotations:
devices.gke.io/container.tcpxo-daemon: |+
- path: /dev/nvidia0
- path: /dev/nvidia1
- path: /dev/nvidia2
- path: /dev/nvidia3
- path: /dev/nvidia4
- path: /dev/nvidia5
- path: /dev/nvidia6
- path: /dev/nvidia7
- path: /dev/nvidiactl
- path: /dev/nvidia-uvm
- path: /dev/dmabuf_import_helper
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"vpc1"},
{"interfaceName":"eth2","network":"vpc2"},
{"interfaceName":"eth3","network":"vpc3"},
{"interfaceName":"eth4","network":"vpc4"},
{"interfaceName":"eth5","network":"vpc5"},
{"interfaceName":"eth6","network":"vpc6"},
{"interfaceName":"eth7","network":"vpc7"},
{"interfaceName":"eth8","network":"vpc8"}
]
...
containers:
- name: tcpxo-daemon
image: TCPXO_DAEMON_IMAGE
imagePullPolicy: Always
command: ["/bin/sh", "-c"]
args:
- |
set -ex
chmod 755 /fts/entrypoint_rxdm_container.sh
/fts/entrypoint_rxdm_container.sh --num_hops=2 --num_nics=8 --uid= --alsologtostderr
securityContext:
capabilities:
add:
- NET_ADMIN
- NET_BIND_SERVICE
volumeMounts:
- name: libraries
mountPath: /usr/local/nvidia
- name: sys
mountPath: /hostsysfs
- name: proc-sys
mountPath: /hostprocsysfs
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- name: main-application-container
...
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- name: NCCL_FASTRAK_LLCM_DEVICE_DIRECTORY
value: /dev/aperture_devices
securityContext:
volumeMounts:
- name: aperture-devices
mountPath: /dev/aperture_devices
resources:
limits:
nvidia.com/gpu: 8
volumes:
- name: libraries
hostPath:
path: /home/kubernetes/bin/nvidia
- name: sys
hostPath:
path: /sys
- name: proc-sys
hostPath:
path: /proc/sys
- name: aperture-devices
hostPath:
path: /dev/aperture_devices
GPUDirect-TCPX
Fügen Sie den Pod-Metadaten die folgenden Anmerkungen hinzu. Ohne diese Anmerkungen ist
hostNetwork:true
für den Pod undprivileged:true
für dentcpx-daemon
-Container erforderlich.metadata: annotations: devices.gke.io/container.tcpx-daemon: |+ - path: /dev/nvidia0 - path: /dev/nvidia1 - path: /dev/nvidia2 - path: /dev/nvidia3 - path: /dev/nvidia4 - path: /dev/nvidia5 - path: /dev/nvidia6 - path: /dev/nvidia7 - path: /dev/nvidiactl - path: /dev/nvidia-uvm networking.gke.io/default-interface: 'eth0' networking.gke.io/interfaces: | [ {"interfaceName":"eth0","network":"default"}, {"interfaceName":"eth1","network":"vpc1"}, {"interfaceName":"eth2","network":"vpc2"}, {"interfaceName":"eth3","network":"vpc3"}, {"interfaceName":"eth4","network":"vpc4"}, ]
Fügen Sie der Pod-Spezifikation die folgenden Felder hinzu:
spec: volumes: - name: libraries hostPath: path: /home/kubernetes/bin/nvidia/lib64 - name: sys hostPath: path: /sys - name: proc-sys hostPath: path: /proc/sys
Fügen Sie dem Manifest den folgenden Container hinzu, um den Dienst tcpx-daemon auszuführen:
- name: tcpx-daemon image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.9 command: - /tcpgpudmarxd/build/app/tcpgpudmarxd - --gpu_nic_preset - a3vm - --gpu_shmem_type - fd - --uds_path - /run/tcpx - --setup_param - \"--verbose 128 2 0 \" securityContext: capabilities: add: - NET_ADMIN volumeMounts: - name: libraries mountPath: /usr/local/nvidia/lib64 - name: tcpx-socket mountPath: /run/tcpx - name: sys mountPath: /hostsysfs - name: proc-sys mountPath: /hostprocsysfs env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Fügen Sie allen Containern, die GPUs anfordern, die folgenden Volume-Bereitstellungen hinzu:
volumeMounts: - name: tcpx-socket mountPath: /tmp - name: libraries mountPath: /usr/local/nvidia/lib64
Fügen Sie Umgebungsvariablen hinzu, um NCCL-Optionen zu konfigurieren. Weitere Informationen finden Sie in diesem Dokument im Abschnitt Empfohlene NCCL-Konfigurationseinstellungen zur Leistungsverbesserung verwenden.
Fügen Sie jedem GPU-Container die folgende Umgebungsvariable hinzu:
env: - name: LD_LIBRARY_PATH value: /usr/local/nvidia/lib64
Eine fertige Pod-Spezifikation sieht so aus:
apiVersion: v1
kind: Pod
metadata:
name: a3-gpu-workloads-example
labels:
name: a3-gpu-workloads-example
annotations:
devices.gke.io/container.tcpx-daemon: |+
- path: /dev/nvidia0
- path: /dev/nvidia1
- path: /dev/nvidia2
- path: /dev/nvidia3
- path: /dev/nvidia4
- path: /dev/nvidia5
- path: /dev/nvidia6
- path: /dev/nvidia7
- path: /dev/nvidiactl
- path: /dev/nvidia-uvm
networking.gke.io/default-interface: 'eth0'
networking.gke.io/interfaces: |
[
{"interfaceName":"eth0","network":"default"},
{"interfaceName":"eth1","network":"vpc1"},
{"interfaceName":"eth2","network":"vpc2"},
{"interfaceName":"eth3","network":"vpc3"},
{"interfaceName":"eth4","network":"vpc4"}
]
spec:
containers:
- name: tcpx-daemon
image: us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd-dev:v2.0.11
imagePullPolicy: Always
command:
- /tcpgpudmarxd/build/app/tcpgpudmarxd
- --gpu_nic_preset
- a3vm
- --gpu_shmem_type
- fd
- --uds_path
- /run/tcpx
- --setup_param
- \"--verbose 128 2 0 \"
securityContext:
capabilities:
add:
- NET_ADMIN
volumeMounts:
- name: libraries
mountPath: /usr/local/nvidia/lib64
readOnly: true
- name: tcpx-socket
mountPath: /run/tcpx
- name: sys
mountPath: /hostsysfs
- name: proc-sys
mountPath: /hostprocsysfs
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
- name: a3-gpu-workloads-example
...
volumeMounts:
- name: tcpx-socket
mountPath: /tmp
- name: libraries
mountPath: /usr/local/nvidia/lib64
readOnly: true
resources:
limits:
nvidia.com/gpu: 8
env:
- name: LD_LIBRARY_PATH
value: /usr/local/nvidia/lib64
...
volumes:
- name: libraries
hostPath:
path: /home/kubernetes/bin/nvidia/lib64
- name: tcpx-socket
emptyDir:
- name: sys
hostPath:
path: /sys
- name: proc-sys
hostPath:
path: /proc/sys
Nächste Schritte
- Best Practices für GKE-Netzwerke
- Weitere Informationen zu den Nvidia GPUDirect-Technologien für die Datenübertragung und den Zugriff auf Nvidia-GPUs.
- Aktuelle Verfügbarkeit von GPU-Versionen und GPUs in GKE anfordern