Optimiser les performances des GPU

Vous pouvez utiliser les options suivantes pour améliorer les performances des GPU sur les instances de VM :

Désactiver la fonctionnalité Autoboost

Lorsque vous utilisez la fonctionnalité Autoboost avec les GPU NVIDIA® K80, le système ajuste automatiquement la vitesse d'horloge pour trouver la fréquence optimale pour une application donnée. Toutefois, le fait d'ajuster constamment la vitesse de l'horloge peut également réduire les performances de vos GPU. Pour plus d'informations sur la fonctionnalité Autoboost, consultez l'article Increase Performance with GPU Boost and K80 Autoboost ("Augmenter les performances avec les fonctionnalités GPU Boost et Autoboost de Tesla K80").

Nous vous recommandons de désactiver la fonctionnalité Autoboost lorsque vous exécutez des GPU NVIDIA® K80 sur Compute Engine.

Pour désactiver la fonctionnalité Autoboost sur les instances auxquelles sont associés des GPU NVIDIA® K80, exécutez la commande suivante :

sudo nvidia-smi --auto-boost-default=DISABLED

Le résultat ressemble à ce qui suit :

All done.

Régler la vitesse d'horloge du GPU sur la fréquence maximale

Pour définir la vitesse d'horloge du GPU à la fréquence maximale sur les instances auxquelles sont associés des GPU NVIDIA® K80, exécutez la commande suivante :

sudo nvidia-smi --applications-clocks=2505,875

Utiliser des bandes passantes réseau allant jusqu'à 100 Gbit/s

Créer des VM qui utilisent des bandes passantes plus élevées

Vous pouvez utiliser des bandes passantes réseau plus élevées pour améliorer les performances des charges de travail distribuées sur les VM exécutées sur Compute Engine qui utilisent les GPU NVIDIA® A100, T4 ou V100.

Pour plus d'informations sur les bandes passantes réseau compatibles avec vos instances de GPU, consultez la section Bandes passantes réseau et GPU.

Pour créer une VM à laquelle sont associés des GPU et dont la bande passante réseau peut atteindre 100 Gbit/s, procédez comme suit :

  1. Vérifiez la configuration minimale requise pour le processeur, le GPU et la mémoire afin d'obtenir la bande passante maximale disponible.
  2. Créez votre VM avec des GPU A100, T4 ou V100 associés. Consultez la page Créer des VM avec des GPU associés. Cette VM GPU doit également avoir la configuration suivante :

    Vous pouvez également créer une VM à l'aide de n'importe quelle image compatible avec le GPU provenant du projet d'image Deep Learning VM (DLVM). Le pilote de GPU, le logiciel ML et gVNIC sont préinstallés sur toutes les images DLVM compatibles avec les GPU. Pour obtenir la liste des images DLVM, consultez la page Choisir une image.

    Exemple

    Par exemple, pour créer une VM avec une bande passante maximale de 100 Gbit/s, associée à huit GPU V100 et utilisant l'image DLVM tf-latest-gpu, exécutez la commande suivante :

     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
    

    Exemple

    Par exemple, pour créer une VM dotée d'une bande passante maximale de 100 Gbit/s, disposant de huit GPU A100 et utilisant l'image DLVM tf-latest-gpu, exécutez la commande suivante :

    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
    

    Remplacez l'élément suivant :

    • VM_NAME : nom de votre VM.
    • PROJECT_ID : ID de votre projet.
    • ZONE : zone de la VM. Cette zone doit être compatible avec le type de GPU spécifié. Pour en savoir plus sur les zones, consultez la page Disponibilité des GPU dans les régions et zones.
  3. Après avoir créé la VM, vous pouvez vérifier la bande passante réseau.

Vérifier la bande passante réseau

Lorsque vous utilisez des GPU à bande passante élevée, vous pouvez utiliser un outil de trafic réseau, tel que iperf2, pour mesurer la bande passante réseau.

Pour vérifier la vitesse de la bande passante, vous devez disposer d'au moins deux VM auxquelles sont associés des GPU et qui sont compatibles avec la vitesse de bande passante que vous testez. Pour connaître les configurations minimales de VM recommandées pour des bandes passantes spécifiques, consultez la section Configurations de VM.

