VizTracer é uma ferramenta de registro/depuração/criação de perfil de baixa sobrecarga que pode rastrear e visualizar a execução do seu código python.
A IU front-end é desenvolvida pela Perfetto. Use "AWSD" para ampliar/navegar . Mais ajuda pode ser encontrada em "Suporte - Controles".
A maneira preferida de instalar o VizTracer é via pip
pip install viztracer
# Instead of "python3 my_script.py arg1 arg2"
viztracer my_script.py arg1 arg2
result.json
será gerado, que você pode abrir com vizviewer
# You can display all the files in a directory and open them in browser too
vizviewer ./
# For very large trace files, try external trace processor
vizviewer --use_external_processor result.json
vizviewer hospedará um servidor HTTP em http://localhost:9001
. Você também pode abrir seu navegador e usar esse endereço.
Se você não deseja que o vizviewer abra o navegador automaticamente, você pode usar
vizviewer --server_only result.json
Se você precisar abrir o relatório de rastreamento apenas uma vez e não quiser o servidor persistente, use
vizviewer --once result.json
vizviewer result.json
Uma extensão do VS Code está disponível para tornar sua vida ainda mais fácil.
--open
para abrir os relatórios logo após o rastreamento viztracer --open my_script.py arg1 arg2
viztracer -o result.html --open my_script.py arg1 arg2
flask
) também são suportados viztracer -m your_module
viztracer flask run
Você também pode iniciar/parar manualmente o VizTracer em seu script.
from viztracer import VizTracer
tracer = VizTracer ()
tracer . start ()
# Something happens here
tracer . stop ()
tracer . save () # also takes output_file as an optional argument
Ou você pode fazer isso with
a instrução
with VizTracer ( output_file = "optional.json" ) as tracer :
# Something happens here
Se você estiver usando Jupyter, poderá usar magias de células viztracer.
# You need to load the extension first
% load_ext viztracer
% % viztracer
# Your code after
Um botão VizTracer Report
aparecerá após a célula e você pode clicar nele para visualizar os resultados
VizTracer pode registrar chamadas nativas e eventos de GPU de PyTorch (baseado em torch.profiler
) com --log_torch
.
with VizTracer ( log_torch = True ) as tracer :
# Your torch code
viztracer --log_torch your_model.py
O VizTracer pode filtrar os dados que você não deseja para reduzir a sobrecarga e manter informações de um período de tempo mais longo antes de despejar o log.
VizTracer pode registrar informações extras sem alterar seu código-fonte
VizTracer oferece suporte à inserção de eventos personalizados enquanto o programa está em execução. Isso funciona como uma depuração de impressão, mas você pode saber quando essa impressão ocorre enquanto observa os dados de rastreamento.
Para Python3.12+, o VizTracer oferece suporte ao rastreamento multithread no nível Python sem a necessidade de fazer qualquer modificação em seu código.
Para versões anteriores à 3.12, o VizTracer oferece suporte ao módulo threading
nativo python. Basta iniciar VizTracer
antes de criar threads e ele simplesmente funcionará.
Para outros cenários multithread, você pode usar enable_thread_tracing()
para avisar o VizTracer sobre o thread para rastreá-lo.
Consulte a documentação multithread para obter detalhes
VizTracer suporta subprocess
, multiprocessing
, os.fork()
, concurrent.futures
e loky
prontos para uso.
Para casos mais gerais de multiprocessos, o VizTracer pode oferecer suporte com algumas etapas extras.
Consulte a documentação de vários processos para obter detalhes
VizTracer oferece suporte nativo asyncio
, mas pode aprimorar o relatório usando --log_async
.
Consulte a documentação assíncrona para obter detalhes
Perfetto suporta flamegraph nativo, basta selecionar fatias na UI e escolher "Slice Flamegraph".
VizTracer suporta conexão remota a um processo Python arbitrário para rastreá-lo, desde que o viztracer seja importável
Consulte os documentos de anexação remota
O VizTracer precisa despejar os dados internos no formato json. É recomendado que os usuários instalem orjson
, que é muito mais rápido que a biblioteca json
integrada. O VizTracer tentará importar orjson
e voltar para a biblioteca json
integrada se orjson
não existir.
O VizTracer se esforça muito para obter baixa sobrecarga. O impacto real no desempenho depende muito do seu aplicativo. Para bases de código típicas, espera-se que a sobrecarga seja inferior a 1x. Se o seu código tiver chamadas de função pouco frequentes, a sobrecarga poderá ser mínima.
A sobrecarga introduzida pelo VizTracer é basicamente um período fixo de tempo durante a entrada e saída da função, portanto, quanto mais tempo gasto nas entradas e saídas da função, mais sobrecarga será observada. Uma função fib
recursiva pura pode sofrer sobrecarga de 3x-4x no Python3.11+ (quando a chamada do Python é otimizada, antes da chamada do Python ser mais lenta, a taxa de sobrecarga seria menor).
No cenário da vida real, seu código não deve gastar muito tempo em chamadas de função (elas não fazem nada de útil), então a sobrecarga seria muito menor.
Muitas técnicas são aplicadas para minimizar a sobrecarga geral durante a execução do código para reduzir a distorção inevitável introduzida pelo VizTracer (a parte de salvar o relatório não é tão crítica). Por exemplo, o VizTracer tenta usar o contador de carimbo de data/hora da CPU em vez de um syscall para obter a hora quando disponível. No Python 3.12+, o VizTracer usa sys.monitoring
que tem menos sobrecarga que sys.setprofile
. Todos os esforços tornaram-no visivelmente mais rápido que cProfile
, o criador de perfil stdlib do Python.
No entanto, o VizTracer é um rastreador, o que significa que ele precisa registrar cada entrada e saída de função, portanto não pode ser tão rápido quanto os criadores de perfil de amostragem - eles não são a mesma coisa. Com a sobrecarga extra, o VizTracer fornece muito mais informações do que os perfis de amostragem normais.
Para documentação completa, consulte https://viztracer.readthedocs.io/en/stable
Envie relatórios de bugs e solicitações de recursos por meio do rastreador de problemas do GitHub. O VizTracer está atualmente em desenvolvimento e está aberto a sugestões construtivas.
Direitos autorais 2020-2024 Tian Gao.
Distribuído sob os termos da licença Apache 2.0.