Perfilamento de GPU Nvidia com Nsight Systems

Relevância do Perfilamento

Identificar causas de problemas e gargalos é crucial para otimização. Duas abordagens principais: análise do grafo computacional e perfilamento de operadores. A primeira avalia otimizações como conversão de formatos, fusão de operadores e quantização. A segunda foca no desempenho de operadores endividuais, identificando gargalos em operações como convolução e multiplicação matricial.

Nsight Systems

Substitui ferramentas legadas como nvprof, oferecendo capacidades avançadas. Exemplo de comando:

nsys profile --trace=cuda,nvtx,osrt,cudnn,cublas --export sqlite --force-overwrite -o analise python teste_resnet.py

Gera arquivo .nsys-rep para visualização no Nsight Systems. Adicione --cuda-graph-trace=node para detalhes internos de CUDA Graphs.

Exportando dados para JSON

nsys export --type json --force-overwrite -o perfilamento.json analise.nsys-rep

Alternativa via utilitário:

python conversor_nsys.py -f analise.sqlite -o perfilamento.json

Marcadores NVTX

Delimitam regiões de código para análise. Exemplo com PyTorch:

with torch.cuda.nvtx.range(f"inferencia_resnet_etapa{i}"):
    resultados = modelo(valores_pixel).logits

Implementação direta com pacote NVTX:

from nvtx import annotate
with annotate("minha_regiao"):
    # Código monitorado

Facilita a identificação de etapas no perfilamento.

Extração de dados por região

Após conversão para JSON, busque por NVTXRegions para correlacionar operações com marcadores.

Correlação operadores-ONNX

Use trtexec para vincular kernels a operadores do modelo:

trtexec --onnx=modelo.onnx --saveEngine=modelo.engine \
--exportLayerInfo=grafo.json --profilingVerbosity=detailed

Logs gerados relacionam kernels (ex: _gemm_mha_v2) a camadas ONNX.

Perfilaemnto de processos contínuos

Para serviços de longa duração (ex: inferência em tempo real):

nsys profile --trace=cuda,nvtx,osrt,cudnn,cublas -o perfil_sglang \
--start-later python -m servidor_sglang

Controle a coleta via sessões:

nsys sessions list
nsys start --session=ID_SESSAO
# Executar operações alvo
nsys stop --session=ID_SESSAO

Monitoramento com nvidia-smi

Script para captura periódica de utilização da GPU:

import subprocess, time
from datetime import datetime

intervalo = 0.5  # segundos
ciclos = 240     # total de amostras

for _ in range(ciclos):
    saida = subprocess.getoutput("nvidia-smi")
    print(f"Timestamp: {datetime.now()}\n{saida}")
    time.sleep(intervalo)

Tags: Nsight Systems NVTX CUDA GPU Profiling nvidia-smi

Publicado em 8-7 10:32