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ées pour les accélérateurs A3 dispose de 208 processeurs virtuels et de 1 872 Go de mémoire. Chaque VM A3 est associée à 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 grands modèles de langage, les bases de données et le calcul hautes performances (HPC).
Lorsque vous travaillez avec des VM A3, 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 associé à la carte d'interface réseau virtuelle Google (gVNIC) pour fournir le débit le plus élevé entre les VM d'un cluster par rapport aux types de machines optimisés pour les accélérateurs A2 ou G2.
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 qui utilisent Container-Optimized OS.
Présentation
Pour tester les performances du réseau avec GPUDirect-TCPX, procédez comme suit :
- Configurez des réseaux de trame géante de cloud privé virtuel (VPC).
- Créez vos VM GPU à l'aide de l'image
cos-105-lts
Container-Optimized OS. - Sur chaque VM, installez les pilotes de GPU.
- Sur chaque VM, autorisez les cartes d'interface réseau à accéder au GPU.
- Exécutez un test 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 à l'aide de 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 la mise en réseau et le stockage généraux. Les quatre autres cartes d'interface réseau virtuelles sont identiques à NUMA avec deux des huit GPU du 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
Autorisez les cartes d'interface réseau à accéder 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 chemin de réception des données. 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 \ --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
La sortie doit ressembler à ceci :
I0000 00:00:1687813309.406064 1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
Pour arrêter l'affichage des journaux, appuyez sur
ctrl-c
.Installez les règles de 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 de plug-in GPUDirect-TCPX sont nécessaires pour utiliser NCCL avec la compatibilité GPUDirect-TCPX. Google Cloud a fourni 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 depuis
/dev
vers le conteneur - Définit l'espace de noms réseau du conteneur sur l'hôte
- Définit l'espace de noms utilisateur du conteneur sur l'hôte
- 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 depuis
Après avoir démarré le conteneur, les applications utilisant NCCL peuvent s'exécuter depuis 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
Cela crée un répertoire
/scripts/hostfiles2
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, les résultatsall-gather
s'afficheront.Si la ligne suivante s'affiche dans les journaux de la bibliothèque NCCL, cela signifie que l'initialisation de GPUDirect-TCPX est réussie.
NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.