GPU-Netzwerkleistung mit GPUDirect-TCPX maximieren


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:

  1. Richten Sie Virtual Private Cloud (VPC) MTU-Jumbo Frame-Netzwerke ein.
  2. Erstellen Sie Ihre GPU-VMs mit dem Container-Optimized OS-Image cos-105-lts.
  3. Installieren Sie auf jeder VM die GPU-Treiber.
  4. Gewähren Sie auf jeder VM Netzwerkkarten (NICs) Zugriff auf die GPU.
  5. Führen Sie einen NCCL-Test aus.

MTU-Netzwerke im Jumbo Frame einrichten

a3-highgpu-8gVMs 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:

  1. 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
    
  2. 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
    
  3. Erstellen Sie Firewallregeln mit dem Befehl firewall-rules create.

    1. 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
      
    2. 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
      
    3. 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-ID
  • REGION: 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.

  1. 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-ID
    • ZONE: 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.

  1. Installieren Sie die NVIDIA-GPU-Treiber mit dem folgenden Befehl:

    sudo cos-extensions install gpu -- --version=latest
    
  2. 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:

  1. 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
      
  2. 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"
    
  3. 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...
    
  4. Drücken Sie ctrl-c, um die Logs nicht mehr aufzurufen.

  5. Installieren Sie IP-Tabellenregeln.

    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
    
  6. 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 und libnccl.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:

  1. 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
  2. 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:

    1. 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
      
    2. Führen Sie auf jeder VM die folgenden Befehle aus:

      1. Richten Sie die Verbindung zwischen den VMs ein. Ersetzen Sie VM-0 und VM-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.

      2. 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ür all-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.