A3 Mega-, A3 High- oder A3 Edge-Instanz mit aktiviertem GPUDirect erstellen

In diesem Dokument wird die Einrichtung für A3 Mega-, A3 High- oder A3 Edge-VM-Instanzen (virtuelle Maschinen) beschrieben, an die acht NVIDIA H100-GPUs angehängt sind und die eine der folgenden GPUDirect-Technologien verwenden: GPUDirect-TCPX oder GPUDirect-TCPXO. Informationen zum Erstellen einer A3 High-Instanz mit weniger als 8 GPUs finden Sie unter A3 High- oder A2-Instanz erstellen.

Die GPUDirect-Technologie, die Sie verwenden, hängt vom ausgewählten A3-Maschinentyp ab.

  • GPUDirect-TCPXO: ist ein RDMA-ähnlicher, ausgelagerter Netzwerkstack, der auf A3 Mega-Maschinentypen (a3-megagpu-8g) mit acht H100-GPUs unterstützt wird.
  • GPUDirect-TCPX: Eine optimierte Version von Gast-TCP, die eine geringere Latenz bietet und auf A3 High- (a3-highgpu-8g) und A3 Edge-Maschinentypen (a3-edgegpu-8g) mit acht H100-GPUs unterstützt wird.

Die accelerator-optimierte A3-Maschinenserie hat 208 vCPUs und bis zu 1.872 GB Arbeitsspeicher. Die Maschinentypen a3-megagpu-8g, a3-highgpu-8g und a3-edgegpu-8g bieten 80 GB GPU-Speicher pro GPU. Diese Maschinentypen können eine Netzwerkbandbreite von bis zu 1.800 Gbit/s nutzen. Sie eignen sich daher ideal für große transformerbasierte Sprachmodelle, Datenbanken und Hochleistungs-Computing (HPC).

Sowohl GPUDirect-TCPX als auch GPUDirect-TCPXO verwenden die NVIDIA GPUDirect-Technologie, um die Leistung zu steigern und die Latenz für Ihre A3-VMs zu verringern. Dies wird erreicht, indem Datennutzlasten direkt vom GPU-Speicher an die Netzwerkschnittstelle übertragen werden, ohne die CPU und den Systemspeicher zu durchlaufen. Dies ist eine Form von Remote Direct Memory Access (RDMA). In Kombination mit Google Virtual NIC (gVNIC) können A3-VMs im Vergleich zu den beschleunigungsoptimierten A2- oder G2-Maschinentypen der vorherigen Generation den höchsten Durchsatz zwischen VMs in einem Cluster erzielen.

In diesem Dokument wird beschrieben, wie Sie eine A3 Mega-, A3 High- oder A3 Edge-VM erstellen und entweder GPUDirect-TCPX oder GPUDirect-TCPXO aktivieren, um die verbesserte GPU-Netzwerkleistung zu testen.

Hinweise

  • Informationen zu Einschränkungen und zusätzlichen erforderlichen Schritten zum Erstellen von Instanzen mit angehängten GPUs, z. B. zum Auswählen eines Betriebssystem-Images und zum Prüfen des GPU-Kontingents, finden Sie unter Übersicht zum Erstellen einer Instanz mit angehängten GPUs.
  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud Dienste und APIs überprüft. Zum Ausführen von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich so bei der Compute Engine authentifizieren:
    1. Installieren Sie die Google Cloud CLI. Initialisieren Sie die Google Cloud CLI nach der Installation mit dem folgenden Befehl:

      gcloud init

      Wenn Sie einen externen Identitätsanbieter (IdP) verwenden, müssen Sie sich zuerst mit Ihrer föderierten Identität in der gcloud CLI anmelden.

    2. Set a default region and zone.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) für das Projekt zu gewähren, um die Berechtigungen zu erhalten, die Sie für die Erstellung von VMs benötigen. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.

Diese vordefinierte Rolle enthält die Berechtigungen, die zum Erstellen von VMs erforderlich sind. Maximieren Sie den Abschnitt Erforderliche Berechtigungen, um die genau erforderlichen Berechtigungen anzuzeigen:

