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 :
- Configurez un ou plusieurs réseaux cloud privé virtuel (VPC) et définissez le paramètre MTU (également appelé "trame géante") sur
8244
. - Créez vos VM avec GPU à l'aide de l'image
cos-105-lts
Container-Optimized OS. - Sur chaque VM, installez les pilotes de GPU.
- Sur chaque VM, accordez aux cartes d'interface réseau (NIC) l'accès au GPU.
- 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 :
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
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
Créez des règles de pare-feu à l'aide de la commande
firewall-rules create
.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
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
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.
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.
Installez les pilotes de GPU NVIDIA en exécutant la commande suivante :
sudo cos-extensions install gpu -- --version=latest
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 :
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
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"
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...
Pour arrêter d'afficher les journaux, appuyez sur
ctrl-c
.Installez les règles de la table IP.
sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
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
etlibnccl.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 :
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
.
- Installe les appareils NVIDIA à partir de
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 :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
Sur une VM, exécutez les commandes suivantes :
Configurez la connexion entre les VM. Remplacez
VM-0
etVM-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.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ésultatsall-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.