Utilisez iPerf pour effectuer l'analyse comparative des systèmes basés sur Debian.

  1. Créez deux VM compatibles avec les vitesses de bande passante requises.

  2. Une fois que les deux VM sont en cours d'exécution, utilisez SSH pour vous connecter à l'une des VM.

    gcloud compute ssh VM_NAME \
        --project=PROJECT_ID
    

    Remplacez l'élément suivant :

    • VM_NAME : nom de la première VM
    • PROJECT_ID : ID de votre projet.
  3. Sur la première VM, procédez comme suit :

    1. Installez iperf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. Obtenez l'adresse IP interne de cette VM. Gardez-en une trace en l'écrivant.

      ip a
      
    3. Démarrez le serveur iPerf.

      iperf -s
      

      Cette opération démarre un serveur qui écoute les connexions afin d'effectuer l'analyse comparative. Laissez-la s'exécuter pendant toute la durée du test.

  4. Depuis un nouveau terminal client, connectez-vous à la deuxième VM à l'aide de SSH.

    gcloud compute ssh VM_NAME \
       --project=PROJECT_ID
    

    Remplacez l'élément suivant :

    • VM_NAME : nom de la deuxième VM
    • PROJECT_ID : ID de votre projet.
  5. Sur la deuxième VM, procédez comme suit :

    1. Installez iPerf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. Exécutez le test iperf et définissez l'adresse IP de la première VM comme cible.

      iperf -t 30 -c internal_ip_of_instance_1 -P 16
      

      Cette opération exécute un test de 30 secondes et génère un résultat qui ressemble à ce qui suit. Si iPerf n'est pas en mesure d'accéder à l'autre VM, vous devrez peut-être ajuster le réseau ou les paramètres de pare-feu sur les VM ou dans Cloud Console.

Lorsque vous utilisez la bande passante maximale disponible de 100 Gbit/s, gardez à l'esprit les points suivants :

  • En raison de la surcharge des en-têtes pour les protocoles Ethernet, IP et TCP sur la pile de virtualisation, le débit (mesuré par netperf) sature à environ 90 Gbit/s.

    Le protocole TCP peut atteindre la vitesse réseau de 100 Gbit/s. Les autres protocoles, tels que le protocole UDP, sont actuellement plus lents.

  • En raison de facteurs tels que la surcharge du protocole et la congestion du réseau, les performances de bout en bout des flux de données peuvent être légèrement inférieures à 100 Gbit/s.

  • Vous devez utiliser plusieurs flux TCP pour atteindre la bande passante maximale entre les instances de VM. Google recommande 4 à 16 flux. Avec 16 flux, vous atteindrez fréquemment le débit maximum. En fonction de votre application et de la pile logicielle, vous devrez peut-être ajuster les paramètres ou votre code pour configurer plusieurs flux.

  • La bande passante réseau de 100 Gbit/s n'est atteignable que de façon unidirectionnelle. Vous pouvez vous attendre à ce que la somme des transmissions (TX) et réceptions (RX) soit égale à environ 100 Gbit/s.

Utiliser des vitesses de bande passante réseau plus élevées avec Fast Socket

La bibliothèque NVIDIA Collective Communications Library (NCCL) est utilisée par des frameworks de deep learning, tels que TensorFlow, PyTorch et Horovod, pour entraîner plusieurs GPU et nœuds.

Fast Socket est un service de transport réseau propriétaire de Google pour la bibliothèque NCCL. Sur Compute Engine, Fast Socket améliore les performances de la bibliothèque NCCL sur les réseaux à 100 Gbit/s en limitant les conflits entre plusieurs connexions TCP. Pour en savoir plus sur l'utilisation de la bibliothèque NCCL, consultez le guide de l'utilisateur de la bibliothèque NCCL.

L'évaluation en cours montre que Fast Socket améliore le débit global de 30 à 60 % en fonction de la taille du message.

Pour configurer un environnement Fast Socket, vous pouvez utiliser une instance Deep Learning VM Image ou une image publique Compute Engine.

Utiliser des instances Deep Learning VM Image

Vous pouvez configurer Fast Socket à l'aide d'une instance Deep Learning VM Image. Les instances Deep Learning VM Image sont dotées du pilote de GPU, du logiciel de ML, de Fast Socket et de gVNIC.

Ces images incluent les éléments suivants :

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

Exemple V100