Erforderliche Berechtigungen

Folgende Berechtigungen sind zum Erstellen von VMs erforderlich:

  • compute.instances.create für das Projekt
  • Zum Erstellen der VM mit einem benutzerdefinierten Image: compute.images.useReadOnly für das Image
  • Zum Erstellen der VM mit einem Snapshot: compute.snapshots.useReadOnly für den Snapshot
  • Zum Erstellen der VM mit einer Instanzvorlage: compute.instanceTemplates.useReadOnly für die Instanzvorlage
  • Zum Angeben eines Subnetzes für Ihre VM: compute.subnetworks.use für das Projekt oder für das ausgewählte Subnetz
  • Zum Festlegen einer statischen IP-Adresse für die VM: compute.addresses.use für das Projekt
  • Zum Zuweisen einer externen IP-Adresse zur VM, wenn Sie ein VPC-Netzwerk verwenden: compute.subnetworks.useExternalIp für das Projekt oder für das ausgewählte Subnetz
  • Zum Zuweisen eines Legacy-Netzwerks zur VM: compute.networks.use für das Projekt
  • Zum Zuweisen einer externen IP-Adresse zur VM, wenn Sie ein Legacy-Netzwerk verwenden: compute.networks.useExternalIp für das Projekt
  • Zum Festlegen von Metadaten der VM-Instanz für die VM: compute.instances.setMetadata für das Projekt
  • Zum Festlegen von Tags für die VM: compute.instances.setTags für die VM
  • Zum Festlegen von Labels für die VM: compute.instances.setLabels für die VM
  • Zum Festlegen eines Dienstkontos für die VM: compute.instances.setServiceAccount für die VM
  • Zum Erstellen eines neuen Laufwerks für die VM: compute.disks.create für das Projekt
  • Zum Anhängen eines vorhandenen Laufwerks im Lese- oder Lese-/Schreibmodus: compute.disks.use für das Laufwerk
  • Zum Anhängen eines vorhandenen Laufwerks im Lesemodus: compute.disks.useReadOnly für das Laufwerk

Sie können diese Berechtigungen auch mit benutzerdefinierten Rollen oder anderen vordefinierten Rollen erhalten.

Übersicht

So testen Sie die Netzwerkleistung mit GPUDirect:

  1. Richten Sie ein oder mehrere VPC-Netzwerke (Virtual Private Cloud) mit einer großen konfigurierten MTU ein.
  2. Erstellen Sie Ihre GPU-Instanz.

VPC-Netzwerke einrichten

Damit Ihre GPU-VMs effizient kommunizieren können, müssen Sie ein Verwaltungsnetzwerk und ein oder mehrere Datennetzwerke erstellen. Das Verwaltungsnetzwerk wird für den externen Zugriff, z. B. SSH, und für die meisten allgemeinen Netzwerkkommunikationen verwendet. Die Datennetzwerke werden für die leistungsstarke Kommunikation zwischen den GPUs auf verschiedenen VMs verwendet, z. B. für RDMA-Traffic (Remote Direct Memory Access).

Für diese VPC-Netzwerke empfehlen wir, die maximale Übertragungseinheit (Maximum Transmission Unit, MTU) auf einen höheren Wert festzulegen. Höhere MTU-Werte steigern die Paketgröße und reduzieren den Paketheader-Overhead, wodurch der Nutzlastdatendurchsatz erhöht wird. Weitere Informationen zum Erstellen von VPC-Netzwerken finden Sie unter MTU-Netzwerk im Jumbo Frame erstellen und prüfen.

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 eine SSH-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 nach Problemen mit der Datenübertragung im Netzwerk suchen 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 VPC-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. Hier wird angegeben, welche Quell-IP-Adressen über SSH eine Verbindung zu Ihrer VM herstellen können.

Datennetzwerke, Subnetze und Firewallregeln erstellen

Die Anzahl der Datennetzwerke hängt vom Typ der GPU-Maschine ab, die Sie erstellen.

A3 Mega

Für A3 Mega sind acht Datennetzwerke erforderlich. Verwenden Sie den folgenden Befehl, um acht Datennetzwerke jeweils mit Subnetzen und Firewallregeln zu erstellen.

