VizTracer は、Python コードの実行をトレースして視覚化できる、オーバーヘッドの低いロギング/デバッグ/プロファイリング ツールです。
フロントエンド UI は Perfetto を利用しています。 「AWSD」を使用してズーム/ナビゲートします。詳細については、「サポート - コントロール」を参照してください。
VizTracer をインストールする推奨される方法は pip 経由です。
pip install viztracer
# Instead of "python3 my_script.py arg1 arg2"
viztracer my_script.py arg1 arg2
result.json
ファイルが生成され、 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 はhttp://localhost:9001
で HTTP サーバーをホストします。ブラウザを開いてそのアドレスを使用することもできます。
vizviewer が Web ブラウザを自動的に開かないようにするには、次のようにします。
vizviewer --server_only result.json
トレース レポートを 1 回だけ表示する必要があり、永続的なサーバーが必要ない場合は、次を使用します。
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 はネイティブ フレームグラフをサポートしています。UI でスライスを選択し、「スライス フレームグラフ」を選択するだけです。
VizTracer は、viztracer がインポート可能である限り、任意の Python プロセスへのリモート アタッチをサポートして、それをトレースします。
リモート接続のドキュメントを参照してください
VizTracer は内部データを json 形式でダンプする必要があります。ユーザーには、組み込みのjson
ライブラリよりもはるかに高速なorjson
をインストールすることをお勧めします。 VizTracer はorjson
をインポートしようとし、 orjson
存在しない場合は組み込みのjson
ライブラリにフォールバックします。
VizTracer は、低いオーバーヘッドを実現するために多大な努力を払っています。実際のパフォーマンスへの影響は、アプリケーションに大きく依存します。一般的なコードベースの場合、オーバーヘッドは 1 倍未満になることが予想されます。コードの関数呼び出しの頻度が低い場合、オーバーヘッドは最小限に抑えられる可能性があります。
VizTracer によって発生するオーバーヘッドは、基本的に関数の開始と終了中に一定の時間であるため、関数の開始と終了に費やす時間が長くなるほど、より多くのオーバーヘッドが観察されます。純粋な再帰fib
関数は、Python3.11 以降では 3 倍から 4 倍のオーバーヘッドが発生する可能性があります (Python 呼び出しが最適化されると、その前は Python 呼び出しが低速であったため、オーバーヘッド率は低くなります)。
実際のシナリオでは、コードは関数呼び出しにあまり多くの時間を費やすべきではないため (関数呼び出しは実際には何も役に立ちません)、オーバーヘッドははるかに小さくなります。
コード実行中の全体的なオーバーヘッドを最小限に抑えるために多くの手法が適用され、VizTracer によって導入される避けられないスキューが軽減されます (レポートの保存部分はそれほど重要ではありません)。たとえば、VizTracer は、利用可能な場合は、システムコールの代わりに CPU タイムスタンプ カウンターを使用して時刻を取得しようとします。 Python 3.12 以降では、VizTracer はsys.setprofile
よりもオーバーヘッドが少ないsys.monitoring
を使用します。すべての努力により、Python stdlib プロファイラーであるcProfile
よりも明らかに高速になりました。
ただし、VizTracer はトレーサーです。つまり、関数の出入りをすべて記録する必要があるため、サンプリング プロファイラーほど高速にはなりません。これらは同じものではありません。追加のオーバーヘッドがあるため、VizTracer は通常のサンプリング プロファイラーよりも多くの情報を提供します。
完全なドキュメントについては、https://viztracer.readthedocs.io/en/stable を参照してください。
バグレポートや機能リクエストは、github issue tracker を通じて送信してください。 VizTracer は現在開発中であり、建設的な提案を歓迎します。
著作権 2020-2024 Tian Gao。
Apache 2.0 ライセンスの条件に基づいて配布されます。