Usar uma largura de banda de rede maior


É possível usar larguras de banda de rede maiores, como 100 Gbps ou mais, para melhorar o desempenho das cargas de trabalho distribuídas em execução nas VMs de GPU.

Há suporte a larguras de banda de rede maiores em configurações selecionadas de VMs de uso geral N1 com GPUs NVIDIA T4 ou V100 conectadas e em determinados tipos de máquinas com otimização de aceleradores.

Para analisar as configurações ou os tipos de máquinas que dão suporte a essas taxas mais altas de largura de banda de rede, consulte Larguras de banda de rede e GPUs.

Para informações gerais sobre a largura de banda de rede no Compute Engine, consulte Largura de banda de rede.

Visão geral

Para usar as larguras de banda de rede maiores disponíveis em cada VM de GPU, siga estas etapas recomendadas:

  1. Crie sua VM de GPU usando uma imagem de SO que dê suporte à placa de rede virtual do Google (gVNIC). No caso de VMs A3, é recomendável usar uma imagem do Container-Optimized OS.
  2. Opcional: instale o Fast Socket. O Fast Socket melhora o desempenho do NCCL em redes de 100 Gbps ou mais ao reduzir a contenção entre várias conexões TCP. Algumas Deep Learning VM Images (DLVM) têm o Fast Socket pré-instalado.

Usar Deep Learning VM Images

Você pode criar VMs usando qualquer imagem que dê suporte a GPUs do projeto Deep Learning VM Images. Todas as imagens de DLVM que dão suporte a GPUs têm o driver da GPU, o software de machine learning e a gVNIC pré-instalados. Para conferir uma lista de imagens de DLVM, consulte Como escolher uma imagem.

Para usar o Fast Socket, escolha uma imagem de DLVM, como tf-latest-gpu-debian-10 ou tf-latest-gpu-ubuntu-1804.

Criar VMs que usam larguras de banda de rede maiores

Para larguras de banda de rede maiores, recomendamos ativar a placa de rede virtual do Google (gVNIC). Para mais informações, consulte Como usar a NIC virtual do Google.

No caso de VMs A3, é necessário ter a versão 1.4.0rc3 ou mais recente da gVNIC. Essa versão do driver está disponível no Container-Optimized OS. Para todos os outros sistemas operacionais, é necessário instalar a gVNIC versão 1.4.0rc3 ou mais recente.

Para criar uma VM com GPUs conectadas e uma largura de banda de rede maior, faça o seguinte:

  1. Verifique os seguintes itens:

    • Em VMs de GPU N1 com as GPUs T4 ou V100 conectadas: analise a largura de banda máxima para a configuração de CPU, GPU e memória.
    • Em VMs com otimização de aceleradores A3, A2 e G2: analise a largura de banda máxima para seu tipo de máquina.

    Para mais informações, consulte Largura de banda máxima disponível.

  2. Crie a VM de GPU. Os exemplos a seguir mostram como criar A3, A2 e N1 com VMs V100 conectadas.

    Nestes exemplos, as VMs são criadas com a CLI do Google Cloud. No entanto, também é possível usar o console do Google Cloud ou a API Compute Engine para criar essas VMs. Para mais informações sobre como criar VMs de GPU, consulte Criar uma VM com GPUs conectadas.

    A2 (A100)

    Por exemplo, para criar uma VM que tenha uma largura de banda máxima de 100 Gbps, oito GPUs A100 conectadas e faça uso da imagem de DLVM tf-latest-gpu, execute o seguinte comando:

    gcloud compute instances create VM_NAME \
     --project=PROJECT_ID \
     --zone=ZONE \
     --machine-type=a2-highgpu-8g \
     --maintenance-policy=TERMINATE --restart-on-failure \
     --image-family=tf-latest-gpu \
     --image-project=deeplearning-platform-release \
     --boot-disk-size=200GB \
     --network-interface=nic-type=GVNIC \
     --metadata="install-nvidia-driver=True,proxy-mode=project_editors" \
     --scopes=https://www.googleapis.com/auth/cloud-platform
    

    Substitua:

    • VM_NAME: o nome da VM
    • PROJECT_ID: o ID do projeto
    • ZONE: a zona para a VM. Essa zona precisa ser compatível com o tipo de GPU. Para mais informações sobre zonas, consulte Disponibilidade de regiões e zonas de GPU.

    A3 (H100)

    Para instruções detalhadas sobre como configurar VMs A3 que aumentaram o desempenho da rede, consulte Melhorar o desempenho da rede com GPUDirect-TCPX.

    N1 (V100)

    Por exemplo, para criar uma VM que tenha uma largura de banda máxima de 100 Gbps, oito GPUs V100 conectadas e faça uso da imagem de DLVM tf-latest-gpu, execute o seguinte comando:

    gcloud compute instances create VM_NAME \
     --project PROJECT_ID \
     --custom-cpu 96 \
     --custom-memory 624 \
     --image-project=deeplearning-platform-release \
     --image-family=tf-latest-gpu \
     --accelerator type=nvidia-tesla-v100,count=8 \
     --maintenance-policy TERMINATE \
     --metadata="install-nvidia-driver=True"  \
     --boot-disk-size 200GB \
     --network-interface=nic-type=GVNIC \
     --zone=ZONE
    
  3. Se você não estiver usando o Container-Optimized OS ou Deep Learning VM Images com suporte a GPUs, instale drivers de GPU. Para mais informações, consulte Como instalar drivers de GPU.

  4. Opcional. Na VM, instale o Fast Socket.

  5. Depois de configurar a VM, é possível verificar a largura de banda de rede.

