Die Beschleunigeroptimierte Maschinenfamilie wurde von Google Cloud entwickelt, um die erforderliche Leistung und Effizienz für GPU-beschleunigte Arbeitslasten wie künstliche Intelligenz (KI), maschinelles Lernen (ML) und Hochleistungs-Computing zu bieten.
Die A3-beschleunigungsoptimierte Maschinenserie hat 208 vCPUs und bis zu 1.872 GB Arbeitsspeicher. An jede A3-VM sind acht NVIDIA H100-GPUs angeschlossen, die 80 GB GPU-Arbeitsspeicher pro GPU bieten. Diese VMs können eine Netzwerkbandbreite von bis zu 1.000 Gbit/s erhalten und eignen sich daher ideal für große Transformer-basierte Sprachmodelle, Datenbanken und Hochleistungs-Computing (HPC).
Wenn Sie mit A3-VMs arbeiten, können Sie GPUDirect-TCPX verwenden, um die niedrigste Latenz zwischen Anwendungen und dem Netzwerk zu erreichen. GPUDirect-TCPX ist ein benutzerdefinierter RFM-Netzwerkstack (Remote Direct Memory Access), der die Netzwerkleistung Ihrer A3-VMs erhöht, indem er Datennutzlasten direkt vom GPU-Speicher an die Netzwerkschnittstelle übertragen kann, ohne die CPU und den Systemspeicher zu durchlaufen. A3-VMs können GPUDirect-TCPX in Kombination mit Google Virtual NIC (gVNIC) verwenden, um den höchsten Durchsatz zwischen VMs in einem Cluster zu liefern im Vergleich zu den A2- oder G2-beschleunigungsoptimierten Maschinentypen.
In diesem Dokument erfahren Sie, wie Sie die verbesserte GPU-Netzwerkleistung einrichten und testen, die mit GPUDirect-TCPX auf A3-VMs mit Container-Optimized OS verfügbar ist.
Überblick
Führen Sie die folgenden Schritte aus, um die Netzwerkleistung mit GPUDirect-TCPX zu testen:
- Richten Sie Virtual Private Cloud (VPC) MTU-Jumbo Frame-Netzwerke ein.
- Erstellen Sie Ihre GPU-VMs mit dem Container-Optimized OS-Image
cos-105-lts
. - Installieren Sie auf jeder VM die GPU-Treiber.
- Gewähren Sie auf jeder VM Netzwerkkarten (NICs) Zugriff auf die GPU.
- Führen Sie einen NCCL-Test aus.
MTU-Netzwerke im Jumbo Frame einrichten
a3-highgpu-8g
VMs habenFünf physische NICs. Sie müssen fünf Virtual Private Cloud-Netzwerke erstellen und die MTU auf 8244
festlegen, um die beste Leistung für die physischen NICs zu erzielen.
Verwaltungsnetzwerk, Subnetz und Firewallregel erstellen
Führen Sie die folgenden Schritte aus, um das Verwaltungsnetzwerk einzurichten:
Erstellen Sie das Verwaltungsnetzwerk mit dem Befehl
networks create
:gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \ --project=PROJECT_ID \ --subnet-mode=custom \ --mtu=8244
Erstellen Sie das Verwaltungssubnetz mit dem Befehl
networks subnets create
:gcloud compute networks subnets create NETWORK_NAME_PREFIX-mgmt-sub \ --project=PROJECT_ID \ --network=NETWORK_NAME_PREFIX-mgmt-net \ --region=REGION \ --range=192.168.0.0/24
Erstellen Sie Firewallregeln mit dem Befehl
firewall-rules create
.Erstellen Sie eine Firewallregel für das Verwaltungsnetzwerk.
gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-internal \ --project=PROJECT_ID \ --network=NETWORK_NAME_PREFIX-mgmt-net \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=192.168.0.0/16
Erstellen Sie die Firewallregel
tcp:22
, um einzuschränken, welche Quell-IP-Adressen über SSH eine Verbindung zu Ihrer VM herstellen können.gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ssh \ --project=PROJECT_ID \ --network=NETWORK_NAME_PREFIX-mgmt-net \ --action=ALLOW \ --rules=tcp:22 \ --source-ranges=SSH_SOURCE_IP_RANGE
Erstellen Sie die Firewallregel
icmp
, mit der Sie auf Probleme bei der Datenübertragung im Netzwerk prüfen können.gcloud compute firewall-rules create NETWORK_NAME_PREFIX-mgmt-external-ping \ --project=PROJECT_ID \ --network=NETWORK_NAME_PREFIX-mgmt-net \ --action=ALLOW \ --rules=icmp \ --source-ranges=0.0.0.0/0
Ersetzen Sie Folgendes:
NETWORK_NAME_PREFIX
: Das Namenspräfix, das für die Virtual Private Cloud-Netzwerke und -Subnetze verwendet werden soll.PROJECT_ID
: Ihre Projekt-IDREGION
: Die Region, in der Sie die Netzwerke erstellen möchten.SSH_SOURCE_IP_RANGE
: IP-Bereich im CIDR-Format. Damit wird angegeben, welche Quell-IP-Adressen über SSH eine Verbindung zu Ihrer VM herstellen können.
Datennetzwerke, Subnetze und Firewallregeln erstellen
Verwenden Sie den folgenden Befehl, um vier Datennetzwerke jeweils mit Subnetzen und Firewallregeln zu erstellen.
for N in $(seq 1 4); do gcloud compute networks create NETWORK_NAME_PREFIX-data-net-$N \ --project=PROJECT_ID \ --subnet-mode=custom \ --mtu=8244 gcloud compute networks subnets create NETWORK_NAME_PREFIX-data-sub-$N \ --project=PROJECT_ID \ --network=NETWORK_NAME_PREFIX-data-net-$N \ --region=REGION \ --range=192.168.$N.0/24 gcloud compute firewall-rules create NETWORK_NAME_PREFIX-data-internal-$N \ --project=PROJECT_ID \ --network=NETWORK_NAME_PREFIX-data-net-$N \ --action=ALLOW \ --rules=tcp:0-65535,udp:0-65535,icmp \ --source-ranges=192.168.0.0/16 done
Weitere Informationen zum Erstellen von Virtual Private Cloud-Netzwerken finden Sie unter MTU-Netzwerk im Jumbo Frame erstellen und prüfen.
GPU-VMs erstellen
Zum Testen der Netzwerkleistung mit GPUDirect-TCPX müssen Sie mindestens zwei A3-VMs erstellen.
Erstellen Sie jede VM mit dem Container-Optimized OS-Image
cos-105-lts
und geben Sie die im vorherigen Schritt erstellten virtuellen MTU-Netzwerke an.Die VMs müssen außerdem die Netzwerkschnittstelle von Google Virtual NIC (gVNIC) verwenden. Für A3-VMs ist gVNIC Version 1.4.0rc3 oder höher erforderlich. Diese Treiberversion ist auf Container-Optimized OS verfügbar.
Die erste virtuelle NIC wird als primäre NIC für allgemeine Netzwerke und Speicher verwendet. Die anderen vier virtuellen NICs sind NUMA, die auf zwei der acht GPUs auf demselben PCIe-Switch ausgerichtet ist.
gcloud compute instances create VM_NAME \ --project=PROJECT_ID \ --zone=ZONE \ --machine-type=a3-highgpu-8g \ --maintenance-policy=TERMINATE --restart-on-failure \ --image-family=cos-105-lts \ --image-project=cos-cloud \ --boot-disk-size=${BOOT_DISK_SZ:-50} \ --metadata=cos-update-strategy=update_disabled \ --scopes=https://www.googleapis.com/auth/cloud-platform \ --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-mgmt-net,subnet=NETWORK_NAME_PREFIX-mgmt-sub \ --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-1,subnet=NETWORK_NAME_PREFIX-data-sub-1,no-address \ --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-2,subnet=NETWORK_NAME_PREFIX-data-sub-2,no-address \ --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-3,subnet=NETWORK_NAME_PREFIX-data-sub-3,no-address \ --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-4,subnet=NETWORK_NAME_PREFIX-data-sub-4,no-address
Ersetzen Sie Folgendes:
VM_NAME
ist der Name Ihrer VM.PROJECT_ID
: Ihre Projekt-IDZONE
: Die Zone für die VM.NETWORK_NAME_PREFIX
: Das Namenspräfix für die Virtual Private Cloud-Netzwerke und -Subnetze.
GPU-Treiber installieren
Führen Sie auf jeder A3-VM die folgenden Schritte aus.
Installieren Sie die NVIDIA-GPU-Treiber mit dem folgenden Befehl:
sudo cos-extensions install gpu -- --version=latest
Stellen Sie den Pfad mit dem folgenden Befehl noch einmal bereit:
sudo mount --bind /var/lib/nvidia /var/lib/nvidia sudo mount -o remount,exec /var/lib/nvidia
NICs Zugriff auf die GPUs gewähren
Gewähren Sie auf jeder A3-VM die NICs Zugriff auf die GPUs, indem Sie die folgenden Schritte ausführen:
Konfigurieren Sie die Registry.
Wenn Sie Container Registry verwenden, führen Sie den folgenden Befehl aus:
docker-credential-gcr configure-docker
Wenn Sie Artifact Registry verwenden, führen Sie den folgenden Befehl aus:
docker-credential-gcr configure-docker --registries us-docker.pkg.dev
Konfigurieren Sie den Datenpfadmanager für den Empfang. Ein Verwaltungsdienst, GPUDirect-TCPX Receive Data Path Manager, muss zusammen mit den Anwendungen ausgeführt werden, die GPUDirect-TCPX verwenden. Führen Sie den folgenden Befehl aus, um den Dienst auf jeder VM mit Container-Optimized OS zu starten:
docker run --pull=always --rm \ --name receive-datapath-manager \ --detach \ --cap-add=NET_ADMIN --network=host \ --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \ --device /dev/nvidia0:/dev/nvidia0 \ --device /dev/nvidia1:/dev/nvidia1 \ --device /dev/nvidia2:/dev/nvidia2 \ --device /dev/nvidia3:/dev/nvidia3 \ --device /dev/nvidia4:/dev/nvidia4 \ --device /dev/nvidia5:/dev/nvidia5 \ --device /dev/nvidia6:/dev/nvidia6 \ --device /dev/nvidia7:/dev/nvidia7 \ --device /dev/nvidia-uvm:/dev/nvidia-uvm \ --device /dev/nvidiactl:/dev/nvidiactl \ --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \ --volume /run/tcpx:/run/tcpx \ --entrypoint /tcpgpudmarxd/build/app/tcpgpudmarxd \ us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/tcpgpudmarxd \ --gpu_nic_preset a3vm --gpu_shmem_type fd --uds_path "/run/tcpx" --setup_param "--verbose 128 2 0"
Prüfen Sie, ob der Container
receive-datapath-manager
gestartet wurde.docker container logs --follow receive-datapath-manager
Die Ausgabe sollte in etwa so aussehen:
I0000 00:00:1687813309.406064 1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
Drücken Sie
ctrl-c
, um die Logs nicht mehr aufzurufen.Installieren Sie IP-Tabellenregeln.
sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
Konfigurieren Sie das NVIDIA Collective Communications Library (NCCL) und GPUDirect-TCPX-Plug-in.
Für die Verwendung von NCCL mit GPUDirect-TCPX-Unterstützung ist eine bestimmte Kombination der NCCL-Bibliotheksversion und des GPUDirect-TCPX-Plug-ins erforderlich. Google Cloud hat Pakete bereitgestellt, die diese Anforderung erfüllen.
Führen Sie den folgenden Befehl aus, um das Google Cloud-Paket zu installieren:
docker run --rm -v /var/lib:/var/lib us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx install --install-nccl sudo mount --bind /var/lib/tcpx /var/lib/tcpx sudo mount -o remount,exec /var/lib/tcpx
Wenn dieser Befehl erfolgreich ist, werden die Dateien
libnccl-net.so
undlibnccl.so
im Verzeichnis/var/lib/tcpx/lib64
abgelegt.
Tests ausführen
Führen Sie auf jeder A3-VM einen NCCL-Test aus. Führen Sie dazu die folgenden Schritte aus:
Starten Sie den Container.
#!/bin/bash function run_tcpx_container() { docker run \ -u 0 --network=host \ --cap-add=IPC_LOCK \ --userns=host \ --volume /run/tcpx:/tmp \ --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \ --volume /var/lib/tcpx/lib64:/usr/local/tcpx/lib64 \ --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \ --device /dev/nvidia0:/dev/nvidia0 \ --device /dev/nvidia1:/dev/nvidia1 \ --device /dev/nvidia2:/dev/nvidia2 \ --device /dev/nvidia3:/dev/nvidia3 \ --device /dev/nvidia4:/dev/nvidia4 \ --device /dev/nvidia5:/dev/nvidia5 \ --device /dev/nvidia6:/dev/nvidia6 \ --device /dev/nvidia7:/dev/nvidia7 \ --device /dev/nvidia-uvm:/dev/nvidia-uvm \ --device /dev/nvidiactl:/dev/nvidiactl \ --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/usr/local/tcpx/lib64 \ "$@" }
Der vorherige Befehl führt Folgendes aus:
- Stellt NVIDIA-Geräte aus
/dev
im Container bereit - Legt den Netzwerk-Namespace des Containers auf den Host fest.
- Legt den Nutzer-Namespace des zu hostenden Containers fest
- Fügt den Funktionen des Containers
CAP_IPC_LOCK
hinzu. - Stellt
/tmp
des Hosts in/tmp
des Containers bereit - Stellt den Installationspfad des NCCL- und GPUDirect-TCPX-NCCL-Plug-ins im Container bereit und fügt den bereitgestellten Pfad zu
LD_LIBRARY_PATH
hinzu
- Stellt NVIDIA-Geräte aus
Nachdem Sie den Container gestartet haben, können Anwendungen, die NCCL verwenden, innerhalb des Containers ausgeführt werden. So führen Sie beispielsweise den Test
run-allgather
aus:Führen Sie auf jeder A3-VM den folgenden Befehl aus:
$ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
Führen Sie auf jeder VM die folgenden Befehle aus:
Richten Sie die Verbindung zwischen den VMs ein. Ersetzen Sie
VM-0
undVM-1
durch die Namen der einzelnen VMs./scripts/init_ssh.sh VM-0 VM-1 pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd
Dadurch wird auf jeder VM ein
/scripts/hostfiles2
-Verzeichnis erstellt.Führen Sie das Skript aus.
/scripts/run-allgather.sh 8 eth1,eth2,eth3,eth4 1M 512M 2
Die Ausführung des Skripts
run-allgather
dauert etwa zwei Minuten. Am Ende der Logs sehen Sie die Ergebnisse fürall-gather
.Wenn Sie die folgende Zeile in Ihren NCCL-Logs sehen, bedeutet dies, dass GPUDirect-TCPX erfolgreich initialisiert wurde.
NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.