Crie uma VM A3 com o GPUDirect-TCPX ativado


A família de máquinas otimizada para aceleradores foi concebida pela Google Cloud para oferecer o desempenho e a eficiência necessários para cargas de trabalho aceleradas por GPU, como inteligência artificial (IA), aprendizagem automática (ML) e computação de alto desempenho (HPC).

A série de máquinas otimizadas para aceleradores A3 tem 208 vCPUs e até 1872 GB de memória. Cada tipo de máquina A3 tem oito GPUs NVIDIA H100 anexadas, que oferecem 80 GB de memória da GPU por GPU. Estas VMs podem atingir até 1000 Gbps de largura de banda da rede, o que as torna ideais para grandes modelos de linguagem baseados em transformadores, bases de dados e computação de alto desempenho (HPC).

Quando trabalha com VMs a3-highgpu-8g ou a3-edgegpu-8g, pode usar o GPUDirect-TCPX para alcançar a latência mais baixa possível entre as aplicações e a rede. O GPUDirect-TCPX é uma pilha de rede de acesso direto à memória (RDMA) remoto personalizada que aumenta o desempenho da rede das suas VMs A3, permitindo que as cargas úteis de pacotes de dados sejam transferidas diretamente da memória da GPU para a interface de rede sem ter de passar pela CPU e pela memória do sistema. As VMs A3 podem usar o GPUDirect-TCPX combinado com a NIC virtual da Google (gVNIC) para oferecer o débito mais elevado entre VMs num cluster em comparação com os tipos de máquinas otimizados para aceleradores A2 ou G2.

Este documento mostra como criar uma VM a3-highgpu-8g ou a3-edgegpu-8g que é executada num sistema operativo SO otimizado para contentores. Também mostra como ativar o GPUDirect-TCPX na VM e configurar e testar o desempenho de rede da GPU melhorado.

Vista geral

Para testar o desempenho da rede com o GPUDirect-TCPX, conclua os seguintes passos:

  1. Configure uma ou mais redes da nuvem virtual privada (VPC) com uma MTU grande configurada.
  2. Crie as suas VMs com GPU através da imagem do SO otimizado para contentores cos-105-lts ou posterior.
  3. Em cada MV, instale os controladores da GPU.
  4. Em cada VM, conceda às placas de rede (NICs) acesso à GPU.
  5. Execute um teste NCCL.

Configure redes VPC

Para estas redes de VPC, recomendamos que defina a unidade de transmissão máxima (MTU) para um valor superior. Os valores de MTU mais elevados aumentam o tamanho dos pacotes e reduzem a sobrecarga do cabeçalho dos pacotes, o que aumenta o débito de dados da carga útil.

Para maximizar a largura de banda da rede para os tipos de máquinas A3 High, defina a MTU para 8244 bytes. Para rever as definições de MTU recomendadas para outros tipos de máquinas com GPU, consulte o artigo Definições de MTU para tipos de máquinas com GPU.

Crie uma rede de gestão, uma sub-rede e uma regra de firewall

Conclua os passos seguintes para configurar a rede de gestão:

  1. Crie a rede de gestão com o comando networks create:

    gcloud compute networks create NETWORK_NAME_PREFIX-mgmt-net \
      --project=PROJECT_ID \
      --subnet-mode=custom \
      --mtu=8244
    
  2. Crie a sub-rede de gestão com o 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. Crie regras de firewall através do comando firewall-rules create.

    1. Crie uma regra de firewall para a rede de gestão.

      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. Crie a regra de firewall tcp:22 para limitar os endereços IP de origem que podem estabelecer ligação à sua VM através 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. Crie a regra de firewall icmpque pode ser usada para verificar se existem problemas de transmissão de dados na rede.

      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
      

Substitua o seguinte:

  • NETWORK_NAME_PREFIX: o prefixo do nome a usar para as redes e as sub-redes da nuvem privada virtual.
  • PROJECT_ID : o ID do seu projeto.
  • REGION: a região onde quer criar as redes.
  • SSH_SOURCE_IP_RANGE: intervalo de IPs no formato CIDR. Isto especifica que endereços IP de origem podem estabelecer ligação à sua VM através de SSH.

Crie redes de dados, sub-redes e regras de firewall

Use o comando seguinte para criar quatro redes de dados, cada uma com sub-redes e regras 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 mais informações sobre como criar redes de nuvem privada virtual, consulte o artigo Crie e valide uma rede MTU de frames jumbo.

Crie as suas VMs com GPU