Instalar o Fast Socket

A NVIDIA Collective Communications Library (NCCL) é usada por frameworks de aprendizado profundo, como o TensorFlow, o PyTorch e o Horovod, para treinamentos de várias GPUs e vários nós.

O Fast Socket é um transporte de rede reservado do Google para NCCL. No Compute Engine, o Fast Socket melhora o desempenho da NCCL em redes de 100 Gbps ao reduzir a contenção entre várias conexões TCP. Para mais informações sobre como trabalhar com a NCCL, consulte o Guia do usuário da NCCL.

A avaliação atual mostra que o Fast Socket melhora a capacidade de processamento de redução total em 30% a 60%, de acordo com o tamanho da mensagem.

Para configurar um ambiente do Fast Socket, use uma Deep Learning VM Image que tenha o Fast Socket pré-instalado ou faça a instalação manual dele em uma VM do Linux. Para verificar se o Fast Socket está pré-instalado, consulte Como verificar se o Fast Socket está ativado.

Antes de instalar o Fast Socket em uma VM do Linux, é necessário instalar a NCCL. Para instruções detalhadas, consulte a documentação da NVIDIA NCCL (em inglês).

CentOS/RHEL

Para fazer o download e instalar o Fast Socket em uma VM do CentOS ou do RHEL, siga as seguintes etapas:

  1. Adicione o repositório de pacotes e importe chaves públicas.

    sudo tee /etc/yum.repos.d/google-fast-socket.repo << EOM
    [google-fast-socket]
    name=Fast Socket Transport for NCCL
    baseurl=https://packages.cloud.google.com/yum/repos/google-fast-socket
    enabled=1
    gpgcheck=0
    repo_gpgcheck=0
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg
          https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOM
    
  2. Instale o soquete rápido.

    sudo yum install google-fast-socket
    
  3. Verifique se o Fast Socket está ativado.

SLES

Para fazer o download e instalar o Fast Socket em uma VM do SLES, siga as seguintes etapas:

  1. Adicione o repositório de pacotes.

    sudo zypper addrepo https://packages.cloud.google.com/yum/repos/google-fast-socket google-fast-socket
    
  2. Adicione chaves de repositório.

    sudo rpm --import https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    
  3. Instale o soquete rápido.

    sudo zypper install google-fast-socket
    
  4. Verifique se o Fast Socket está ativado.

Debian/Ubuntu

Para fazer o download e instalar o Fast Socket em uma VM do Debian ou Ubuntu, siga estas etapas:

  1. Adicione o repositório de pacotes.

    echo "deb https://packages.cloud.google.com/apt google-fast-socket main" | sudo tee /etc/apt/sources.list.d/google-fast-socket.list
    
  2. Adicione chaves de repositório.

    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
  3. Instale o soquete rápido.

    sudo apt update && sudo apt install google-fast-socket
    
  4. Verifique se o Fast Socket está ativado.

Como verificar se o soquete rápido está ativado

