GPU-Leistung optimieren


Mit den folgenden Optionen können Sie die Leistung von GPUs auf VM-Instanzen verbessern:

Netzwerkbandbreiten von bis zu 100 Gbit/s verwenden

Sie können höhere Netzwerkbandbreiten verwenden, um die Leistung verteilter Arbeitslasten auf VMs in Compute Engine zu verbessern, die NVIDIA A100, T4, L4 oder V100-GPUs verwenden.

Weitere Informationen zu den Netzwerkbandbreiten, die für Ihre GPU-Instanzen unterstützt werden, finden Sie unter Netzwerkbandbreiten und GPUs.

VMs mit höheren Bandbreiten erstellen

So erstellen Sie eine VM mit angeschlossenen GPUs und einer Netzwerkbandbreite von bis zu 100 Gbit/s:

  1. Prüfen Sie die Mindestkonfiguration von CPU, GPU und Speicher, um die maximale Bandbreite verfügbar zu machen.
  2. Erstellen Sie Ihre VM mit angehängten A100-, T4-, L4- oder V100-GPUs. Weitere Informationen finden Sie unter VM mit angehängten GPUs erstellen. Für diese GPU-VM muss außerdem Folgendes eingerichtet sein:

    Alternativ können Sie eine VM mit einem beliebigen GPU-unterstützten Image aus dem Deep Learning VM-Image-Projekt (DLVM) erstellen. Auf allen GPU-unterstützten DLVM-Images sind der GPU-Treiber, die ML-Software und das gVNIC vorinstalliert. Eine Liste der DLVM-Images finden Sie unter Image auswählen.

    Beispiel

    Wenn Sie beispielsweise eine VM mit einer maximalen Bandbreite von 100 Gbit/s, acht V100-GPUs und dem DLVM-Image tf-latest-gpu erstellen möchten, führen Sie den folgenden Befehl aus:

     gcloud compute instances create VM_NAME \
       --project PROJECT_ID \
       --custom-cpu 96 \
       --custom-memory 624 \
       --image-project=deeplearning-platform-release \
       --image-family=tf-latest-gpu \
       --accelerator type=nvidia-tesla-v100,count=8 \
       --maintenance-policy TERMINATE \
       --metadata="install-nvidia-driver=True"  \
       --boot-disk-size 200GB \
       --network-interface=nic-type=GVNIC \
       --zone=ZONE
    

    Beispiel

    Führen Sie beispielsweise den folgenden Befehl aus, um eine VM mit einer maximalen Bandbreite von 100 Gbit/s, acht AA-GPUs und dem DLVM-Image tf-latest-gpu zu erstellen:

    gcloud compute instances create VM_NAME \
       --project=PROJECT_ID \
       --zone=ZONE \
       --machine-type=a2-highgpu-8g \
       --maintenance-policy=TERMINATE --restart-on-failure \
       --image-family=tf-latest-gpu \
       --image-project=deeplearning-platform-release \
       --boot-disk-size=200GB \
       --network-interface=nic-type=GVNIC \
       --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
       --scopes=https://www.googleapis.com/auth/cloud-platform
    

    Dabei gilt:

    • VM_NAME ist der Name Ihrer VM.
    • PROJECT_ID ist Ihre Projekt-ID.
    • ZONE ist die Zone für die VM. Diese Zone muss den angegebenen GPU-Typ unterstützen. Weitere Informationen zu Zonen finden Sie unter GPU-Regionen und Zonenverfügbarkeit.
  3. Nach dem Erstellen der VM-Instanz können Sie die Netzwerkbandbreite prüfen.

Netzwerkbandbreite prüfen

Wenn Sie mit GPUs mit hoher Bandbreite arbeiten, können Sie ein Netzwerktraffic-Tool wie iperf2 verwenden, um die Netzwerkbandbreite zu messen.

