Cree una máquina virtual A3 con GPUDirect-TCPX habilitado


La familia de máquinas con acelerador optimizado está diseñada porGoogle Cloud para ofrecer el rendimiento y la eficiencia necesarios para cargas de trabajo aceleradas por GPU, como inteligencia artificial (IA), aprendizaje automático (ML) y computación de alto rendimiento (HPC).

La serie de máquinas optimizadas para acelerador A3 tiene 208 vCPU y hasta 1872 GB de memoria. Cada tipo de máquina A3 tiene ocho GPU NVIDIA H100 conectadas, lo que ofrece 80 GB de memoria GPU por GPU. Estas máquinas virtuales pueden obtener hasta 1000 Gbps de ancho de banda de red, lo que las hace ideales para grandes modelos de lenguajes basados ​​en transformadores, bases de datos y computación de alto rendimiento (HPC).

Cuando trabaje con máquinas virtuales a3-highgpu-8g o a3-edgegpu-8g , puede usar GPUDirect-TCPX para lograr la latencia más baja posible entre las aplicaciones y la red. GPUDirect-TCPX es una pila de red personalizada de acceso remoto directo a memoria (RDMA) que aumenta el rendimiento de la red de sus máquinas virtuales A3 al permitir que las cargas útiles de paquetes de datos se transfieran directamente desde la memoria de la GPU a la interfaz de red sin tener que pasar por la CPU y la memoria del sistema. Las máquinas virtuales A3 pueden usar GPUDirect-TCPX combinado con Google Virtual NIC (gVNIC) para ofrecer el mayor rendimiento entre máquinas virtuales en un clúster en comparación con los tipos de máquinas optimizadas para acelerador A2 o G2.

Este documento le muestra cómo crear una máquina virtual a3-highgpu-8g o a3-edgegpu-8g que se ejecute en un sistema operativo con sistema operativo optimizado para contenedores. También muestra cómo habilitar GPUDirect-TCPX en la VM y configurar y probar el rendimiento mejorado de la red GPU.

Descripción general

Para probar el rendimiento de la red con GPUDirect-TCPX, complete los siguientes pasos:

  1. Configure una o más redes de nube privada virtual (VPC) y establezca la configuración de MTU (también conocida como tramas gigantes) en 8244 .
  2. Cree sus máquinas virtuales con GPU utilizando la imagen del sistema operativo optimizado para contenedores cos-105-lts o posterior.
  3. En cada VM, instale los controladores de GPU.
  4. En cada VM, dé acceso a la GPU a las tarjetas de interfaz de red (NIC).
  5. Ejecute una prueba NCCL.

Configurar redes MTU de trama gigante

Las máquinas virtuales a3-highgpu-8g y a3-edgegpu-8g tienen cinco NIC físicas ; para obtener el mejor rendimiento para las NIC físicas, debe crear cinco redes de nube privada virtual y configurar la MTU en 8244 .

Crear red de administración, subred y regla de firewall

Complete los siguientes pasos para configurar la red de administración:

  1. Cree la red de administración utilizando el comando networks create :

    gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \
      --project=PROJECT_ID \
      --subnet-mode=custom \
      --mtu=8244
    
  2. Cree la subred de administración utilizando el comando 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. Cree reglas de firewall utilizando el comando firewall-rules create .

    1. Cree una regla de firewall para la red de administración.

      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. Cree la regla de firewall tcp:22 para limitar qué direcciones IP de origen pueden conectarse a su VM mediante 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. Cree la regla de firewall icmp que se puede usar para verificar si hay problemas de transmisión de datos en la red.

      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
      

Reemplace lo siguiente:

  • NETWORK_NAME_PREFIX : el prefijo de nombre que se utilizará para las redes y subredes de la Nube Privada Virtual.
  • PROJECT_ID : su ID de proyecto.
  • REGION : la región donde desea crear las redes.
  • SSH_SOURCE_IP_RANGE : rango de IP en formato CIDR. Esto especifica qué direcciones IP de origen pueden conectarse a su VM mediante SSH.

Cree redes de datos, subredes y reglas de firewall

Utilice el siguiente comando para crear cuatro redes de datos, cada una con subredes y reglas de firewall.

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

Para obtener más información sobre cómo crear redes de nube privada virtual, consulte Crear y verificar una red MTU de trama gigante .

Cree sus máquinas virtuales GPU