for N in $(seq 1 8); 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

A3 High und A3 Edge

Für A3 High und A3 Edge sind vier Datennetzwerke erforderlich. 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

A3 Mega-Instanzen erstellen (GPUDirect-TCPXO)

Erstellen Sie Ihre A3-Mega-Instanzen mit dem Container-Optimized OS-Image cos-121-lts oder höher.

COS

Wenn Sie die Netzwerkleistung mit GPUDirect-TCPXO testen möchten, müssen Sie mindestens zwei A3 Mega-VM-Instanzen erstellen. Erstellen Sie jede VM mit dem Container-Optimized OS-Image cos-121-lts oder höher und geben Sie die VPC-Netzwerke an, die Sie im vorherigen Schritt erstellt haben.

A3 Mega-VMs benötigen neun Google Virtual NIC-Netzwerkschnittstellen (gVNIC), eine für das Verwaltungsnetzwerk und acht für die Datennetzwerke.

Wählen Sie je nach Bereitstellungsmodell, das Sie zum Erstellen der VM verwenden möchten, eine der folgenden Optionen aus:

Standard

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --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 \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address

Ersetzen Sie Folgendes:

  • VM_NAME ist der Name Ihrer VM-Instanz.
  • PROJECT_ID: die Projekt-ID.
  • ZONE: eine Zone, die Ihren Maschinentyp unterstützt.
  • BOOT_DISK_SIZE: die Größe des Bootlaufwerks in GB, z. B. 50.
  • NETWORK_NAME_PREFIX: Das Namenspräfix, das für die VPC-Netzwerke und -Subnetze verwendet werden soll.

Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --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 \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

Ersetzen Sie Folgendes:

  • VM_NAME ist der Name Ihrer VM-Instanz.
  • PROJECT_ID: die Projekt-ID.
  • ZONE: eine Zone, die Ihren Maschinentyp unterstützt.
  • BOOT_DISK_SIZE: die Größe des Bootlaufwerks in GB, z. B. 50.
  • NETWORK_NAME_PREFIX: Das Namenspräfix, das für die VPC-Netzwerke und -Subnetze verwendet werden soll.
  • TERMINATION_ACTION: Gibt an, ob die VM bei einem Preemption-Ereignis beendet oder gelöscht werden soll. Geben Sie einen der folgenden Werte an:
    • So beenden Sie die VM: STOP
    • So löschen Sie die VM: DELETE

Flex-Start

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --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 \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

Ersetzen Sie Folgendes:

  • VM_NAME ist der Name Ihrer VM-Instanz.
  • PROJECT_ID: die Projekt-ID.
  • ZONE: eine Zone, die Ihren Maschinentyp unterstützt.
  • BOOT_DISK_SIZE: die Größe des Bootlaufwerks in GB, z. B. 50.
  • NETWORK_NAME_PREFIX: Das Namenspräfix, das für die VPC-Netzwerke und -Subnetze verwendet werden soll.
  • TERMINATION_ACTION: Gibt an, ob die VM am Ende der Laufzeit beendet oder gelöscht werden soll. Geben Sie einen der folgenden Werte an:
    • So beenden Sie die VM: STOP
    • So löschen Sie die VM: DELETE
  • RUN_DURATION: Die maximale Zeit, die die VM ausgeführt wird, bevor Compute Engine sie beendet oder löscht. Sie müssen den Wert als Anzahl der Tage, Stunden, Minuten oder Sekunden gefolgt von d, h, m bzw. s formatieren. Ein Wert von 30m definiert beispielsweise eine Zeit von 30 Minuten und ein Wert von 1h2m3s eine Zeit von einer Stunde, zwei Minuten und drei Sekunden. Sie können einen Wert zwischen 10 Minuten und 7 Tagen angeben.
  • VALID_FOR_DURATION: Die maximale Wartezeit für die Bereitstellung der angeforderten Ressourcen. Sie müssen den Wert als Anzahl der Tage, Stunden, Minuten oder Sekunden gefolgt von d, h, m bzw. s formatieren. Geben Sie basierend auf den zonalen Anforderungen für Ihre Arbeitslast eine der folgenden Zeitspannen an, um die Wahrscheinlichkeit zu erhöhen, dass Ihre Anfrage zum Erstellen von VMs erfolgreich ist:
    • Wenn für Ihre Arbeitslast die Erstellung der VM in einer bestimmten Zone erforderlich ist, geben Sie eine Dauer zwischen 90 Sekunden (90s) und zwei Stunden (2h) an. Bei längeren Zeiträumen ist die Wahrscheinlichkeit höher, dass Sie Ressourcen erhalten.
    • Wenn die VM in einer beliebigen Zone innerhalb der Region ausgeführt werden kann, geben Sie eine Dauer von null Sekunden (0s) an. Dieser Wert gibt an, dass Compute Engine Ressourcen nur zuweist, wenn sie sofort verfügbar sind. Wenn die Erstellungsanfrage fehlschlägt, weil Ressourcen nicht verfügbar sind, wiederholen Sie die Anfrage in einer anderen Zone.

