VizTracer adalah alat logging/debugging/profiling dengan overhead rendah yang dapat melacak dan memvisualisasikan eksekusi kode python Anda.
UI front-end didukung oleh Perfetto. Gunakan "AWSD" untuk memperbesar/menavigasi . Bantuan lebih lanjut dapat ditemukan di "Dukungan - Kontrol".
Cara yang lebih disukai untuk menginstal VizTracer adalah melalui pip
pip install viztracer
# Instead of "python3 my_script.py arg1 arg2"
viztracer my_script.py arg1 arg2
result.json
akan dibuat, yang dapat Anda buka dengan 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 akan meng-host server HTTP di http://localhost:9001
. Anda juga dapat membuka browser Anda dan menggunakan alamat itu.
Jika Anda tidak ingin vizviewer membuka browser web secara otomatis, Anda dapat menggunakan
vizviewer --server_only result.json
Jika Anda hanya perlu menampilkan laporan pelacakan satu kali, dan tidak menginginkan server persisten, gunakan
vizviewer --once result.json
vizviewer result.json
Ekstensi VS Code tersedia untuk membuat hidup Anda lebih mudah.
--open
untuk membuka laporan tepat setelah penelusuran viztracer --open my_script.py arg1 arg2
viztracer -o result.html --open my_script.py arg1 arg2
flask
) juga didukung viztracer -m your_module
viztracer flask run
Anda juga dapat memulai/menghentikan VizTracer secara manual di skrip Anda.
from viztracer import VizTracer
tracer = VizTracer ()
tracer . start ()
# Something happens here
tracer . stop ()
tracer . save () # also takes output_file as an optional argument
Atau, Anda dapat melakukannya dengan pernyataan with
with VizTracer ( output_file = "optional.json" ) as tracer :
# Something happens here
Jika Anda menggunakan Jupyter, Anda dapat menggunakan sihir sel viztracer.
# You need to load the extension first
% load_ext viztracer
% % viztracer
# Your code after
Tombol VizTracer Report
akan muncul setelah sel dan Anda dapat mengkliknya untuk melihat hasilnya
VizTracer dapat mencatat panggilan asli dan peristiwa GPU PyTorch (berdasarkan torch.profiler
) dengan --log_torch
.
with VizTracer ( log_torch = True ) as tracer :
# Your torch code
viztracer --log_torch your_model.py
VizTracer dapat memfilter data yang tidak ingin Anda kurangi overhead dan menyimpan informasi dalam jangka waktu yang lebih lama sebelum Anda membuang log.
VizTracer dapat mencatat informasi tambahan tanpa mengubah kode sumber Anda
VizTracer mendukung penyisipan acara khusus saat program sedang berjalan. Ini berfungsi seperti debug pencetakan, namun Anda dapat mengetahui kapan pencetakan ini terjadi sambil melihat data jejak.
Untuk Python3.12+, VizTracer mendukung penelusuran multi-thread tingkat Python tanpa perlu melakukan modifikasi apa pun pada kode Anda.
Untuk versi sebelum 3.12, VizTracer mendukung modul threading
asli python. Jalankan saja VizTracer
sebelum Anda membuat thread dan itu akan berfungsi.
Untuk skenario multi-thread lainnya, Anda dapat menggunakan enable_thread_tracing()
untuk memperhatikan VizTracer tentang thread untuk melacaknya.
Lihat dokumen multi-utas untuk detailnya
VizTracer mendukung subprocess
, multiprocessing
, os.fork()
, concurrent.futures
, dan loky
out of the box.
Untuk kasus multi-proses yang lebih umum, VizTracer dapat mendukung dengan beberapa langkah tambahan.
Lihat dokumen multi proses untuk detailnya
VizTracer mendukung asyncio
secara asli, tetapi dapat menyempurnakan laporan dengan menggunakan --log_async
.
Lihat dokumen async untuk detailnya
Perfetto mendukung flamegraph asli, cukup pilih irisan di UI dan pilih "Slice Flamegraph".
VizTracer mendukung lampiran jarak jauh ke proses Python sewenang-wenang untuk melacaknya, selama viztracer dapat diimpor
Lihat dokumen lampiran jarak jauh
VizTracer perlu membuang data internal ke format json. Disarankan bagi pengguna untuk menginstal orjson
, yang jauh lebih cepat daripada perpustakaan json
bawaan. VizTracer akan mencoba mengimpor orjson
dan kembali ke perpustakaan json
bawaan jika orjson
tidak ada.
VizTracer berupaya keras untuk mencapai overhead yang rendah. Dampak kinerja sebenarnya sangat bergantung pada aplikasi Anda. Untuk basis kode pada umumnya, overhead diharapkan berada di bawah 1x. Jika kode Anda memiliki pemanggilan fungsi yang jarang, biaya overhead mungkin minimal.
Overhead yang diperkenalkan oleh VizTracer pada dasarnya adalah jumlah waktu tetap selama masuk dan keluar fungsi, sehingga semakin banyak waktu yang dihabiskan untuk masuk dan keluar fungsi, semakin banyak overhead yang akan diamati. Fungsi fib
rekursif murni dapat mengalami overhead 3x-4x pada Python3.11+ (saat panggilan Python dioptimalkan, sebelumnya panggilan Python lebih lambat sehingga rasio overhead akan lebih kecil).
Dalam skenario kehidupan nyata, kode Anda tidak boleh menghabiskan terlalu banyak waktu pada pemanggilan fungsi (mereka tidak melakukan sesuatu yang berguna), sehingga overhead akan jauh lebih kecil.
Banyak teknik yang diterapkan untuk meminimalkan keseluruhan overhead selama eksekusi kode untuk mengurangi kemiringan yang tak terhindarkan yang disebabkan oleh VizTracer (bagian penyimpanan laporan tidak begitu penting). Misalnya, VizTracer mencoba menggunakan penghitung stempel waktu CPU alih-alih syscall untuk mendapatkan waktu bila tersedia. Pada Python 3.12+, VizTracer menggunakan sys.monitoring
yang memiliki overhead lebih sedikit dibandingkan sys.setprofile
. Semua upaya membuatnya jauh lebih cepat daripada cProfile
, profiler stdlib Python.
Namun, VizTracer adalah pelacak, yang berarti ia harus mencatat setiap masuk dan keluarnya fungsi, sehingga tidak bisa secepat profiler pengambilan sampel - keduanya tidak sama. Dengan overhead ekstra, VizTracer memberikan lebih banyak informasi dibandingkan profiler pengambilan sampel biasa.
Untuk dokumentasi lengkap, silakan lihat https://viztracer.readthedocs.io/en/stable
Silakan kirim laporan bug dan permintaan fitur melalui pelacak masalah github. VizTracer saat ini sedang dalam pengembangan dan terbuka untuk saran konstruktif apa pun.
Hak Cipta 2020-2024 Tian Gao.
Didistribusikan di bawah ketentuan lisensi Apache 2.0.