Zur Prüfung von Bandbreitengeschwindigkeiten benötigen Sie mindestens zwei VM mit angeschlossenen GPUs, die die getestete Bandbreitengeschwindigkeit unterstützen. Empfohlene Mindestkonfigurationen für VMs für bestimmte Bandbreiten finden Sie unter VM-Konfigurationen.

Führen Sie mit iPerf auf Debian-basierten Systemen den Benchmark durch.

  1. Zwei VMs erstellen, die die erforderlichen Bandbreitengeschwindigkeiten unterstützen.

  2. Wenn beide VMs ausgeführt werden, stellen Sie eine SSH-Verbindung zu einer der VMs her.

    gcloud compute ssh VM_NAME \
        --project=PROJECT_ID
    

    Dabei gilt:

    • VM_NAME ist der Name der ersten VM
    • PROJECT_ID: Ihre Projekt-ID
  3. Führen Sie auf der ersten VM die folgenden Schritte aus:

    1. Installieren Sie iperf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. Rufen Sie die interne IP-Adresse für diese VM ab. Behalten Sie den Überblick, in dem sie sie aufschreiben.

      ip a
      
    3. Starten Sie den iPerf-Server.

      iperf -s
      

      Dadurch wird ein Server gestartet, der die Verbindungen überwacht, um die Benchmark zu ermitteln. Lassen Sie dies für die Dauer des Tests ausgeführt.

  4. Stellen Sie über ein neues Client-Terminal mit SSH eine Verbindung zur zweiten VM her.

    gcloud compute ssh VM_NAME \
       --project=PROJECT_ID
    

    Dabei gilt:

    • VM_NAME ist der Name der zweiten VM
    • PROJECT_ID: Ihre Projekt-ID
  5. Führen Sie auf der zweiten VM die folgenden Schritte aus:

    1. Installieren Sie iPerf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. Führen Sie den iperf-Test aus und geben Sie die IP-Adresse der ersten VM als Ziel an.

      iperf -t 30 -c internal_ip_of_instance_1 -P 16
      

      Dies führt einen 30-Sekunden-Test aus und generiert ein Ergebnis, das der folgenden Ausgabe ähnelt. Wenn iPerf die andere VM nicht erreichen kann, müssen Sie gegebenenfalls die Netzwerk- oder Firewall-Einstellungen auf den VMs oder in der Cloud Console anpassen.

Beachten Sie die folgenden Hinweise, wenn Sie die maximal verfügbare Bandbreite von 100 Gbit/s verwenden:

  • Aufgrund von Header-Overheads für Protokolle wie Ethernet, IP und TCP auf dem Virtualisierungs-Stack erreicht der Durchsatz, gemessen mit netperf, eine Leistung von etwa 90 Gbit/s.

    TCP kann die Netzwerkgeschwindigkeit von 100 Gbit/s erreichen. Andere Protokolle wie UDP sind derzeit langsamer.

  • Aufgrund von Faktoren wie Protokoll-Overhead und Netzwerküberlastung kann die End-to-End-Leistung von Datenstreams etwas unter 100 Gbit/s liegen.

  • Sie müssen mehrere TCP-Streams verwenden, um die maximale Bandbreite zwischen VM-Instanzen zu erreichen. Google empfiehlt 4–16 Streams. Bei 16 Abläufen wird der Durchsatz häufig maximiert. Je nach Anwendung und Software-Stack müssen Sie möglicherweise die Einstellungen oder den Code anpassen, um mehrere Streams einzurichten.

  • Die Netzwerkbandbreite von 100 Gbit/s kann nur unidirektional erreicht werden. Die Summe von TX + RX wird etwa 100 Gbit/s betragen.

Höhere Bandbreitengeschwindigkeiten für das Netzwerk mit Fast Socket verwenden

Die NVIDIA Collective Communications Library (NCCL) wird von Deep-Learning-Frameworks wie TensorFlow, PyTorch und Horovod für Training mit mehreren GPUs und Knoten verwendet.

