NVIDIA NVbandwidth: ferramenta pra medir performance de interconexão e memória em GPU
A NVIDIA publicou um guia do NVbandwidth, ferramenta CUDA que mede banda e latência de transferência de memória em sistemas com GPU. Suporta testes unidirecionais, bidirecionais, multi-GPU e multi-node, com métodos via copy engine ou kernel SM. Funciona em topologias NVLINK, NVLink C2C e PCIe, e serve pra otimização, validação de hardware e troubleshooting em aplicações CUDA.
Quem escreve aplicação CUDA sabe: performance de transferência de dados é um dos gargalos mais comuns, seja em setup single-GPU ou multi-GPU. Pra diagnosticar isso, a NVIDIA mantém o NVbandwidth, ferramenta CUDA que mede banda e latência de cópia de memória entre diferentes links.
O post técnico é direcionado a dev CUDA, arquiteto de sistema e engenheiro de infra de ML que precisa medir e validar performance de interconexão entre GPUs.
O que é NVbandwidth
É uma ferramenta baseada em CUDA que mede banda e latência pra vários padrões de cópia de memória usando dois métodos: copy engine (CE) ou kernel copy via SM (Streaming Multiprocessor). Reporta a banda medida no sistema, cobrindo as rotas típicas:
- CPU memory → GPU memory
- GPU memory → CPU memory
- GPU memory → GPU memory
Ajuda a avaliar performance geral do sistema, medir latência de acesso a memória, diagnosticar gargalos de banda em apps CUDA, otimizar padrões de transferência e comparar banda entre múltiplas GPUs.
Por que importa pra quem roda LLM
Banda de memória é fator crítico em app moderno de GPU, especialmente LLM. Com modelo crescendo em tamanho, movimentação eficiente de dados afeta:
- Carregamento do modelo: tempo de startup
- Inferência: capacidade de resposta em tempo real
- Treino: atualização de gradiente e sincronização de parâmetro
Na prática, se você tá debugando por que seu treino distribuído tá lento ou por que TTFT (Time To First Token) da inferência degradou depois de uma mudança de hardware, NVbandwidth é o primeiro lugar pra olhar antes de culpar o código.
Tipos de teste suportados
Unidirecionais:
- Host → Device (H2D)
- Device → Host (D2H)
- Device ↔ Device (D2D)
Bidirecionais:
- Host ↔ Device
- Device ↔ Device
Multi-GPU:
- All to One (A2O), One to All (O2A)
- All to Host (A2H), Host to All (H2A)
Multi-node (quando compilado com suporte a MPI): mede banda cruzando fronteiras de nó num cluster.
Latência: Host ↔ Device e Device ↔ Device.
Dois métodos de cópia
- Copy Engine (CE): usa as funções assíncronas de memcpy nativas do CUDA
- Streaming Multiprocessor (SM): kernels CUDA customizados que fazem a cópia via SM
A dupla abordagem dá visão mais completa de quanto o sistema aguenta.
Design agnóstico de topologia
Funciona em qualquer topologia de interconexão, NVLINK, NVLink C2C ou PCIe, sem precisar que você informe a topologia explicitamente. Output sai em texto puro (default) ou JSON (flag -j).
Requisitos
- GPU NVIDIA com CUDA
- CUDA toolkit 11.X ou superior (single-node); 12.3 pro multi-node
- Driver compatível com a versão do toolkit
- Compilador C++17 (GCC 7.x+ no Linux)
- CMake 3.20+ (recomendado 3.24+)
- Boost program options
Pra multi-node: CUDA 12.3 + driver 550+ e MPI instalado.
Uso básico
Pra medir banda de interconexão do sistema inteiro:
./nvbandwidth
Pra medir banda D2D via copy engine, buffer de 1GiB, 10 iterações, saída JSON:
./nvbandwidth -t device_to_device_memcpy_read_ce -b 1024 -i 10 -j
Exemplo de output num teste host-to-device:
Running host_to_device_memcpy_ce.
memcpy CE CPU(row) -> GPU(column) bandwidth (GB/s)
0 1
0 55.63 55.64
SUM host_to_device_memcpy_ce 111.27
COEFFICIENT_OF_VARIATION host_to_device_memcpy_ce 0.00
Como a medição funciona por dentro
Pra não contaminar a medição com overhead de enfileiramento, o fluxo é:
- Enfileira um spin kernel que espera numa flag em memória host
- O spin kernel segura o device até todos os eventos de medição estarem enfileirados
- Enfileira evento de start, N iterações de memcpy, evento de stop
- Libera a flag pra começar a medição
Isso isola o tempo real de transferência pela interconexão.
Modo multi-node
Rodar multi-node exige setup extra. Primeiro, sobe o NVIDIA Internode Memory Exchange Service (IMEX):
sudo systemctl start nvidia-imex.service
Configura endereços dos nós em /etc/nvidia-imex/nodes_config.cfg e roda com MPI:
mpirun --allow-run-as-root --map-by ppr:4:node --bind-to core -np 8 \
--report-bindings -q -mca btl_tcp_if_include enP5p9s0 \
--hostfile /etc/nvidia-imex/nodes_config.cfg ./nvbandwidth -p multinode
Sistemas NVIDIA Multi-Node NVLink (MNNVL) exigem domínio IMEX totalmente configurado pra todos os nós do domínio NVLink.
Output típico num teste peer-to-peer entre 8 GPUs num sistema multi-node mostra matriz com banda por par, com valores em torno de 397 GB/s em cada direção.
Pra que usar
- Otimização: descobrir que padrão de transferência é mais eficiente no seu hardware
- Avaliação de sistema: comparar banda entre configurações diferentes
- Troubleshooting: confirmar se gargalo de banda é causa de problema de performance em app CUDA
- Validação de hardware: depois de instalar GPU nova, trocar driver ou mudar config, verificar se a banda bate com o esperado
- Teste de regressão: baseline pra detectar degradação depois de update de software
Código e docs no repo NVIDIA/nvbandwidth.
☕ comentários · 0