Optimiser les performances réseau des GPU avec GPUDirect-TCPX


La famille de machines optimisées pour les accélérateurs est conçue par Google Cloud pour fournir les performances et l'efficacité nécessaires aux charges de travail accélérées par GPU, telles que l'intelligence artificielle (IA), le machine learning (ML) et le calcul hautes performances (HPC).

La série de machines optimisée pour les accélérateurs A3 dispose de 208 processeurs virtuels et de 1 872 Go de mémoire. Chaque type de machine a3-highgpu-8g est associé à huit GPU NVIDIA H100, qui offrent 80 Go de mémoire par GPU. Ces VM peuvent atteindre jusqu'à 1 000 Gbit/s de bande passante réseau, ce qui les rend idéales pour les modèles de langage volumineux basés sur les transformateurs, les bases de données et le calcul hautes performances (HPC).

Lorsque vous travaillez avec des VM a3-highgpu-8g, vous pouvez utiliser GPUDirect-TCPX pour obtenir la latence la plus faible possible entre les applications et le réseau. GPUDirect-TCPX est une pile réseau d'accès à la mémoire directe distante (RDMA) personnalisée qui augmente les performances réseau de vos VM A3 en autorisant le transfert de charges utiles de paquets de données directement de la mémoire GPU vers l'interface réseau sans passer par le processeur et la mémoire système. Les VM A3 peuvent utiliser GPUDirect-TCPX combiné à gVNIC (Google Virtual NIC) pour offrir le débit le plus élevé entre les VM d'un cluster par rapport aux types de machines A2 ou G2 optimisés pour les accélérateurs.

Ce document explique comment utiliser, configurer et tester les performances réseau améliorées de GPU disponibles avec GPUDirect-TCPX sur les VM a3-highgpu-8g qui utilisent Container-Optimized OS.

Présentation

Pour tester les performances du réseau avec GPUDirect-TCPX, procédez comme suit :

  1. Configurez un ou plusieurs réseaux cloud privé virtuel (VPC) et définissez le paramètre MTU (également appelé "trame géante") sur 8244.
  2. Créez vos VM avec GPU à l'aide de l'image cos-105-lts Container-Optimized OS.
  3. Sur chaque VM, installez les pilotes de GPU.
  4. Sur chaque VM, accordez aux cartes d'interface réseau (NIC) l'accès au GPU.
  5. Exécutez un test de la bibliothèque NCCL.

Configurer des réseaux avec une MTU de trame géante

Les VM a3-highgpu-8g disposent de cinq cartes réseau physiques. Pour optimiser les performances des cartes d'interface réseau physiques, vous devez créer cinq réseaux cloud privés virtuels et définir la MTU sur 8244.

Créer un réseau de gestion, un sous-réseau et une règle de pare-feu

Pour configurer le réseau de gestion, procédez comme suit :

  1. Créez le réseau de gestion à l'aide de la commande networks create :

    gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \
      --project=PROJECT_ID \
      --subnet-mode=custom \
      --mtu=8244
    
  2. Créez le sous-réseau de gestion à l'aide de la commande 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. Créez des règles de pare-feu à l'aide de la commande firewall-rules create.

    1. Créez une règle de pare-feu pour le réseau de gestion.

      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. Créez la règle de pare-feu tcp:22 pour limiter les adresses IP sources qui peuvent se connecter à votre VM à l'aide de SSH.

      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. Créez la règle de pare-feu icmp permettant de vérifier les problèmes de transmission de données sur le réseau.

      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
      

Remplacez les éléments suivants :

  • NETWORK_NAME_PREFIX : préfixe de nom à utiliser pour les réseaux et sous-réseaux du cloud privé virtuel.
  • PROJECT_ID : ID de votre projet.
  • REGION : région dans laquelle vous voulez créer les réseaux.
  • SSH_SOURCE_IP_RANGE : plage d'adresses IP au format CIDR. Ce paramètre spécifie les adresses IP sources qui peuvent se connecter à votre VM à l'aide de SSH.

Créer des réseaux de données, des sous-réseaux et une règle de pare-feu

Exécutez la commande suivante pour créer quatre réseaux de données, chacun avec des sous-réseaux et des règles de pare-feu.

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

Pour en savoir plus sur la création de réseaux de cloud privé virtuel, consultez Créer et vérifier un réseau avec une MTU de trame géante.

Créer des VM GPU

