VizTracer ist ein Protokollierungs-/Debugging-/Profiling-Tool mit geringem Overhead, das die Ausführung Ihres Python-Codes verfolgen und visualisieren kann.
Die Front-End-Benutzeroberfläche wird von Perfetto unterstützt. Verwenden Sie „AWSD“ zum Zoomen/Navigieren . Weitere Hilfe finden Sie unter „Support – Steuerelemente“.
Die bevorzugte Methode zur Installation von VizTracer ist die Verwendung von PIP
pip install viztracer
# Instead of "python3 my_script.py arg1 arg2"
viztracer my_script.py arg1 arg2
result.json
Datei generiert, die Sie mit vizviewer
öffnen können # 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 hostet einen HTTP-Server unter http://localhost:9001
. Sie können auch Ihren Browser öffnen und diese Adresse verwenden.
Wenn Sie nicht möchten, dass Vizviewer den Webbrowser automatisch öffnet, können Sie Folgendes verwenden:
vizviewer --server_only result.json
Wenn Sie den Ablaufverfolgungsbericht nur einmal aufrufen müssen und den persistenten Server nicht möchten, verwenden Sie
vizviewer --once result.json
vizviewer result.json
Eine VS-Code-Erweiterung ist verfügbar, um Ihnen das Leben noch einfacher zu machen.
--open
hinzu, um die Berichte direkt nach der Ablaufverfolgung zu öffnen viztracer --open my_script.py arg1 arg2
viztracer -o result.html --open my_script.py arg1 arg2
flask
) werden ebenfalls unterstützt viztracer -m your_module
viztracer flask run
Sie können VizTracer auch manuell in Ihrem Skript starten/stoppen.
from viztracer import VizTracer
tracer = VizTracer ()
tracer . start ()
# Something happens here
tracer . stop ()
tracer . save () # also takes output_file as an optional argument
Oder Sie können es mit with
-Anweisung tun
with VizTracer ( output_file = "optional.json" ) as tracer :
# Something happens here
Wenn Sie Jupyter verwenden, können Sie Viztracer-Zellmagie verwenden.
# You need to load the extension first
% load_ext viztracer
% % viztracer
# Your code after
Nach der Zelle wird eine Schaltfläche VizTracer Report
angezeigt, auf die Sie klicken können, um die Ergebnisse anzuzeigen
VizTracer kann native Aufrufe und GPU-Ereignisse von PyTorch (basierend auf torch.profiler
) mit --log_torch
protokollieren.
with VizTracer ( log_torch = True ) as tracer :
# Your torch code
viztracer --log_torch your_model.py
VizTracer kann die Daten herausfiltern, die Sie nicht benötigen, um den Overhead zu reduzieren und Informationen über einen längeren Zeitraum aufzubewahren, bevor Sie das Protokoll sichern.
VizTracer kann zusätzliche Informationen protokollieren, ohne Ihren Quellcode zu ändern
VizTracer unterstützt das Einfügen benutzerdefinierter Ereignisse, während das Programm ausgeführt wird. Dies funktioniert wie ein Druck-Debug, aber Sie können anhand der Trace-Daten erkennen, wann dieser Druck erfolgt.
Für Python3.12+ unterstützt VizTracer die Multithread-Ablaufverfolgung auf Python-Ebene, ohne dass Änderungen an Ihrem Code erforderlich sind.
Für Versionen vor 3.12 unterstützt VizTracer das native Python threading
Modul. Starten Sie einfach VizTracer
bevor Sie Threads erstellen, und es wird einfach funktionieren.
Für andere Multithread-Szenarien können Sie enable_thread_tracing()
verwenden, um VizTracer über den Thread zu informieren und ihn zu verfolgen.
Weitere Informationen finden Sie in den Multi-Thread-Dokumenten
VizTracer unterstützt subprocess
, multiprocessing
, os.fork()
, concurrent.futures
und loky
out of the box.
Für allgemeinere Fälle mit mehreren Prozessen kann VizTracer mit einigen zusätzlichen Schritten unterstützen.
Weitere Informationen finden Sie in den Dokumenten zu mehreren Prozessen
VizTracer unterstützt asyncio
nativ, könnte den Bericht jedoch durch die Verwendung --log_async
verbessern.
Weitere Informationen finden Sie in den asynchronen Dokumenten
Perfetto unterstützt nativen Flamegraph. Wählen Sie einfach Slices auf der Benutzeroberfläche aus und wählen Sie „Slice Flamegraph“.
VizTracer unterstützt die Remote-Anbindung an einen beliebigen Python-Prozess, um ihn zu verfolgen, sofern Viztracer importierbar ist
Weitere Informationen finden Sie in der Dokumentation zum Remote-Anhängen
VizTracer muss die internen Daten im JSON-Format sichern. Den Benutzern wird empfohlen, orjson
zu installieren, was viel schneller ist als die integrierte json
-Bibliothek. VizTracer versucht, orjson
zu importieren und auf die integrierte json
-Bibliothek zurückzugreifen, wenn orjson
nicht vorhanden ist.
VizTracer unternimmt große Anstrengungen, um einen geringen Overhead zu erreichen. Die tatsächlichen Auswirkungen auf die Leistung hängen weitgehend von Ihrer Anwendung ab. Für typische Codebasen wird erwartet, dass der Overhead unter 1x liegt. Wenn Ihr Code selten Funktionsaufrufe enthält, kann der Overhead minimal sein.
Der durch VizTracer verursachte Overhead ist im Grunde eine feste Zeitspanne beim Ein- und Ausstieg aus der Funktion. Je mehr Zeit also für den Ein- und Austritt von Funktionen aufgewendet wird, desto größer ist der Overhead. Eine rein rekursive fib
Funktion könnte unter Python3.11+ einen 3x-4x-Overhead erleiden (wenn der Python-Aufruf optimiert ist, war dieser Python-Aufruf zuvor langsamer, sodass das Overhead-Verhältnis geringer wäre).
Im realen Szenario sollte Ihr Code nicht zu viel Zeit mit Funktionsaufrufen verbringen (sie bewirken nicht wirklich etwas Nützliches), sodass der Overhead viel geringer wäre.
Es werden viele Techniken angewendet, um den Gesamtaufwand während der Codeausführung zu minimieren und den unvermeidlichen Versatz zu reduzieren, der durch VizTracer entsteht (der Teil zum Speichern von Berichten ist nicht so kritisch). VizTracer versucht beispielsweise, den CPU-Zeitstempelzähler anstelle eines Systemaufrufs zu verwenden, um die Zeit abzurufen, sofern verfügbar. Unter Python 3.12+ verwendet VizTracer sys.monitoring
, das weniger Overhead verursacht als sys.setprofile
. All diese Bemühungen führten dazu, dass es deutlich schneller war als cProfile
, der Python-Standardlib-Profiler.
Allerdings ist VizTracer ein Tracer, was bedeutet, dass er jeden einzelnen Funktionsein- und -ausgang aufzeichnen muss, sodass er nicht so schnell sein kann wie die Sampling-Profiler – sie sind nicht dasselbe. Mit dem zusätzlichen Overhead liefert VizTracer viel mehr Informationen als normale Sampling-Profiler.
Die vollständige Dokumentation finden Sie unter https://viztracer.readthedocs.io/en/stable
Bitte senden Sie Fehlerberichte und Funktionsanfragen über den Github Issue Tracker. VizTracer befindet sich derzeit in der Entwicklung und ist offen für alle konstruktiven Vorschläge.
Copyright 2020-2024 Tian Gao.
Wird unter den Bedingungen der Apache 2.0-Lizenz vertrieben.