Reservierungsgebunden

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a3-megagpu-8g \
    --maintenance-policy=TERMINATE \
    --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --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 \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-5,subnet=NETWORK_NAME_PREFIX-data-sub-5,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-6,subnet=NETWORK_NAME_PREFIX-data-sub-6,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-7,subnet=NETWORK_NAME_PREFIX-data-sub-7,no-address \
    --network-interface=nic-type=GVNIC,network=NETWORK_NAME_PREFIX-data-net-8,subnet=NETWORK_NAME_PREFIX-data-sub-8,no-address \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

Ersetzen Sie Folgendes:

  • VM_NAME ist der Name Ihrer VM-Instanz.
  • PROJECT_ID: die Projekt-ID.
  • ZONE: eine Zone, die Ihren Maschinentyp unterstützt.
  • BOOT_DISK_SIZE: die Größe des Bootlaufwerks in GB, z. B. 50.
  • NETWORK_NAME_PREFIX: Das Namenspräfix, das für die VPC-Netzwerke und -Subnetze verwendet werden soll.
  • TERMINATION_ACTION: Gibt an, ob die VM am Ende des Reservierungszeitraums beendet oder gelöscht werden soll. Geben Sie einen der folgenden Werte an:
    • So beenden Sie die VM: STOP
    • So löschen Sie die VM: DELETE
  • RESERVATION_URL: die URL der Reservierung, die Sie nutzen möchten. Geben Sie einen der folgenden Werte an:
    • Wenn Sie die Reservierung im selben Projekt erstellt haben: example-reservation
    • Wenn sich die Reservierung in einem anderen Projekt befindet und Ihr Projekt sie verwenden kann: projects/PROJECT_ID/reservations/example-reservation.

GPU-Treiber installieren

Installieren Sie die GPU-Treiber auf jeder A3 Mega-VM.

  1. Installieren Sie die NVIDIA-GPU-Treiber.

    sudo cos-extensions install gpu -- --version=latest
    
  2. Hängen Sie den Pfad wieder ein.

    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-Mega-VM den NICs Zugriff auf die GPUs.

  1. Passen Sie die Firewalleinstellungen an, um alle eingehenden TCP-Verbindungen zu akzeptieren und die Kommunikation zwischen den Knoten in Ihrem Cluster zu ermöglichen:
    sudo /sbin/iptables -I INPUT -p tcp -m tcp -j ACCEPT
  2. Konfigurieren Sie das Modul dmabuf. Laden Sie das Modul import-helper, das Teil des dmabuf-Frameworks ist. Dieses Framework ermöglicht die schnelle, kopierfreie gemeinsame Nutzung des Arbeitsspeichers zwischen der GPU und der Netzwerkkarte (Network Interface Card, NIC), einer wichtigen Komponente für die GPUDirect-Technologie:
    sudo modprobe import-helper
  3. Konfigurieren Sie Docker für die Authentifizierung von Anfragen an Artifact Registry.
    docker-credential-gcr configure-docker --registries us-docker.pkg.dev
  4. Starten Sie RxDM im Container. RxDM ist ein Verwaltungsdienst, der neben der GPU-Anwendung ausgeführt wird, um den GPU-Arbeitsspeicher zu verwalten. Dieser Dienst reserviert und verwaltet GPU-Arbeitsspeicher für eingehenden Netzwerkverkehr. Das ist ein wichtiger Bestandteil der GPUDirect-Technologie und für Hochleistungsnetzwerke unerlässlich. Starten Sie einen Docker-Container mit dem Namen rxdm:
    docker run --pull=always --rm --detach --name rxdm \
        --network=host  --cap-add=NET_ADMIN  \
        --privileged \
        --volume /var/lib/nvidia:/usr/local/nvidia \
        --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 \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64 \
        us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/tcpgpudmarxd-dev:v1.0.19 \
        --num_hops=2 --num_nics=8

    Führen Sie den Befehl aus, um zu prüfen, ob RxDM erfolgreich gestartet wurde. Warten Sie, bis die Meldung „Buffer manager initialization complete“ (Pufferverwaltung initialisiert) angezeigt wird, um die erfolgreiche Initialisierung von RxDM zu bestätigen.

    docker container logs --follow  rxdm

    Alternativ können Sie das Protokoll zum Abschluss der RxDM-Initialisierung prüfen.

    docker container logs rxdm 2>&1 | grep "Buffer manager initialization complete"

