Crie uma VM A3 com GPUDirect-TCPX habilitado


A família de máquinas otimizadas para acelerador foi projetada porGoogle Cloud para fornecer o desempenho e a eficiência necessários para cargas de trabalho aceleradas por GPU, como inteligência artificial (IA), aprendizado de máquina (ML) e computação de alto desempenho (HPC).

A série de máquinas otimizadas para acelerador A3 possui 208 vCPUs e até 1.872 GB de memória. Cada tipo de máquina A3 possui oito GPUs NVIDIA H100 conectadas, que oferecem 80 GB de memória GPU por GPU. Essas VMs podem obter até 1.000 Gbps de largura de banda de rede, o que as torna ideais para grandes modelos de linguagem baseados em transformadores, bancos de dados e computação de alto desempenho (HPC).

Ao trabalhar com VMs a3-highgpu-8g ou a3-edgegpu-8g , você pode usar GPUDirect-TCPX para obter a menor latência possível entre aplicativos e a rede. GPUDirect-TCPX é uma pilha de rede personalizada de acesso remoto direto à memória (RDMA) que aumenta o desempenho da rede de suas VMs A3, permitindo que cargas úteis de pacotes de dados sejam transferidas diretamente da memória da GPU para a interface de rede sem precisar passar pela CPU e pela memória do sistema. As VMs A3 podem usar GPUDirect-TCPX combinado com o Google Virtual NIC (gVNIC) para fornecer o maior rendimento entre VMs em um cluster quando comparado aos tipos de máquinas otimizadas para aceleradores A2 ou G2.

Este documento mostra como criar uma VM a3-highgpu-8g ou a3-edgegpu-8g executada em um sistema operacional Container-Optimized OS. Ele também mostra como habilitar GPUDirect-TCPX na VM e configurar e testar o desempenho aprimorado da rede GPU.

Visão geral

Para testar o desempenho da rede com GPUDirect-TCPX, conclua as seguintes etapas:

  1. Configure uma ou mais redes de nuvem privada virtual (VPC) e defina a configuração de MTU (também conhecida como jumbo frames) como 8244 .
  2. Crie suas VMs de GPU usando a imagem cos-105-lts ou posterior do Container-Optimized OS.
  3. Em cada VM, instale os drivers de GPU.
  4. Em cada VM, conceda às placas de interface de rede (NICs) acesso à GPU.
  5. Execute um teste NCCL.

Configurar redes MTU jumbo frame

As VMs a3-highgpu-8g e a3-edgegpu-8g têm cinco NICs físicas . Para obter o melhor desempenho para as NICs físicas, você precisa criar cinco redes de nuvem privada virtual e definir o MTU como 8244 .

Criar rede de gerenciamento, sub-rede e regra de firewall

Conclua as etapas a seguir para configurar a rede de gerenciamento:

  1. Crie a rede de gerenciamento usando 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 gerenciamento usando 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 usando o comando firewall-rules create .

    1. Crie uma regra de firewall para a rede de gerenciamento.

      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 quais endereços IP de origem podem se conectar à sua VM usando 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 icmp que pode ser usada para verificar 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 ser usado para redes e sub-redes da Virtual Private Cloud.
  • PROJECT_ID : seu ID do projeto.
  • REGION : a região onde você deseja criar as redes.
  • SSH_SOURCE_IP_RANGE : intervalo de IP no formato CIDR. Isto especifica quais endereços IP de origem podem se conectar à sua VM usando SSH.

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

Use o comando a seguir 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 obter mais informações sobre como criar redes de nuvem privada virtual, consulte Criar e verificar uma rede MTU jumbo frame .

Crie suas VMs GPU

Para testar o desempenho da rede com GPUDirect-TCPX, é necessário criar pelo menos duas VMs A3.

  1. Crie cada VM usando a imagem cos-105-lts ou posterior do Container-Optimized OS e especificando as redes MTU virtuais que foram criadas na etapa anterior.

    As VMs também devem usar a interface de rede Google Virtual NIC (gVNIC). Para VMs A3, é necessária a versão gVNIC 1.4.0rc3 ou posterior. Esta versão do driver está disponível no Container-Optimized OS.

    A primeira NIC virtual é usada como NIC primária para rede e armazenamento geral, as outras quatro NICs virtuais são alinhadas NUMA com duas das oito GPUs no mesmo switch 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 : seu ID do projeto.
    • ZONE : uma zona que suporta o seu tipo de máquina .
    • MACHINE_TYPE : o tipo de máquina da VM. Especifique a3-highgpu-8g ou a3-edgegpu-8g .
    • NETWORK_NAME_PREFIX : o prefixo do nome a ser usado para redes e sub-redes da Virtual Private Cloud.

Instale drivers de GPU

Em cada VM A3, conclua as etapas a seguir.

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

    sudo cos-extensions install gpu -- --version=latest
    
  2. Monte novamente o caminho executando o seguinte comando:

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

Dê às NICs acesso às GPUs

Em cada VM A3, conceda aos NICs acesso às GPUs concluindo as seguintes etapas:

  1. Configure o registro.

    • Se você estiver usando o Container Registry, execute o seguinte comando:

      docker-credential-gcr configure-docker
      
    • Se você estiver usando o Artifact Registry, execute o seguinte comando:

      docker-credential-gcr configure-docker --registries us-docker.pkg.dev
      
  2. Configure o gerenciador de caminho de dados de recebimento. Um serviço de gerenciamento, GPUDirect-TCPX Receive Data Path Manager, precisa ser executado junto com os aplicativos que usam GPUDirect-TCPX. Para iniciar o serviço em cada VM do Container-Optimized OS, 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 contêiner receive-datapath-manager foi iniciado.

    docker container logs --follow receive-datapath-manager
    

    A saída deve ser semelhante à seguinte:

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

  5. Instale regras da tabela IP.

    sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
    
  6. Configure a NVIDIA Collective Communications Library (NCCL) e o plug-in GPUDirect-TCPX.

    Uma versão específica da biblioteca NCCL e uma combinação binária do plug-in GPUDirect-TCPX são necessárias para usar NCCL com suporte GPUDirect-TCPX. Google Cloud forneceu pacotes que atendem a esse requisito.

    Para instalar o Google Cloud pacote, 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 arquivos libnccl-net.so e libnccl.so serão colocados no diretório /var/lib/tcpx/lib64 .

Execute testes

Em cada VM A3, execute um teste NCCL concluindo as seguintes etapas:

  1. Inicie o contêiner.

    #!/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 completa o seguinte:

    • Monta dispositivos NVIDIA de /dev no contêiner
    • Define o namespace de rede do contêiner para o host
    • Define o namespace do usuário do contêiner para hospedar
    • Adiciona CAP_IPC_LOCK aos recursos do contêiner
    • Monta /tmp do host em /tmp do contêiner
    • Monta o caminho de instalação do plug-in NCCL e GPUDirect-TCPX NCCL no contêiner e adiciona o caminho montado a LD_LIBRARY_PATH
  2. Depois de iniciar o contêiner, os aplicativos que usam NCCL poderão ser executados de dentro do contêiner. Por exemplo, para executar o teste run-allgather , conclua as etapas a seguir:

    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. Em uma VM, execute os seguintes comandos:

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

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

        Isso 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
        

        O script run-allgather leva cerca de dois minutos para ser executado. No final dos logs, você verá os resultados all-gather .

        Se você vir a linha a seguir em seus logs NCCL, isso verifica se o GPUDirect-TCPX foi inicializado com sucesso.

        NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.