Na VM, conclua as seguintes etapas:

  1. Localize o diretório inicial do NCCL.

    sudo ldconfig -p | grep nccl

    Por exemplo, em uma imagem DLVM, você recebe a seguinte saída:

    libnccl.so.2 (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so.2
    libnccl.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl.so
    libnccl-net.so (libc6,x86-64) => /usr/local/nccl2/lib/libnccl-net.so

    Isso mostra que o diretório inicial do NCCL é /usr/local/nccl2.

  2. Verifique se o NCCL carrega o plug-in Fast Socket. Para verificar, você precisa fazer o download do pacote de teste NCCL. Execute este comando para fazer o download do pacote de instalação:

    git clone https://github.com/NVIDIA/nccl-tests.git && \
    cd nccl-tests && make NCCL_HOME=NCCL_HOME_DIRECTORY

    Substitua NCCL_HOME_DIRECTORY pelo diretório inicial do NCCL.

  3. No diretório nccl-tests, execute o processo all_reduce_perf:

    NCCL_DEBUG=INFO build/all_reduce_perf

    Se o Fast Socket estiver ativado, a mensagem FastSocket plugin initialized será exibida no registro de saída.

    # nThread 1 nGpus 1 minBytes 33554432 maxBytes 33554432 step: 1048576(bytes) warmup iters: 5 iters: 20 validation: 1
    #
    # Using devices
    #   Rank  0 Pid  63324 on fast-socket-gpu device  0 [0x00] Tesla V100-SXM2-16GB
    .....
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Flow placement enabled.
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : queue skip: 0
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket : Using [0]ens12:10.240.0.24
    fast-socket-gpu:63324:63324 [0] NCCL INFO NET/FastSocket plugin initialized
    ......
    

Verificar a largura de banda de rede

Ao trabalhar com GPUs de largura de banda alta, você pode usar uma ferramenta de tráfego de rede, como o iPerf2, para medir a largura de banda da rede.

Para verificar as velocidades de largura de banda, é preciso pelo menos duas VMs que tenham GPUs anexadas e sejam compatíveis com a velocidade de largura de banda que você está testando.

Use o iPerf para realizar a comparação em sistemas baseados em Debian.

  1. Crie duas VMs compatíveis com as velocidades de largura de banda necessárias.

  2. Quando as duas VMs estiverem em execução, use o SSH para se conectar a uma das VMs.

    gcloud compute ssh VM_NAME \
        --project=PROJECT_ID
    

    Substitua:

    • VM_NAME: o nome da primeira VM
    • PROJECT_ID: ID do projeto
  3. Na primeira VM, conclua as etapas a seguir:

    1. Instale iperf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. Consiga o endereço IP interno dessa VM. Anote-o para acompanhar.

      ip a
      
    3. Inicie o servidor iPerf.

      iperf -s
      

      Isso inicia um servidor que detecta conexões para realizar a comparação. Deixe-o em execução durante o teste.

  4. Em um novo terminal de cliente, conecte-se à segunda VM usando SSH.

    gcloud compute ssh VM_NAME \
       --project=PROJECT_ID
    

    Substitua:

    • VM_NAME: o nome da segunda VM
    • PROJECT_ID: ID do projeto
  5. Na segunda VM, conclua as etapas a seguir:

    1. Instale o iPerf.

      sudo apt-get update && sudo apt-get install iperf
      
    2. Execute o teste iperf e especifique o endereço IP da primeira VM como destino.

      iperf -t 30 -c internal_ip_of_instance_1 -P 16
      

      Isso executa um teste de 30 segundos e produz um resultado semelhante ao seguinte. Se o iPerf não conseguir acessar a outra VM, talvez seja necessário ajustar a rede ou as configurações de firewall nas VMs ou talvez no console do Google Cloud.

Ao usar a largura de banda máxima disponível de 100 Gbps ou 1.000 Gbps (A3), lembre-se das seguintes considerações:

  • Devido a overheads de cabeçalho para protocolos como Ethernet, IP e TCP na pilha de virtualização, a capacidade de processamento, medida por netperf, é saturada em cerca de 90 Gbps ou 800 Gbps (A3). Geralmente conhecido como goodput (em inglês).

    O TCP é capaz de atingir a velocidade de rede de 100 ou 1.000 Gbps. Outros protocolos, como o UDP, são mais lentos.

  • Devido a fatores como overhead de protocolo e congestionamento de rede, o desempenho de ponta a ponta dos fluxos de dados pode ser um pouco menor.

  • É necessário usar vários fluxos TCP para atingir a largura de banda máxima entre as instâncias de VM. O Google recomenda de quatro a 16 fluxos. Com 16 fluxos, você maximiza com frequência a capacidade de processamento. Dependendo do aplicativo e da pilha de software, talvez seja necessário ajustar as configurações do aplicativo ou do código para configurar vários fluxos.

A seguir