NCCL-Umgebung einrichten

Führen Sie auf jeder A3-Mega-VM die folgenden Schritte aus:

  1. Installieren Sie die nccl-net-Bibliothek, ein Plug-in für NCCL, das die GPUDirect-Kommunikation über das Netzwerk ermöglicht.Mit dem folgenden Befehl wird das Installationsprogramm-Image abgerufen und die erforderlichen Bibliotheksdateien in /var/lib/tcpxo/lib64/ installiert.
    NCCL_NET_IMAGE="us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpxo/nccl-plugin-gpudirecttcpx-dev:v1.0.13-1"
    
    docker run --pull=always --rm --privileged \
        --network=host --cap-add=NET_ADMIN \
        --volume /var/lib/nvidia:/usr/local/nvidia  \
        --volume /var/lib:/var/lib \
        --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  \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper  \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} install  --install-nccl
    
    sudo mount --bind /var/lib/tcpxo /var/lib/tcpxo && sudo mount -o remount,exec /var/lib/tcpxo
    
  2. Starten Sie einen dedizierten Container nccl-tests für NCCL-Tests. Dieser Container ist mit den erforderlichen Tools und Dienstprogrammskripten vorkonfiguriert und bietet so eine saubere und konsistente Umgebung zum Überprüfen der GPUDirect-Einrichtungsleistung.

    Bei diesem Befehl wird die Variable NCCL_NET_IMAGE wiederverwendet, die Sie im vorherigen Schritt festgelegt haben.

    docker run --pull=always --rm --detach --name nccl \
        --network=host --cap-add=NET_ADMIN \
        --privileged \
        --volume /var/lib/nvidia:/usr/local/nvidia  \
        --volume /var/lib/tcpxo:/var/lib/tcpxo \
        --shm-size=8g \
        --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 \
        --device /dev/dmabuf_import_helper:/dev/dmabuf_import_helper \
        --env LD_LIBRARY_PATH=/usr/local/nvidia/lib64:/var/lib/tcpxo/lib64 \
        ${NCCL_NET_IMAGE} daemon

Benchmark „nccl-tests“ ausführen

Führen Sie auf einer einzelnen A3 Mega-VM die folgenden Schritte aus, um den Benchmark „nccl-tests“ auszuführen:

  1. Öffnen Sie eine interaktive Bash-Shell im Container nccl-tests.
    docker exec -it nccl bash
  2. Führen Sie in der Bash-Shell des nccl-tests-Containers die folgenden Schritte aus.

    1. Konfigurieren Sie die Umgebung für einen Lauf mit mehreren Knoten, indem Sie SSH einrichten und Hostdateien generieren. Ersetzen Sie VM_NAME_1 und VM_NAME_2 durch die Namen der einzelnen VMs.
      /scripts/init_ssh.sh VM_NAME_1 VM_NAME_2
      /scripts/gen_hostfiles.sh VM_NAME_1 VM_NAME_2
        

      Dadurch wird ein Verzeichnis mit dem Namen /scripts/hostfiles2 erstellt.

    2. Führen Sie den all_gather_perf-Benchmark aus, um die kollektive Kommunikationsleistung zu messen:
      /scripts/run-nccl-tcpxo.sh all_gather_perf "${LD_LIBRARY_PATH}" 8 eth1,eth2,eth3,eth4,eth5,eth6,eth7,eth8 1M 512M 3 2 10 8 2 10

