VizTracer est un outil de journalisation/débogage/profilage à faible surcharge qui peut tracer et visualiser l'exécution de votre code Python.
L'interface utilisateur frontale est optimisée par Perfetto. Utilisez « AWSD » pour zoomer/naviguer . Une aide supplémentaire peut être trouvée dans « Support – Contrôles ».
La méthode préférée pour installer VizTracer est via pip
pip install viztracer
# Instead of "python3 my_script.py arg1 arg2"
viztracer my_script.py arg1 arg2
result.json
sera généré, que vous pourrez ouvrir avec 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 hébergera un serveur HTTP sur http://localhost:9001
. Vous pouvez également ouvrir votre navigateur et utiliser cette adresse.
Si vous ne souhaitez pas que Vizviewer ouvre automatiquement le navigateur Web, vous pouvez utiliser
vizviewer --server_only result.json
Si vous avez juste besoin d'afficher le rapport de trace une seule fois et que vous ne souhaitez pas le serveur persistant, utilisez
vizviewer --once result.json
vizviewer result.json
Une extension VS Code est disponible pour vous rendre la vie encore plus facile.
--open
pour ouvrir les rapports juste après le traçage viztracer --open my_script.py arg1 arg2
viztracer -o result.html --open my_script.py arg1 arg2
flask
) sont également pris en charge viztracer -m your_module
viztracer flask run
Vous pouvez également démarrer/arrêter manuellement VizTracer dans votre 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, vous pouvez le faire avec la déclaration with
with VizTracer ( output_file = "optional.json" ) as tracer :
# Something happens here
Si vous utilisez Jupyter, vous pouvez utiliser la magie cellulaire viztracer.
# You need to load the extension first
% load_ext viztracer
% % viztracer
# Your code after
Un bouton VizTracer Report
apparaîtra après la cellule et vous pourrez cliquer dessus pour afficher les résultats
VizTracer peut enregistrer les appels natifs et les événements GPU de PyTorch (basés sur torch.profiler
) avec --log_torch
.
with VizTracer ( log_torch = True ) as tracer :
# Your torch code
viztracer --log_torch your_model.py
VizTracer peut filtrer les données que vous ne souhaitez pas réduire et conserver les informations sur une période plus longue avant de vider le journal.
VizTracer peut enregistrer des informations supplémentaires sans modifier votre code source
VizTracer prend en charge l'insertion d'événements personnalisés pendant l'exécution du programme. Cela fonctionne comme un débogage d'impression, mais vous pouvez savoir quand cette impression se produit en consultant les données de trace.
Pour Python3.12+, VizTracer prend en charge le traçage multithread au niveau Python sans qu'il soit nécessaire de modifier votre code.
Pour les versions antérieures à 3.12, VizTracer prend en charge le module threading
natif Python. Démarrez simplement VizTracer
avant de créer des threads et cela fonctionnera.
Pour d'autres scénarios multithread, vous pouvez utiliser enable_thread_tracing()
pour remarquer VizTracer sur le thread afin de le tracer.
Reportez-vous à la documentation multithread pour plus de détails
VizTracer prend en charge subprocess
, multiprocessing
, os.fork()
, concurrent.futures
et loky
prêt à l'emploi.
Pour les cas multi-processus plus généraux, VizTracer peut prendre en charge quelques étapes supplémentaires.
Reportez-vous aux documents multi-processus pour plus de détails
VizTracer prend en charge asyncio
de manière native, mais pourrait améliorer le rapport en utilisant --log_async
.
Reportez-vous aux documents asynchrones pour plus de détails
Perfetto prend en charge le flamegraph natif, sélectionnez simplement des tranches sur l'interface utilisateur et choisissez "Slice Flamegraph".
VizTracer prend en charge l'attachement à distance à un processus Python arbitraire pour le tracer, tant que viztracer est importable
Reportez-vous aux documents joints à distance
VizTracer doit vider les données internes au format json. Il est recommandé aux utilisateurs d'installer orjson
, qui est beaucoup plus rapide que la bibliothèque json
intégrée. VizTracer essaiera d'importer orjson
et reviendra à la bibliothèque json
intégrée si orjson
n'existe pas.
VizTracer déploie beaucoup d'efforts pour réduire les frais généraux. L'impact réel sur les performances dépend en grande partie de votre application. Pour les bases de code typiques, la surcharge devrait être inférieure à 1x. Si votre code comporte des appels de fonction peu fréquents, la surcharge pourrait être minime.
La surcharge introduite par VizTracer est essentiellement une durée fixe lors de l'entrée et de la sortie de la fonction, donc plus de temps passé sur les entrées et les sorties de fonction, plus la surcharge sera observée. Une fonction fib
récursive pure pourrait subir une surcharge de 3 à 4 fois sur Python3.11+ (lorsque l'appel Python est optimisé, avant cet appel Python était plus lent, donc le taux de surcharge serait moindre).
Dans le scénario réel, votre code ne devrait pas consacrer trop de temps aux appels de fonctions (ils ne font vraiment rien d'utile), donc la surcharge serait beaucoup plus faible.
De nombreuses techniques sont appliquées pour minimiser la surcharge globale lors de l'exécution du code afin de réduire l'inévitable biais introduit par VizTracer (la partie sauvegarde du rapport n'est pas aussi critique). Par exemple, VizTracer essaie d'utiliser le compteur d'horodatage du processeur au lieu d'un appel système pour obtenir l'heure lorsqu'elle est disponible. Sur Python 3.12+, VizTracer utilise sys.monitoring
qui a moins de surcharge que sys.setprofile
. Tous les efforts l'ont rendu visiblement plus rapide que cProfile
, le profileur Python stdlib.
Cependant, VizTracer est un traceur, ce qui signifie qu'il doit enregistrer chaque entrée et sortie de fonction, il ne peut donc pas être aussi rapide que les profileurs d'échantillonnage - ce n'est pas la même chose. Avec la surcharge supplémentaire, VizTracer fournit beaucoup plus d'informations que les profileurs d'échantillonnage normaux.
Pour une documentation complète, veuillez consulter https://viztracer.readthedocs.io/en/stable
Veuillez envoyer des rapports de bogues et des demandes de fonctionnalités via le suivi des problèmes github. VizTracer est actuellement en cours de développement et est ouvert à toute suggestion constructive.
Copyright 2020-2024 Tian Gao.
Distribué selon les termes de la licence Apache 2.0.