Par exemple, pour créer une VM Debian 10 avec une bande passante maximale de 100 Gbit/s, associée à huit GPU V100 et utilisant une instance Deep Learning VM Image avec Fast Socket, exécutez la commande suivante :

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

Exemple A100

Par exemple, pour créer une VM Ubuntu 18.04 avec une bande passante maximale de 100 Gbit/s, associée à huit GPU A100 et utilisant une instance Deep Learning VM Image avec Fast Socket, exécutez la commande suivante :

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

Remplacez les éléments suivants :

  • VM_NAME : nom de votre VM.
  • PROJECT_ID : ID de votre projet.
  • ZONE : zone de la VM. Cette zone doit être compatible avec le type de GPU spécifié. Pour en savoir plus sur les zones, consultez la page Disponibilité des GPU dans les régions et zones.

Après avoir configuré l'environnement, vous pouvez vérifier que Fast Socket est activé.

Utiliser des images publiques Compute Engine

Vous pouvez configurer Fast Socket à l'aide d'une image publique Compute Engine. Pour utiliser une image publique Compute Engine, procédez comme suit :

  1. Créez votre VM avec des GPU A100, T4 ou V100 associés. Consultez la page Créer des VM avec des GPU associés.

  2. Utilisez cette image pour créer une VM avec des GPU A100, T4 ou V100 associés. Pour en savoir plus, consultez la page Créer des VM auxquelles sont associés des GPU.

  3. Installez des pilotes de GPU. Pour en savoir plus, consultez la page Installer des pilotes de GPU.

  4. Installez Fast Socket. Pour savoir comment procéder, consultez la section Installer manuellement Fast Socket.

  5. Vérifiez que Fast Socket est activé. Pour savoir comment procéder, consultez la section Vérifier que Fast Socket est activé.

Installer manuellement Fast Socket

Avant d'installer Fast Socket sur une VM Linux, vous devez installer la bibliothèque NCCL. Pour obtenir des instructions détaillées, consultez la documentation de la bibliothèque NVIDIA NCCL.

CentOS/RHEL

Pour télécharger et installer Fast Socket sur une VM CentOS ou RHEL, procédez comme suit :

  1. Ajoutez le dépôt de packages et importez des clés publiques.

    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. Installez Fast Socket.

    sudo yum install google-fast-socket
    
  3. Vérifiez que Fast Socket est activé.

SLES

Pour télécharger et installer Fast Socket sur une VM SLES, procédez comme suit :

  1. Ajoutez le dépôt de packages.

    sudo zypper addrepo https://packages.cloud.google.com/yum/repos/google-fast-socket google-fast-socket
    
  2. Ajoutez des clés de dépôt.

    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. Installez Fast Socket.

    sudo zypper install google-fast-socket
    
  4. Vérifiez que Fast Socket est activé.

Debian/Ubuntu

Pour télécharger et installer Fast Socket sur une VM Debian ou Ubuntu, procédez comme suit :

  1. Ajoutez le dépôt de packages.

    echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | sudo tee /etc/apt/sources.list.d/google-fast-socket.list
    
  2. Ajoutez des clés de dépôt.

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

    sudo apt update && sudo apt install google-fast-socket
    
  4. Vérifiez que Fast Socket est activé.

Vérifier que Fast Socket est activé

Sur votre VM, procédez comme suit :

  1. Recherchez le répertoire d'accueil de la bibliothèque NCCL.

    sudo ldconfig -p | grep nccl

    Par exemple, sur une image DLVM, vous obtenez la sortie suivante :

    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

    Le répertoire d'accueil de la bibliothèque NCCL est /usr/local/nccl2.

  2. Vérifiez que la bibliothèque NCCL charge le plug-in Fast Socket. Pour vous en assurer, vous devez télécharger le package de test de la bibliothèque NCCL. Pour télécharger le package de test, exécutez la commande suivante :

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

    Remplacez NCCL_HOME_DIRECTORY par le répertoire d'accueil de la bibliothèque NCCL.

  3. Dans le répertoire nccl-tests, exécutez le processus all_reduce_perf :

    NCCL_DEBUG=INFO build/all_reduce_perf

    Si Fast Socket est activé, le message FastSocket plugin initialized s'affiche dans le journal de sortie.

    # 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
    ......
    

Étapes suivantes