A3 High- und Edge-Instanzen erstellen (GPUDirect-TCPX)

Erstellen Sie Ihre A3-High- und Edge-Instanzen mit dem Container-Optimized OS-Image cos-121-lts oder höher.

COS

Wenn Sie die Netzwerkleistung mit GPUDirect-TCPX testen möchten, müssen Sie mindestens zwei A3 High- oder Edge-VMs erstellen. Erstellen Sie jede VM mit dem cos-121-lts-Image für Container-Optimized OS oder höher und geben Sie die VPC-Netzwerke an, die Sie im vorherigen Schritt erstellt haben.

Die VMs müssen die Netzwerkschnittstelle „Google Virtual NIC“ (gVNIC) verwenden. Für A3-High- oder Edge-VMs müssen Sie den gVNIC-Treiber ab Version 1.4.0rc3 verwenden. Diese Treiberversion ist auf Container-Optimized OS verfügbar. Die erste virtuelle NIC wird als primäre NIC für die allgemeine Netzwerk- und Speichernutzung verwendet. Die anderen vier virtuellen NICs sind NUMA-ausgerichtet und mit zwei der acht GPUs auf demselben PCIe-Switch verbunden.

Wählen Sie je nach Bereitstellungsmodell, das Sie zum Erstellen der VM verwenden möchten, eine der folgenden Optionen aus:

Standard

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --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: die Projekt-ID.
  • ZONE: eine Zone, die Ihren Maschinentyp unterstützt.
  • MACHINE_TYPE: der Maschinentyp für die VM. Geben Sie entweder a3-highgpu-8g oder a3-edgegpu-8g an.
  • BOOT_DISK_SIZE: die Größe des Bootlaufwerks in GB, z. B. 50.
  • NETWORK_NAME_PREFIX: Das Namenspräfix, das für die VPC-Netzwerke und -Subnetze verwendet werden soll.

Spot

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --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 \
    --provisioning-model=SPOT \
    --instance-termination-action=TERMINATION_ACTION

Ersetzen Sie Folgendes:

  • VM_NAME ist der Name Ihrer VM.
  • PROJECT_ID: die Projekt-ID.
  • ZONE: eine Zone, die Ihren Maschinentyp unterstützt.
  • MACHINE_TYPE: der Maschinentyp für die VM. Geben Sie entweder a3-highgpu-8g oder a3-edgegpu-8g an.
  • BOOT_DISK_SIZE: die Größe des Bootlaufwerks in GB, z. B. 50.
  • NETWORK_NAME_PREFIX: Das Namenspräfix, das für die VPC-Netzwerke und -Subnetze verwendet werden soll.
  • TERMINATION_ACTION: Gibt an, ob die VM bei einem Preemption-Ereignis beendet oder gelöscht werden soll. Geben Sie einen der folgenden Werte an:
    • So beenden Sie die VM: STOP
    • So löschen Sie die VM: DELETE

Flex-Start

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --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 \
    --provisioning-model=FLEX_START \
    --instance-termination-action=TERMINATION_ACTION \
    --max-run-duration=RUN_DURATION \
    --request-valid-for-duration=VALID_FOR_DURATION \
    --reservation-affinity=none