Fast Socket ist ein Google-eigener Netzwerktransport für NCCL. In Compute Engine verbessert Fast Socket die Leistung von NCCL in 100-Gbit/s-Netzwerken durch Reduzierung der Konflikte zwischen mehreren TCP-Verbindungen. Weitere Informationen zur Arbeit mit NCCL finden Sie im NCCL-Nutzerhandbuch.

Die aktuelle Evaluierung zeigt, dass Fast Socket den Gesamtdurchsatz um 30 % bis 60 % abhängig von der Nachrichtengröße verbessert.

Zum Einrichten einer Fast Socket-Umgebung können Sie entweder ein Deep Learning-VM-Image oder ein öffentliches Compute Engine-Image verwenden.

Deep Learning-VM-Images verwenden

Zum Einrichten von Fast Socket können Sie eine Deep Learning-VM verwenden. Auf Deep Learning-VM-Images sind der GPU-Treiber, die ML-Software, Fast Socket und gVNIC vorinstalliert.

Diese Images enthalten Folgendes:

  • tf-latest-gpu-debian-10
  • tf-latest-gpu-ubuntu-1804

V100-Beispiel

Führen Sie beispielsweise den folgenden Befehl aus, um eine Debian 10-VM mit einer maximalen Bandbreite von 100 Gbit/s, acht angehängten V100-GPUs und einem Deep Learning-VM-Image mit Fast Socket zu erstellen:

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --custom-cpu=96 \
    --custom-memory=624 \
    --image-project=deeplearning-platform-release \
    --image-family=tf-latest-gpu-debian-10 \
    --accelerator=type=nvidia-tesla-v100,count=8 \
    --maintenance-policy=TERMINATE \
    --metadata="install-nvidia-driver=True"  \
    --network-interface=nic-type=GVNIC \
    --boot-disk-size=200GB

A100-Beispiel

Führen Sie beispielsweise den folgenden Befehl aus, um eine Ubuntu 18.04-VM mit einer maximalen Bandbreite von 100 Gbit/s, acht angehängten A100-GPUs und einem Deep Learning-VM-Image mit Fast Socket zu erstellen:

gcloud compute instances create VM_NAME \
    --project=PROJECT_ID \
    --zone=ZONE \
    --machine-type=a2-highgpu-8g \
    --maintenance-policy=TERMINATE --restart-on-failure \
    --image-family=tf-latest-gpu-ubuntu-1804 \
    --image-project=deeplearning-platform-release \
    --boot-disk-size=200GB \
    --network-interface=nic-type=GVNIC \
    --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
    --scopes=https://www.googleapis.com/auth/cloud-platform

Dabei gilt:

  • VM_NAME ist der Name Ihrer VM.
  • PROJECT_ID ist Ihre Projekt-ID.
  • ZONE ist die Zone für die VM. Diese Zone muss den angegebenen GPU-Typ unterstützen. Weitere Informationen zu Zonen finden Sie unter GPU-Regionen und Zonenverfügbarkeit.

Nach dem Einrichten der Umgebung können Sie prüfen, ob Fast Socket aktiviert ist.

Öffentliche Compute Engine-Images verwenden

Zum Einrichten von Fast Socket können Sie ein öffentliches Compute Engine-Image verwenden. Führen Sie die folgenden Schritte aus, um ein öffentliches Compute Engine-Image zu verwenden:

  1. Erstellen Sie Ihre VM mit angehängten A100-, T4-, L4- oder V100-GPUs. Weitere Informationen finden Sie unter VM mit angehängten GPUs erstellen.

  2. Verwenden Sie dieses Image, um die VM mit angeschlossenen A100-, T4-, L4- oder V100-GPUs zu erstellen. Weitere Informationen finden Sie unter VM mit angehängten GPUs erstellen.

  3. Installieren Sie GPU-Treiber. Weitere Informationen finden Sie unter GPU-Treiber installieren.

  4. Installieren Sie Fast Socket. Eine Anleitung dazu finden Sie unter Fast Socket installieren.

  5. Prüfen Sie, ob Fast Socket aktiviert ist. Eine Anleitung finden Sie unter Prüfen, ob Fast Socket aktiviert ist.

