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)