Pour tester les performances réseau avec GPUDirect-TCPX, vous devez créer au moins deux VM A3.

  1. Créez chaque VM en utilisant l'image Container-Optimized OS cos-105-lts et en spécifiant les réseaux de MTU virtuels créés à l'étape précédente.

    Les VM doivent également utiliser l'interface réseau de la carte d'interface réseau virtuelle Google (gVNIC). Pour les VM A3, gVNIC version 1.4.0rc3 ou ultérieure est requis. Cette version du pilote est disponible sur Container-Optimized OS.

    La première carte d'interface réseau virtuelle est utilisée comme carte d'interface réseau principale pour le réseau et le stockage généraux. Les quatre autres cartes d'interface réseau virtuelle sont alignées NUMA avec deux des huit GPU sur le même commutateur PCIe.

    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
    

    Remplacez les éléments suivants :

    • VM_NAME : nom de votre VM.
    • PROJECT_ID : ID de votre projet.
    • ZONE : zone de la VM.
    • NETWORK_NAME_PREFIX : préfixe de nom à utiliser pour les réseaux et sous-réseaux du cloud privé virtuel.

Installer des pilotes de GPU.

Sur chaque VM A3, procédez comme suit.

  1. Installez les pilotes de GPU NVIDIA en exécutant la commande suivante :

    sudo cos-extensions install gpu -- --version=latest
    
  2. Réinstallez le chemin en exécutant la commande suivante :

    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    

Accorder aux cartes d'interface réseau l'accès aux GPU

Sur chaque VM A3, accordez aux cartes d'interface réseau l'accès aux GPU en procédant comme suit :

  1. Configurez le registre.

    • Si vous utilisez Container Registry, exécutez la commande suivante :

      docker-credential-gcr configure-docker
      
    • Si vous utilisez Artifact Registry, exécutez la commande suivante :

      docker-credential-gcr configure-docker --registries us-docker.pkg.dev
      
  2. Configurez le gestionnaire de chemins de données de réception. Un service de gestion, GPUDirect-TCPX Receive Data Path Manager, doit s'exécuter avec les applications qui utilisent GPUDirect-TCPX. Pour démarrer le service sur chaque VM Container-Optimized OS, exécutez la commande suivante :

    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. Vérifiez que le conteneur receive-datapath-manager a démarré.

    docker container logs --follow receive-datapath-manager
    

    Le résultat doit ressembler à ceci :

    I0000 00:00:1687813309.406064       1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
    
  4. Pour arrêter d'afficher les journaux, appuyez sur ctrl-c.

  5. Installez les règles de la table IP.

    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
    
  6. Configurez la bibliothèque NVIDIA Collective Communications Library (NCCL) et le plug-in GPUDirect-TCPX.

    Une version spécifique de la bibliothèque NCCL et une combinaison binaire du plug-in GPUDirect-TCPX sont nécessaires pour utiliser la bibliothèque NCCL avec la compatibilité GPUDirect-TCPX. Google Cloud propose des packages qui répondent à cette exigence.

    Pour installer le package Google Cloud, exécutez la commande suivante :

    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
    

    Si cette commande aboutit, les fichiers libnccl-net.so et libnccl.so sont placés dans le répertoire /var/lib/tcpx/lib64.

Exécuter des tests

Sur chaque VM A3, exécutez un test de la bibliothèque NCCL en procédant comme suit :

  1. Démarrez le conteneur.

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

    La commande précédente effectue les opérations suivantes :

    • Installe les appareils NVIDIA à partir de /dev dans le conteneur
    • Définit l'espace de noms réseau du conteneur sur l'hôte
    • Définit l'espace de noms de l'utilisateur du conteneur à héberger
    • Ajoute CAP_IPC_LOCK aux fonctionnalités du conteneur
    • Installe le /tmp de l'hôte sur le /tmp du conteneur
    • Installe le chemin d'installation de la bibliothèque NCCL et le plug-in GPUDirect-TCPX NCCL dans le conteneur, puis ajoute le chemin d'accès installé à LD_LIBRARY_PATH.
  2. Une fois le conteneur démarré, les applications utilisant la bibliothèque NCCL peuvent s'exécuter à partir de l'intérieur du conteneur. Par exemple, pour exécuter le test run-allgather, procédez comme suit :

    1. Sur chaque VM A3, exécutez la commande suivante :

      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
      
    2. Sur une VM, exécutez les commandes suivantes :

      1. Configurez la connexion entre les VM. Remplacez VM-0 et VM-1 par les noms de chaque VM.

        /scripts/init_ssh.sh VM-0 VM-1
        pushd /scripts && /scripts/gen_hostfiles.sh VM-0 VM-1; popd
        

        Un répertoire /scripts/hostfiles2 est alors créé sur chaque VM.

      2. Exécutez le script.

        /scripts/run-allgather.sh 8 eth1,eth2,eth3,eth4 1M 512M 2
        

        L'exécution du script run-allgather prend environ deux minutes. À la fin des journaux, vous verrez les résultats all-gather.

        Si la ligne suivante s'affiche dans les journaux de la bibliothèque NCCL, cela vérifie que GPUDirect-TCPX a bien été initialisé.

        NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.