Ersetzen Sie Folgendes:

  • VM_NAME ist der Name Ihrer VM.
  • PROJECT_ID: die Projekt-ID.
  • ZONE: eine Zone, die Ihren Maschinentyp unterstützt.
  • MACHINE_TYPE: der Maschinentyp für die VM. Geben Sie entweder a3-highgpu-8g oder a3-edgegpu-8g an.
  • BOOT_DISK_SIZE: die Größe des Bootlaufwerks in GB, z. B. 50.
  • NETWORK_NAME_PREFIX: Das Namenspräfix, das für die VPC-Netzwerke und -Subnetze verwendet werden soll.
  • TERMINATION_ACTION: Gibt an, ob die VM am Ende der Laufzeit beendet oder gelöscht werden soll. Geben Sie einen der folgenden Werte an:
    • So beenden Sie die VM: STOP
    • So löschen Sie die VM: DELETE
  • RUN_DURATION: Die maximale Zeit, die die VM ausgeführt wird, bevor Compute Engine sie beendet oder löscht. Sie müssen den Wert als Anzahl der Tage, Stunden, Minuten oder Sekunden gefolgt von d, h, m bzw. s formatieren. Ein Wert von 30m definiert beispielsweise eine Zeit von 30 Minuten und ein Wert von 1h2m3s eine Zeit von einer Stunde, zwei Minuten und drei Sekunden. Sie können einen Wert zwischen 10 Minuten und 7 Tagen angeben.
  • VALID_FOR_DURATION: Die maximale Wartezeit für die Bereitstellung der angeforderten Ressourcen. Sie müssen den Wert als Anzahl der Tage, Stunden, Minuten oder Sekunden gefolgt von d, h, m bzw. s formatieren. Geben Sie basierend auf den zonalen Anforderungen für Ihre Arbeitslast eine der folgenden Zeitspannen an, um die Wahrscheinlichkeit zu erhöhen, dass Ihre Anfrage zum Erstellen von VMs erfolgreich ist:
    • Wenn für Ihre Arbeitslast die Erstellung der VM in einer bestimmten Zone erforderlich ist, geben Sie eine Dauer zwischen 90 Sekunden (90s) und zwei Stunden (2h) an. Bei längeren Zeiträumen ist die Wahrscheinlichkeit höher, dass Sie Ressourcen erhalten.
    • Wenn die VM in einer beliebigen Zone innerhalb der Region ausgeführt werden kann, geben Sie eine Dauer von null Sekunden (0s) an. Dieser Wert gibt an, dass Compute Engine Ressourcen nur zuweist, wenn sie sofort verfügbar sind. Wenn die Erstellungsanfrage fehlschlägt, weil Ressourcen nicht verfügbar sind, wiederholen Sie die Anfrage in einer anderen Zone.

Reservierungsgebunden

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=cos-121-lts \
    --image-project=cos-cloud \
    --boot-disk-size=BOOT_DISK_SIZE \
    --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 \
    --provisioning-model=RESERVATION_BOUND \
    --instance-termination-action=TERMINATION_ACTION \
    --reservation-affinity=specific \
    --reservation=RESERVATION_URL

Ersetzen Sie Folgendes:

  • VM_NAME ist der Name Ihrer VM.
  • PROJECT_ID: die Projekt-ID.
  • ZONE: eine Zone, die Ihren Maschinentyp unterstützt.
  • MACHINE_TYPE: der Maschinentyp für die VM. Geben Sie entweder a3-highgpu-8g oder a3-edgegpu-8g an.
  • BOOT_DISK_SIZE: die Größe des Bootlaufwerks in GB, z. B. 50.
  • NETWORK_NAME_PREFIX: Das Namenspräfix, das für die VPC-Netzwerke und -Subnetze verwendet werden soll.
  • TERMINATION_ACTION: Gibt an, ob die VM am Ende des Reservierungszeitraums beendet oder gelöscht werden soll. Geben Sie einen der folgenden Werte an:
    • So beenden Sie die VM: STOP
    • So löschen Sie die VM: DELETE
  • RESERVATION_URL: die URL der Reservierung, die Sie nutzen möchten. Geben Sie einen der folgenden Werte an:
    • Wenn Sie die Reservierung im selben Projekt erstellt haben: example-reservation
    • Wenn sich die Reservierung in einem anderen Projekt befindet und Ihr Projekt sie verwenden kann: projects/PROJECT_ID/reservations/example-reservation.