Fast Socket manuell installieren

Bevor Sie Fast Socket auf einer Linux-VM installieren, müssen Sie NCCL installieren. Eine ausführliche Anleitung finden Sie in der NVIDIA NCCL-Dokumentation.

CentOS/RHEL

Führen Sie die folgenden Schritte aus, um Fast Socket auf einer CentOS- oder RHEL-VM herunterzuladen und zu installieren:

  1. Fügen Sie das Paket-Repository hinzu und importieren Sie öffentliche Schlüssel.

    sudo tee /etc/yum.repos.d/google-fast-socket.repo << EOM
    [google-fast-socket]
    name=Fast Socket Transport for NCCL
    baseurl=https://packages.cloud.google.com/yum/repos/google-fast-socket
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
          https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOM
    
  2. Installieren Sie Fast Socket.

    sudo yum install google-fast-socket
    
  3. Prüfen Sie, ob Fast Socket aktiviert ist.

SLES

Führen Sie die folgenden Schritte aus, um Fast Socket auf einer SLES-VM herunterzuladen und zu installieren:

  1. Fügen Sie das Paket-Repository hinzu.

    sudo zypper addrepo https://packages.cloud.google.com/yum/repos/google-fast-socket google-fast-socket
    
  2. Fügen Sie Repository-Schlüssel hinzu.

    sudo rpm --import https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
  3. Installieren Sie Fast Socket.

    sudo zypper install google-fast-socket
    
  4. Prüfen Sie, ob Fast Socket aktiviert ist.

Debian/Ubuntu

Führen Sie die folgenden Schritte aus, um Fast Socket auf eine Debian- oder Ubuntu-VM herunterzuladen und zu installieren:

  1. Fügen Sie das Paket-Repository hinzu.

    echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | sudo tee /etc/apt/sources.list.d/google-fast-socket.list
    
  2. Fügen Sie Repository-Schlüssel hinzu.

    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
  3. Installieren Sie Fast Socket.

    sudo apt update && sudo apt install google-fast-socket
    
  4. Prüfen Sie, ob Fast Socket aktiviert ist.

Aktivierung von Fast Socket prüfen

Führen Sie auf Ihrer VM die folgenden Schritte aus:

  1. Suchen Sie das NCCL-Basisverzeichnis.

    sudo ldconfig -p | grep nccl

    Auf einem DLVM-Image erhalten Sie beispielsweise die folgende Ausgabe:

    libnccl.so.2 (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so.2
    libnccl.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so
    libnccl-net.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl-net.so

    Hier sehen Sie, dass das NCCL-Basisverzeichnis /usr/local/nccl2 ist.

  2. Prüfen Sie, ob NCCL das Fast Socket-Plug-in lädt. Dafür müssen Sie das NCCL-Testpaket herunterladen. Führen Sie den folgenden Befehl aus, um das Testpaket herunterzuladen:

    git clone https://github.com/NVIDIA/nccl-tests.git && \
    cd nccl-tests && make NCCL_HOME=NCCL_HOME_DIRECTORY

    Ersetzen Sie NCCL_HOME_DIRECTORY durch das NCCL-Basisverzeichnis.

  3. Führen Sie im Verzeichnis nccl-tests den Prozess all_reduce_perf aus:

    NCCL_DEBUG=INFO build/all_reduce_perf

    Wenn Fast Socket aktiviert ist, wird im Ausgabelog die Nachricht FastSocket plugin initialized angezeigt.

    # nThread 1 nGpus 1 minBytes 33554432 maxBytes 33554432 step: 1048576(bytes) warmup iters: 5 iters: 20 validation: 1
    #
    # Using devices
    #   Rank  0 Pid  63324 on fast-socket-gpu device  0 [0x00] Tesla V100-SXM2-16GB
    .....
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Flow placement enabled.
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : queue skip: 0
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Using [0]ens12:10.240.0.24
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket plugin initialized
    ......
    

Nächste Schritte