Para testar o desempenho da rede com o GPUDirect-TCPX, tem de criar, pelo menos, duas VMs A3.

  1. Crie cada VM usando a imagem do SO otimizado para contentores cos-105-lts ou posterior e especificando as redes MTU virtuais que foram criadas no passo anterior.

    As VMs também têm de usar a interface de rede da NIC virtual da Google (gVNIC). Para VMs A3, é necessária a versão 1.4.0rc3 ou posterior do gVNIC. Esta versão do controlador está disponível no SO otimizado para contentores.

    A primeira NIC virtual é usada como a NIC principal para rede e armazenamento gerais. As outras quatro NICs virtuais estão alinhadas com NUMA com duas das oito GPUs no mesmo comutador 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
    

    Substitua o seguinte:

    • VM_NAME: o nome da sua VM.
    • PROJECT_ID : o ID do seu projeto.
    • ZONE: uma zona que suporta o seu tipo de máquina.
    • MACHINE_TYPE: o tipo de máquina para a VM. Especifique a3-highgpu-8g ou a3-edgegpu-8g.
    • NETWORK_NAME_PREFIX: o prefixo do nome a usar para as redes e as sub-redes da nuvem privada virtual.

Instale controladores da GPU

Em cada VM A3, conclua os seguintes passos.

  1. Instale os controladores da GPU NVIDIA executando o seguinte comando:

    sudo cos-extensions install gpu -- --version=latest
    
  2. Volte a montar o caminho executando o seguinte comando:

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

Conceda às NICs acesso às GPUs

Em cada VM A3, conceda às NICs acesso às GPUs concluindo os seguintes passos:

  1. Configure a base de dados de registo.

    • Se estiver a usar o Container Registry, execute o seguinte comando:

      docker-credential-gcr configure-docker
      
    • Se estiver a usar o Artifact Registry, execute o seguinte comando:

      docker-credential-gcr configure-docker --registries us-docker.pkg.dev
      
  2. Configure o gestor do caminho de receção de dados. Um serviço de gestão, o GPUDirect-TCPX Receive Data Path Manager, tem de ser executado juntamente com as aplicações que usam o GPUDirect-TCPX. Para iniciar o serviço em cada VM do SO otimizado para contentores, execute o seguinte 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 se o contentor receive-datapath-manager foi iniciado.

    docker container logs --follow receive-datapath-manager
    

    O resultado deve ser semelhante ao seguinte:

    I0000 00:00:1687813309.406064       1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
    
  4. Para parar de ver os registos, prima ctrl-c.

  5. Instale regras de tabela de IP.

    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
    
  6. Configure a biblioteca de comunicações coletivas da NVIDIA (NCCL) e o plug-in GPUDirect-TCPX.

    É necessária uma combinação binária específica da versão da biblioteca NCCL e do plugin GPUDirect-TCPX para usar o NCCL com suporte do GPUDirect-TCPX. Google Cloud forneceu pacotes que cumprem este requisito.

    Para instalar o pacote Google Cloud , execute o seguinte 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
    

    Se este comando for bem-sucedido, os ficheiros libnccl-net.so e libnccl.so são colocados no diretório /var/lib/tcpx/lib64.

Execute testes

Em cada VM A3, execute um teste NCCL concluindo os seguintes passos:

  1. Inicie o contentor.

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

    O comando anterior conclui o seguinte:

    • Monta dispositivos NVIDIA de /dev no contentor
    • Define o espaço de nomes de rede do contentor para o anfitrião
    • Define o espaço de nomes do utilizador do contentor como anfitrião
    • Adiciona CAP_IPC_LOCK às capacidades do contentor
    • Monta /tmp do anfitrião em /tmp do contentor
    • Monta o caminho de instalação do NCCL e do plug-in NCCL GPUDirect-TCPX no contentor e adiciona o caminho montado a LD_LIBRARY_PATH
  2. Depois de iniciar o contentor, as aplicações que usam a NCCL podem ser executadas a partir do interior do contentor. Por exemplo, para executar o teste run-allgather, conclua os seguintes passos:

    1. Em cada VM A3, execute o seguinte:

      $ run_tcpx_container -it --rm us-docker.pkg.dev/gce-ai-infra/gpudirect-tcpx/nccl-plugin-gpudirecttcpx shell
      
    2. Numa VM, execute os seguintes comandos:

      1. Configure a ligação entre as VMs. Substitua VM-0 e VM-1 pelos nomes de cada MV.

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

        Isto cria um diretório /scripts/hostfiles2 em cada VM.

      2. Execute o script.

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

        A execução do script run-allgather demora cerca de dois minutos. No final dos registos, são apresentados os resultados all-gather.

        Se vir a seguinte linha nos registos da NCCL, isto confirma que o GPUDirect-TCPX foi inicializado com êxito.

        NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.