GPU-Treiber installieren

Führen Sie auf jeder A3-High- oder Edge-VM die folgenden Schritte aus.

  1. Führen Sie den folgenden Befehl aus, um die NVIDIA-GPU-Treiber zu installieren:
    sudo cos-extensions install gpu -- --version=latest
  2. Mit dem folgenden Befehl können Sie den Pfad neu bereitstellen:
    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-High- oder Edge-VM den NICs Zugriff auf die GPUs. Gehen Sie dazu so vor:

  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 Manager für den Empfangsdatenpfad. Der Verwaltungsdienst „GPUDirect-TCPX Receive Data Path Manager“ muss neben 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 \
        --privileged \
        --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 receive-datapath-manager-Container 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. Wenn Sie die Protokolle nicht mehr ansehen möchten, drücken Sie ctrl-c.
  5. Installieren Sie IP-Tabellenregeln.
    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
  6. Konfigurieren Sie die NVIDIA Collective Communications Library (NCCL) und das GPUDirect-TCPX-Plug-in.

    Für die Verwendung von NCCL mit GPUDirect-TCPX-Unterstützung sind eine bestimmte NCCL-Bibliotheksversion und eine bestimmte Kombination aus GPUDirect-TCPX-Plug-in-Binärprogrammen 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-High- oder Edge-VM einen NCCL-Test aus. Gehen Sie dazu so vor:

  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 \
       "$@"
    }
    

    Mit dem vorherigen Befehl werden die folgenden Aufgaben ausgeführt:

    • NVIDIA-Geräte von /dev im Container bereitstellen
    • Legt den Netzwerk-Namespace des Containers auf den Host fest
    • Der Nutzer-Namespace des Containers wird auf „host“ festgelegt
    • fügt dem Container die Funktion CAP_IPC_LOCK hinzu
    • /tmp des Hosts wird auf /tmp des Containers bereitgestellt
    • Der Installationspfad von NCCL und das GPUDirect-TCPX-NCCL-Plug-in werden im Container bereitgestellt und der bereitgestellte Pfad wird LD_LIBRARY_PATH hinzugefügt
  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 High- oder Edge-VM Folgendes aus:
      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
    2. Führen Sie auf einer VM die folgenden Befehle aus:
      1. Richten Sie eine 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 run-allgather-Scripts dauert etwa zwei Minuten. Am Ende der Protokolle sehen Sie die all-gather-Ergebnisse.

    Wenn Sie die folgende Zeile in Ihren NCCL-Protokollen sehen, wurde GPUDirect-TCPX erfolgreich initialisiert.

    NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.
    

GPU mit mehreren Instanzen

Eine GPU mit mehreren Instanzen partitioniert eine einzelne NVIDIA-H100-GPU innerhalb derselben VM in bis zu sieben unabhängige GPU-Instanzen. Sie werden gleichzeitig ausgeführt, wobei jede Instanz über eigenen Arbeitsspeicher, Cache und eigene Streaming-Multiprozessoren verfügt. Mit dieser Konfiguration kann die NVIDIA H100-GPU eine konsistente Dienstqualität mit bis zu siebenmal höherer Leistung im Vergleich zu früheren GPU-Modellen bereitstellen.

Sie können bis zu sieben Multi-Instanz-GPUs erstellen. Bei H100-GPUs mit 80 GB werden jeder Multi-Instanz-GPU 10 GB Arbeitsspeicher zugewiesen.

Weitere Informationen zur Verwendung von Multi-Instanz-GPUs finden Sie im NVIDIA-Nutzerhandbuch für Multi-Instanz-GPUs.

Führen Sie folgende Schritte aus, um Multi-Instanz-GPUs zu erstellen:

  1. Erstellen Sie Ihre A3 Mega-, A3 High- oder A3 Edge-Instanzen.

  2. Installieren Sie die GPU-Treiber.

  3. Aktivieren Sie den MIG-Modus. Eine Anleitung finden Sie unter MIG aktivieren.

  4. Konfigurieren Sie Ihre GPU-Partitionen. Eine Anleitung finden Sie unter Mit GPU-Partitionen arbeiten.