A família de máquinas com otimização para aceleradores foi projetada por 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 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
ou a3-edgegpu-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 criar uma VM a3-highgpu-8g
ou a3-edgegpu-8g
que é executada em um sistema operacional Container-Optimized OS. Ele também
mostra como ativar o GPUDirect-TCPX na VM e configurar e testar o
desempenho aprimorado da rede da GPU.
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) com um MTU grande configurado.
- Crie suas VMs de GPU usando a imagem do Container-Optimized OS
cos-105-lts
ou mais recente. - 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 VPC
Para essas redes VPC, recomendamos definir a unidade máxima de transmissão (MTU) para um valor maior. Valores de MTU mais altos aumentam o tamanho do pacote e reduzem a sobrecarga do cabeçalho do pacote, o que aumenta a capacidade de dados do payload.
Para maximizar a largura de banda da rede para tipos de máquina A3 High, defina a MTU como
8244
bytes.
Para conferir as configurações de MTU recomendadas para outros tipos de máquina de GPU, consulte
Configurações de MTU para tipos de máquina de GPU.
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
ou mais recente 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=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:
VM_NAME
: o nome da VM.PROJECT_ID
: o ID do projeto.ZONE
: uma zona que oferece suporte ao seu tipo de máquina.MACHINE_TYPE
: o tipo de máquina da VM. Especifiquea3-highgpu-8g
oua3-edgegpu-8g
.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. Google Cloud forneceu pacotes que atendem a esse 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 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.