Para probar el rendimiento de la red con GPUDirect-TCPX, debe crear al menos dos máquinas virtuales A3.

  1. Cree cada máquina virtual utilizando la imagen del sistema operativo optimizado para contenedores cos-105-lts o posterior y especificando las redes MTU virtuales que se crearon en el paso anterior.

    Las máquinas virtuales también deben utilizar la interfaz de red Google Virtual NIC (gVNIC). Para máquinas virtuales A3, se requiere gVNIC versión 1.4.0rc3 o posterior. Esta versión del controlador está disponible en el sistema operativo optimizado para contenedores.

    La primera NIC virtual se utiliza como NIC principal para redes y almacenamiento generales; las otras cuatro NIC virtuales están alineadas con NUMA con dos de las ocho GPU en el mismo conmutador PCIe.

    gcloud compute instances create VM_NAME \
      --project=PROJECT_ID \
      --zone=ZONE \
      --machine-type=MACHINE_TYPE \
      --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
    

    Reemplace lo siguiente:

    • VM_NAME : el nombre de su VM.
    • PROJECT_ID : su ID de proyecto.
    • ZONE : una zona que admite su tipo de máquina .
    • MACHINE_TYPE : el tipo de máquina para la VM. Especifique a3-highgpu-8g o a3-edgegpu-8g .
    • NETWORK_NAME_PREFIX : el prefijo de nombre que se utilizará para las redes y subredes de la Nube Privada Virtual.

Instalar controladores de GPU

En cada máquina virtual A3, complete los siguientes pasos.

  1. Instale los controladores de GPU NVIDIA ejecutando el siguiente comando:

    sudo cos-extensions install gpu -- --version=latest
    
  2. Vuelva a montar la ruta ejecutando el siguiente comando:

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

Dar acceso a las NIC a las GPU

En cada máquina virtual A3, otorgue acceso a las NIC a las GPU completando los siguientes pasos:

  1. Configurar el registro.

    • Si está utilizando Container Registry, ejecute el siguiente comando:

      docker-credential-gcr configure-docker
      
    • Si está utilizando Artifact Registry, ejecute el siguiente comando:

      docker-credential-gcr configure-docker --registries us-docker.pkg.dev
      
  2. Configure el administrador de ruta de recepción de datos. Un servicio de gestión, GPUDirect-TCPX Receiver Data Path Manager, debe ejecutarse junto con las aplicaciones que utilizan GPUDirect-TCPX. Para iniciar el servicio en cada máquina virtual con sistema operativo optimizado para contenedores, ejecute el siguiente comando:

    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. Verifique que se haya iniciado el contenedor receive-datapath-manager .

    docker container logs --follow receive-datapath-manager
    

    El resultado debería parecerse al siguiente:

    I0000 00:00:1687813309.406064       1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
    
  4. Para dejar de ver los registros, presione ctrl-c .

  5. Instalar reglas de la tabla de IP.

    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
    
  6. Configure la biblioteca de comunicaciones colectivas de NVIDIA (NCCL) y el complemento GPUDirect-TCPX.

    Se requiere una versión específica de la biblioteca NCCL y una combinación binaria del complemento GPUDirect-TCPX para usar NCCL con soporte GPUDirect-TCPX. Google Cloud ha proporcionado paquetes que cumplen con este requisito.

    Para instalar el Google Cloud paquete, ejecute el siguiente comando:

    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 este comando tiene éxito, los archivos libnccl-net.so y libnccl.so se colocan en el directorio /var/lib/tcpx/lib64 .

Ejecutar pruebas

En cada máquina virtual A3, ejecute una prueba NCCL completando los siguientes pasos:

  1. Inicie el contenedor.

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

    El comando anterior completa lo siguiente:

    • Monta dispositivos NVIDIA desde /dev en el contenedor
    • Establece el espacio de nombres de red del contenedor para el host
    • Establece el espacio de nombres de usuario del contenedor para alojar
    • Agrega CAP_IPC_LOCK a las capacidades del contenedor.
    • Monta /tmp del host en /tmp del contenedor
    • Monta la ruta de instalación de NCCL y el complemento GPUDirect-TCPX NCCL en el contenedor y agrega la ruta montada a LD_LIBRARY_PATH
  2. Después de iniciar el contenedor, las aplicaciones que usan NCCL pueden ejecutarse desde dentro del contenedor. Por ejemplo, para ejecutar la prueba run-allgather , complete los siguientes pasos:

    1. En cada máquina virtual A3, ejecute lo siguiente:

      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
      
    2. En una máquina virtual, ejecute los siguientes comandos:

      1. Configure la conexión entre las máquinas virtuales. Reemplace VM-0 y VM-1 con los nombres de cada VM.

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

        Esto crea un directorio /scripts/hostfiles2 en cada VM.

      2. Ejecute el script.

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

        El script run-allgather tarda unos dos minutos en ejecutarse. Al final de los registros, verá all-gather .

        Si ve la siguiente línea en sus registros NCCL, esto verifica que GPUDirect-TCPX se inicializó correctamente.

        NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.