VizTracer는 Python 코드 실행을 추적하고 시각화할 수 있는 오버헤드가 낮은 로깅/디버깅/프로파일링 도구입니다.
프런트 엔드 UI는 Perfetto로 구동됩니다. 확대/축소하려면 "AWSD"를 사용하세요 . 추가 도움말은 "지원 - 제어"에서 찾을 수 있습니다.
VizTracer를 설치하는 기본 방법은 pip를 사용하는 것입니다.
pip install viztracer
# Instead of "python3 my_script.py arg1 arg2"
viztracer my_script.py arg1 arg2
vizviewer
로 열 수 있는 result.json
파일이 생성됩니다. # 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는 http://localhost:9001
에서 HTTP 서버를 호스팅합니다. 브라우저를 열고 해당 주소를 사용할 수도 있습니다.
vizviewer가 웹브라우저를 자동으로 열지 않도록 하려면 다음을 사용할 수 있습니다.
vizviewer --server_only result.json
추적 보고서를 한 번만 표시해야 하고 영구 서버를 원하지 않는 경우 다음을 사용하십시오.
vizviewer --once result.json
vizviewer result.json
VS Code 확장을 사용하면 삶을 더욱 쉽게 만들 수 있습니다.
--open
추가하세요. viztracer --open my_script.py arg1 arg2
viztracer -o result.html --open my_script.py arg1 arg2
flask
)도 지원됩니다. viztracer -m your_module
viztracer flask run
스크립트에서 VizTracer를 수동으로 시작/중지할 수도 있습니다.
from viztracer import VizTracer
tracer = VizTracer ()
tracer . start ()
# Something happens here
tracer . stop ()
tracer . save () # also takes output_file as an optional argument
또는 with
문을 사용하여 수행할 수 있습니다.
with VizTracer ( output_file = "optional.json" ) as tracer :
# Something happens here
Jupyter를 사용하는 경우 viztracer 셀 매직을 사용할 수 있습니다.
# You need to load the extension first
% load_ext viztracer
% % viztracer
# Your code after
VizTracer Report
버튼은 셀 뒤에 표시되며 이를 클릭하여 결과를 볼 수 있습니다.
VizTracer는 --log_torch
사용하여 PyTorch( torch.profiler
기반)의 기본 호출 및 GPU 이벤트를 기록할 수 있습니다.
with VizTracer ( log_torch = True ) as tracer :
# Your torch code
viztracer --log_torch your_model.py
VizTracer는 오버헤드를 줄이고 싶지 않은 데이터를 필터링하고 로그를 덤프하기 전에 더 오랜 기간 동안 정보를 보관할 수 있습니다.
VizTracer는 소스 코드를 변경하지 않고도 추가 정보를 기록할 수 있습니다.
VizTracer는 프로그램이 실행되는 동안 사용자 정의 이벤트 삽입을 지원합니다. 이는 인쇄 디버그처럼 작동하지만 추적 데이터를 보면서 이 인쇄가 언제 발생하는지 알 수 있습니다.
Python3.12+의 경우 VizTracer는 코드를 수정할 필요 없이 Python 수준 다중 스레드 추적을 지원합니다.
3.12 이전 버전의 경우 VizTracer는 Python 기본 threading
모듈을 지원합니다. 스레드를 생성하기 전에 VizTracer
시작하면 제대로 작동합니다.
다른 다중 스레드 시나리오의 경우, enable_thread_tracing()
사용하여 추적할 스레드에 대해 VizTracer에 알릴 수 있습니다.
자세한 내용은 멀티 스레드 문서를 참조하세요.
VizTracer는 subprocess
, multiprocessing
, os.fork()
, concurrent.futures
및 loky
즉시 지원합니다.
보다 일반적인 다중 프로세스 사례의 경우 VizTracer는 몇 가지 추가 단계를 지원할 수 있습니다.
자세한 내용은 다중 프로세스 문서를 참조하세요.
VizTracer는 기본적으로 asyncio
지원하지만 --log_async
사용하여 보고서를 향상할 수 있습니다.
자세한 내용은 비동기 문서를 참조하세요.
Perfetto는 기본 Flamegraph를 지원합니다. UI에서 슬라이스를 선택하고 "Slice Flamegraph"를 선택하기만 하면 됩니다.
VizTracer는 viztracer를 가져올 수 있는 한 임의의 Python 프로세스에 대한 원격 연결을 지원하여 이를 추적합니다.
원격 연결 문서를 참조하세요.
VizTracer는 내부 데이터를 json 형식으로 덤프해야 합니다. 내장된 json
라이브러리보다 훨씬 빠른 orjson
설치하는 것이 사용자에게 권장됩니다. VizTracer는 orjson
가져오려고 시도하고 orjson
존재하지 않는 경우 내장 json
라이브러리로 대체합니다.
VizTracer는 낮은 오버헤드를 달성하기 위해 많은 노력을 기울입니다. 실제 성능에 미치는 영향은 주로 애플리케이션에 따라 달라집니다. 일반적인 코드베이스의 경우 오버헤드는 1x 미만일 것으로 예상됩니다. 코드에 함수 호출이 자주 발생하지 않는 경우 오버헤드가 최소화될 수 있습니다.
VizTracer에서 발생하는 오버헤드는 기본적으로 함수 시작 및 종료 중 고정된 시간이므로 함수 시작 및 종료에 더 많은 시간을 소비할수록 더 많은 오버헤드가 관찰됩니다. 순수 재귀 fib
함수는 Python3.11+에서 3x-4x 오버헤드를 겪을 수 있습니다(Python 호출이 최적화되기 전에는 Python 호출이 느려지므로 오버헤드 비율이 더 낮았습니다).
실제 시나리오에서는 코드가 함수 호출에 너무 많은 시간을 소비해서는 안 되므로(실제로 유용한 작업은 수행하지 않음) 오버헤드가 훨씬 작아집니다.
VizTracer에서 발생하는 피할 수 없는 왜곡을 줄이기 위해 코드 실행 중 전반적인 오버헤드를 최소화하기 위해 많은 기술이 적용됩니다(보고서 저장 부분은 그다지 중요하지 않음). 예를 들어 VizTracer는 사용 가능한 시간을 가져오기 위해 syscall 대신 CPU 타임스탬프 카운터를 사용하려고 합니다. Python 3.12+에서 VizTracer는 sys.setprofile
보다 오버헤드가 적은 sys.monitoring
사용합니다. 모든 노력을 통해 Python stdlib 프로파일러인 cProfile
보다 눈에 띄게 빨라졌습니다.
그러나 VizTracer는 추적기입니다. 즉, 모든 단일 함수 시작 및 종료를 기록해야 하므로 샘플링 프로파일러만큼 빠르지는 않습니다. 둘은 동일하지 않습니다. 추가 오버헤드로 인해 VizTracer는 일반 샘플링 프로파일러보다 훨씬 더 많은 정보를 제공합니다.
전체 문서를 보려면 https://viztracer.readthedocs.io/en/stable을 참조하세요.
github 이슈 트래커를 통해 버그 보고서와 기능 요청을 보내주세요. VizTracer는 현재 개발 중이며 건설적인 제안을 받을 수 있습니다.
저작권 2020-2024 티안 가오.
Apache 2.0 라이센스 조건에 따라 배포됩니다.