A família de máquinas com otimização para aceleradores foi projetada pelo Google Cloud para oferecer o desempenho e a eficiência necessários às cargas de trabalho aceleradas por GPU, como inteligência artificial (IA), machine learning (ML) e computação de alto desempenho (HPC).
A série de máquinas com otimização para aceleradores A3 tem 208 vCPUs e até 1872 GB de memória. Cada tipo de máquina a3-highgpu-8g
tem oito
GPUs NVIDIA H100 conectadas, o que oferece 80 GB de memória de GPU por GPU. Essas VMs podem
ter 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, na sigla em inglês).
Ao trabalhar com VMs a3-highgpu-8g
, é possível usar o GPUDirect-TCPX para alcançar a
menor latência possível entre aplicativos e a rede.
GPUDirect-TCPX é uma pilha de rede personalizada e remota de acesso direto à memória (RDMA, na sigla em inglês) que aumenta o desempenho da rede das VMs A3, permitindo que os payloads de pacotes de dados sejam transferidos diretamente da memória GPU para a interface de rede sem precisar passar pela CPU e pela memória do sistema.
As VMs A3 podem usar o GPUDirect-TCPX combinado com a placa de rede virtual do Google (gVNIC) para oferecer a maior capacidade entre as VMs em um cluster, em comparação com os tipos de máquina otimizados por acelerador A2 ou G2.
Neste documento, mostramos como configurar e testar o desempenho aprimorado
da rede GPU que está disponível com o GPUDirect-TCPX em VMs a3-highgpu-8g
que usam
o Container-Optimized OS.
Visão geral
Para testar o desempenho da rede com o GPUDirect-TCPX, siga estas etapas:
- Configure uma ou mais redes de nuvem privada virtual (VPC) e defina a
configuração MTU (também conhecida como jumbo frames) como
8244
. - Crie suas VMs de GPU usando a imagem
cos-105-lts
do Container-Optimized OS. - Em cada VM, instale os drivers da GPU.
- Em cada VM, conceda acesso à GPU às placas de interface de rede (NICs).
- Execute um teste da NCCL.
Configurar redes MTU jumbo frame
a3-highgpu-8g
As VMs têmcinco NICs físicas, para ter o melhor desempenho
das NICs físicas, crie cinco redes de nuvem privada virtual e defina
a MTU como8244
de dois minutos.
Criar rede de gerenciamento, sub-rede e regra de firewall
Siga estas etapas para configurar a rede de gerenciamento:
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
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
Crie regras de firewall usando o comando
firewall-rules create
.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
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
Crie a regra de firewall
icmp
que pode ser usada para verificar se há 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:
NETWORK_NAME_PREFIX
: o prefixo de nome a ser usado para as redes e sub-redes de nuvem privada virtual.PROJECT_ID
: o ID do projeto.REGION
: a região em que você quer criar a política.SSH_SOURCE_IP_RANGE
: intervalo de IP no formato CIDR. Isso especifica quais endereços IP de origem podem se conectar à VM usando SSH.
Criar redes de dados, sub-redes e regra 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 mais informações sobre como criar redes de nuvem privada virtual, consulte Criar e verificar uma rede MTU de frame jumbo.
Criar VMs de GPU
Para testar o desempenho da rede com o GPUDirect-TCPX, é necessário criar pelo menos duas VMs A3.
Crie cada VM usando a imagem
cos-105-lts
do Container-Optimized OS e especificando as redes MTU virtuais que foram criadas na etapa anterior.As VMs também precisam usar a interface de rede NIC virtual do Google (gVNIC). Para VMs do A3, é necessária a versão 1.4.0rc3 ou posterior da gVNIC. Essa versão do driver está disponível no Container-Optimized OS.
A primeira NIC virtual é usada como principal para rede e armazenamento gerais. As outras quatro NICs virtuais são alinhadas a duas das oito GPUs no mesmo switch 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
Substitua:
VM_NAME
: o nome da VM.PROJECT_ID
: o ID do projeto.ZONE
: a zona para a VM.NETWORK_NAME_PREFIX
: o prefixo de nome a ser usado para as redes e sub-redes da nuvem privada virtual.
Instalar os drivers da GPU
Em cada VM A3, conclua as etapas a seguir.
Instale os drivers de GPU NVIDIA executando o seguinte comando:
sudo cos-extensions install gpu -- --version=latest
Remonte o caminho executando o seguinte comando:
sudo mount --bind /var/lib/nvidia /var/lib/nvidia sudo mount -o remount,exec /var/lib/nvidia
Conceder às placas de rede (NICs) acesso às GPUs
Em cada VM A3, conceda às placas de rede acesso às GPUs, concluindo as seguintes etapas:
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
Configurar o gerenciador de caminho dos dados de recebimento. Um serviço de gerenciamento, o gerenciador de caminho de dados de recebimento GPUDirect-TCPX, 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"
Verifique se o contêiner
receive-datapath-manager
foi iniciado.docker container logs --follow receive-datapath-manager
A saída será semelhante a esta:
I0000 00:00:1687813309.406064 1 rx_rule_manager.cc:174] Rx Rule Manager server(s) started...
Para interromper a visualização dos registros, pressione
ctrl-c
.Instalar as regras da tabela de IP.
sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
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 o NCCL com suporte a GPUDirect-TCPX. O Google Cloud oferece pacotes que atendem a esse requisito.
Para instalar o pacote do 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 esse comando for bem-sucedido, os arquivos
libnccl-net.so
elibnccl.so
serão colocados no diretório/var/lib/tcpx/lib64
.
Executar testes
Em cada VM A3, execute um teste de NCCL seguindo estas etapas:
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 do
/dev
no contêiner - Define o namespace da rede do contêiner para o host
- Define o namespace do usuário do contêiner para host
- Adiciona
CAP_IPC_LOCK
aos recursos do contêiner - Monta o
/tmp
do host no/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
- Monta dispositivos NVIDIA do
Depois de iniciar o contêiner, os aplicativos que usam NCCL podem ser executados dentro do contêiner. Por exemplo, para executar o teste
run-allgather
, conclua as seguintes etapas: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
Em uma VM, execute os seguintes comandos:
Configure a conexão entre as VMs. Substitua
VM-0
eVM-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.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 registros, você verá os resultadosall-gather
.Se a linha a seguir for exibida nos registros da NCCL, isso vai verificar se o GPUDirect-TCPX foi inicializado com sucesso.
NCCL INFO NET/GPUDirectTCPX ver. 3.1.1.