VizTracer عبارة عن أداة تسجيل/تصحيح/توصيف منخفضة الحمل يمكنها تتبع وتصور تنفيذ كود بايثون الخاص بك.
يتم تشغيل واجهة المستخدم الأمامية بواسطة Perfetto. استخدم "AWSD" للتكبير/التنقل . يمكن العثور على مزيد من المساعدة في "الدعم - عناصر التحكم".
الطريقة المفضلة لتثبيت VizTracer هي عبر النقطة
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 على http://localhost:9001
. يمكنك أيضًا فتح متصفحك واستخدام هذا العنوان.
إذا كنت لا تريد أن يقوم 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 تسجيل المكالمات الأصلية وأحداث GPU الخاصة بـ PyTorch (استنادًا إلى torch.profiler
) باستخدام --log_torch
.
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 وحدة threading
الأصلية لـ python. ما عليك سوى تشغيل VizTracer
قبل إنشاء سلاسل الرسائل وسيعمل.
بالنسبة للسيناريوهات الأخرى ذات مؤشرات الترابط المتعددة، يمكنك استخدام enable_thread_tracing()
لملاحظة VizTracer حول مؤشر الترابط لتتبعه.
راجع مستندات المواضيع المتعددة للحصول على التفاصيل
يدعم VizTracer subprocess
multiprocessing
و os.fork()
و concurrent.futures
و loky
خارج الصندوق.
بالنسبة لحالات العمليات المتعددة الأكثر عمومية، يمكن لـ VizTracer تقديم الدعم ببعض الخطوات الإضافية.
ارجع إلى مستندات العمليات المتعددة للحصول على التفاصيل
يدعم VizTracer asyncio
محليًا، ولكن يمكنه تحسين التقرير باستخدام --log_async
.
راجع المستندات غير المتزامنة للحصول على التفاصيل
يدعم Perfetto مخطط Flamegraph الأصلي، ما عليك سوى تحديد الشرائح على واجهة المستخدم واختيار "Slice Flamegraph".
يدعم VizTracer إرفاق عملية Python التعسفية عن بعد لتتبعها، طالما أن viztracer قابل للاستيراد
الرجوع إلى إرفاق المستندات عن بعد
يحتاج VizTracer إلى تفريغ البيانات الداخلية إلى تنسيق json. من المستحسن أن يقوم المستخدمون بتثبيت orjson
، وهو أسرع بكثير من مكتبة json
المضمنة. سيحاول VizTracer استيراد orjson
والعودة إلى مكتبة json
المضمنة في حالة عدم وجود orjson
.
يبذل VizTracer الكثير من الجهد لتحقيق انخفاض في النفقات العامة. يعتمد تأثير الأداء الفعلي إلى حد كبير على التطبيق الخاص بك. بالنسبة لقواعد التعليمات البرمجية النموذجية، من المتوقع أن يكون الحمل أقل من 1x. إذا كان الكود الخاص بك يحتوي على استدعاءات دالة غير متكررة، فقد يكون الحمل ضئيلًا.
الحمل الذي يقدمه VizTracer هو في الأساس مقدار ثابت من الوقت أثناء إدخال الوظيفة والخروج منها، لذلك كلما زاد الوقت المستغرق في إدخالات الوظيفة ومخارجها، سيتم ملاحظة المزيد من الحمل. يمكن أن تعاني وظيفة fib
العودية النقية من حمل 3x-4x على Python3.11+ (عندما يتم تحسين استدعاء Python، قبل أن يكون استدعاء Python أبطأ لذا ستكون نسبة الحمل أقل).
في سيناريو الحياة الواقعية، يجب ألا تقضي التعليمات البرمجية الخاصة بك الكثير من الوقت في استدعاءات الوظائف (فهي لا تفعل أي شيء مفيد حقًا)، وبالتالي فإن الحمل سيكون أقل بكثير.
يتم تطبيق العديد من التقنيات لتقليل الحمل الإجمالي أثناء تنفيذ التعليمات البرمجية لتقليل الانحراف الحتمي الذي تقدمه VizTracer (جزء حفظ التقرير ليس بالغ الأهمية). على سبيل المثال، يحاول VizTracer استخدام عداد الطابع الزمني لوحدة المعالجة المركزية (CPU) بدلاً من استدعاء النظام للحصول على الوقت عند توفره. في Python 3.12+، يستخدم VizTracer sys.monitoring
الذي يحتوي على حمل أقل من sys.setprofile
. كل الجهود جعلته أسرع بشكل ملحوظ من cProfile
، وهو ملف تعريف Python stdlib.
ومع ذلك، فإن VizTracer هو برنامج تتبع، مما يعني أنه يجب عليه تسجيل كل إدخال وخروج للوظيفة، لذلك لا يمكن أن يكون بنفس سرعة ملفات تعريف العينات - فهي ليست نفس الشيء. مع الحمل الزائد، يوفر VizTracer معلومات أكثر بكثير من ملفات تعريف العينات العادية.
للحصول على الوثائق الكاملة، يرجى الاطلاع على https://viztracer.readthedocs.io/en/stable
الرجاء إرسال تقارير الأخطاء وطلبات الميزات من خلال أداة تعقب المشكلات في github. VizTracer قيد التطوير حاليًا وهو مفتوح لأية اقتراحات بناءة.
حقوق الطبع والنشر 2020-2024 تيان جاو.
يتم توزيعها بموجب شروط ترخيص Apache 2.0.