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:
- Configure uma ou mais redes da nuvem virtual privada (VPC) com uma MTU grande configurada.
- Crie as suas VMs com GPU através da imagem do SO otimizado para contentores
cos-105-lts
ou posterior. - Em cada MV, instale os controladores da GPU.
- Em cada VM, conceda às placas de rede (NICs) acesso à GPU.
- 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:
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
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
Crie regras de firewall através do comando
firewall-rules create
.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
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
Crie a regra de firewall
icmp
que 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.
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. Especifiquea3-highgpu-8g
oua3-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.
Instale os controladores da GPU NVIDIA executando o seguinte comando:
sudo cos-extensions install gpu -- --version=latest
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:
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
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"
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...
Para parar de ver os registos, prima
ctrl-c
.Instale regras de tabela de IP.
sudo iptables -I INPUT -p tcp -m tcp -j ACCEPT
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
elibnccl.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:
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
- Monta dispositivos NVIDIA de
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: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
Numa VM, execute os seguintes comandos:
Configure a ligação entre as VMs. Substitua
VM-0
eVM-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.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 resultadosall-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.