مدونة PyTorch الرسمية: شرح مفصل لـ PyTorch Profiler V1.9

تركز التحسينات في Profiler v1.9 على استهداف خطوات التنفيذ الأكثر استهلاكًا للطاقة من حيث وقت التشغيل و/أو الذاكرة، مع تصور توزيع عبء العمل بين وحدة معالجة الرسومات ووحدة المعالجة المركزية.
يضيف Profiler v1.9 خمس ميزات رئيسية جديدة بما في ذلك:
1. عرض التدريب الموزع: يساعدك هذا على فهم الوقت والذاكرة المستهلكة بواسطة مهام التدريب الموزعة. افترض أن لديك نموذج تدريب. عندما تقوم بتقسيم الحمل إلى عقد عاملة وتشغيلها بالتوازي، فقد يكون الأمر أشبه بصندوق أسود وقد تحدث مشكلات مختلفة. الهدف العام للنموذج هو زيادة سرعة التدريب. يساعدك عرض التدريب الموزع هذا على تشخيص المشكلات وتصحيحها داخل عقدة واحدة.
2. عرض الذاكرة: يتيح لك هذا العرض فهمًا أفضل لاستخدام الذاكرة. يمكن لهذه الأداة عرض تخصيص الذاكرة النشطة للبرنامج في مراحل مختلفة من التشغيل، مما يساعدك على تجنب أخطاء نفاد الذاكرة.
3. تصور تطبيق وحدة معالجة الرسوميات: تضمن هذه الأداة الاستفادة الكاملة من وحدة معالجة الرسومات (GPU).
4. دعم التخزين السحابي: يمكن الآن لمكون Tensorboard قراءة البيانات المحللة من Azure Blob Storage، وAmazon S3، وGoogle Cloud Platform.
5. انتقل إلى الكود المصدر: تدعم هذه الميزة تصور معلومات تتبع المكدس وتسمح بالانتقال مباشرة إلى كود المصدر. يساعدك هذا على تحسين الكود الخاص بك وتكراره بسرعة استنادًا إلى نتائج تحديد الملفات الشخصية.
نظرة عامة على محتوى التعاون:
- إعداد البيانات والنماذج
- تسجيل أحداث التنفيذ باستخدام Profiler
- تشغيل Profiler
- استخدم TensorBoard لعرض النتائج وتحليل أداء النموذج
- تحسين الأداء باستخدام Profiler
- تحليل الأداء باستخدام ميزات متقدمة أخرى
البدء باستخدام PyTorch Profiling
أولاً:
$ pip تثبيت torch-tb-profiler
import torch.profiler as profiler
With profiler.profile(XXXX)
ملاحظة: لمزيد من المعلومات حول تحليل CUDA ووحدة المعالجة المركزية، راجع هنا
with torch.profiler.profile(
activities=[
torch.profiler.ProfilerActivity.CPU,
torch.profiler.ProfilerActivity.CUDA],
- profiler.record_function("$NAME"): يسمح بإضافة الديكورات إلى كتل الوظيفة.
- يمكن لمعلمة Profile_memory=True الموجودة ضمن profiler.profile تحليل استخدام الذاكرة لوحدة المعالجة المركزية ووحدة معالجة الرسومات.
تصور أداء نموذج PyTorch
### التدريب الموزع
لقد أثبتت التطورات الأخيرة في التعلم العميق قيمة مجموعات البيانات الكبيرة والنماذج الكبيرة، مما يعني أيضًا أن تدريب النموذج يتطلب المزيد من موارد الحوسبة.
تم اعتماد التوازي في البيانات الموزعة (DDP) وإطار عمل الاتصالات متعدد البطاقات من NVIDIA (NCCL) على نطاق واسع في PyTorch لتسريع تدريب التعلم العميق.
في هذا الإصدار من PyTorch Profiler، يتم الآن دعم DDP مع الواجهة الخلفية NCCL.
نظرة عامة على الحوسبة والاتصالات
في "نظرة عامة على الحوسبة/الاتصالات" في عرض التدريب الموزع، يستطيع المستخدمون ملاحظة نسبة الحوسبة والاتصالات لعقد "موازن التحميل" بين جميع العاملين، والتي يتم قياسها وفقًا للحبيبات.
روابط ذات صلة بموازن التحميل: هنا
السيناريو 1:
إذا كان وقت الحساب والتداخل لعامل واحد أطول من العمال الآخرين، فقد يشير هذا إلى وجود مشكلة في موازنة عبء العمل أو أن إحدى العقد متخلفة. الحساب هو مجموع وقت نواة وحدة معالجة الرسوميات، مطروحًا منه وقت التداخل. يشير وقت التداخل إلى الوقت الذي يتم توفيره من خلال تداخل الاتصالات أثناء عملية الحساب.
يشير التداخل الأطول إلى التوازي الأفضل بين الحساب والتواصل.من الناحية المثالية، يجب أن تتداخل عمليات الحساب والتواصل بشكل كامل. الاتصال هو إجمالي وقت الاتصال مطروحًا منه وقت التداخل.
يوضح المثال التالي كيف قد يبدو هذا على Tensorboard.
مثال للمتخلف
السيناريو 2:
إذا كان حجم الدفعة صغيرًا (أي أن العمليات الحسابية على جميع العمال صغيرة)، أو كانت البيانات المراد إرسالها كبيرة، فقد تكون نسبة الحساب إلى الاتصال صغيرة أيضًا، ويمكن رؤية معدل استخدام وحدة معالجة الرسوميات ووقت الانتظار في Profiler.
يمكن للمستخدمين مراجعة الكود بناءً على منظور الحساب/الاتصال هذا وتقليل الاتصال من خلال اعتماد تراكم التدرج أو عن طريق زيادة حجم الدفعة لتقليل نسبة الاتصال. يعتمد وقت اتصال DDP على حجم النموذج. حجم الدفعة ليس له علاقة بحجم النموذج. لذلك، فإن زيادة حجم الدفعة قد يؤدي إلى زيادة وقت الحساب وزيادة حالات الحساب والاتصال.
### نظرة عامة على المزامنة/الاتصالات
في عرض المزامنة/الاتصال، يستطيع المستخدمون ملاحظة كفاءة الاتصال. يتم حساب ذلك عن طريق طرح وقت الحساب والاتصال من وقت الخطوة. وقت المزامنة هو جزء من إجمالي وقت الاتصال الذي يتم قضاؤه في الانتظار والمزامنة مع العمال الآخرين. يتضمن عرض المزامنة/الاتصال التهيئة، ومحمل البيانات، وحساب وحدة المعالجة المركزية، وما إلى ذلك.
ومن هذا المنظور، يمكننا أن نرى:ما هي نسبة إجمالي حجم الاتصالات المستخدمة فعليًا لتبادل البيانات، وما هو الوقت المتبقي لانتظار العاملين الآخرين لتقديم البيانات.

على سبيل المثال، إذا كانت هناك مشكلة في موازنة عبء العمل أو مشكلات متخلفة، فيمكن اكتشاف ذلك في عرض المزامنة/الاتصال. سيظهر هذا المنظر أن بعض العمال ينتظرون لفترة أطول من غيرهم.

من الجدول أعلاه، يمكننا معرفة الإحصائيات التفصيلية لجميع مشغلي الاتصالات في كل عقدة. يمكن استخدام هذا الجدول لفهم أنواع المشغلات التي يتم استدعاؤها، وعدد مرات استدعاء كل مشغل، وحجم البيانات التي ينقلها كل مشغل، وما إلى ذلك.
عرض الذاكرة
يمكن استخدام هذه الأداة لفهم استهلاك موارد الأجهزة للمشغلين في النموذج. إن فهم استهلاك الوقت والذاكرة على مستوى المشغل يمكن أن يساعد في حل مشاكل الأداء وتسريع تنفيذ النموذج.نظرًا لأن حجم ذاكرة وحدة معالجة الرسومات محدود، فإن تحسين كفاءة استخدام الذاكرة يساعد في:
- يسمح بتشغيل نماذج أكبر وأداء أفضل للمهام على مستوى المحطة الطرفية.
- يسمح بأحجام دفعات أكبر، مما يزيد من سرعة التدريب.
يسجل Profiler جميع تخصيصات الذاكرة أثناء فترة Profiler. حدد "الجهاز" لرؤية تفاصيل استخدام الذاكرة لكل مشغل على جانب وحدة معالجة الرسوميات أو جانب المضيف.
ملاحظة: يجب تمكين profile_memory=True لتوليد بيانات الذاكرة التالية.
روابط ذات صلة: هنا
With torch.profiler.profile(
Profiler_memory=True # this will take 1 – 2 minutes to complete.
)
تعريفات هامة:
- يُظهر "زيادة الحجم" مجموع كل البايتات المخصصة، مطروحًا منه كل بايتات الذاكرة غير المخصصة.
- يُظهر "حجم التخصيص" مجموع كل البايتات المخصصة باستثناء إلغاء تخصيص الذاكرة.
- "الذات" تعني أن الذاكرة المخصصة لا تأتي من أي مشغل فرعي، ولكن يتم تخصيصها بواسطة المشغل نفسه.

مقاييس وحدة معالجة الرسومات على الجدول الزمني
تتيح لك هذه الميزة تصحيح مشكلات الأداء بسهولة عند عدم استخدام وحدة معالجة الرسومات (GPU) واحدة أو أكثر بشكل كافٍ. من الناحية المثالية، يجب أن يتمتع برنامجك باستهلاك عالٍ لوحدة معالجة الرسومات (يصل إلى 100% من استهلاك وحدة معالجة الرسومات)، وتكلفة اتصال ضئيلة بين وحدة المعالجة المركزية ووحدة معالجة الرسومات، وعدم استهلاك الطاقة.
ملخص: تسلط صفحة النظرة العامة الضوء على نتائج ثلاثة مؤشرات مهمة لاستخدام وحدة معالجة الرسومات (استخدام وحدة معالجة الرسومات، وكفاءة إدارة الوحدات المقدرة، والإشغال المحقق المقدر) على مستويات مختلفة.
بشكل أساسي، تحتوي كل وحدة معالجة رسومية على العديد من وحدات SM، وتحتوي كل وحدة SM على العديد من عمليات Warps، والتي يمكنها تنفيذ العديد من الخيوط في وقت واحد. يتضمن تنفيذ Warp العديد من الخيوط لأن عددها يعتمد على وحدة معالجة الرسوميات. من منظور رفيع المستوى، يمكن أن تساعد مقاييس وحدة معالجة الرسومات على جدول زمني المطورين في الحصول على رؤية شاملة للمجموعة بأكملها، وهو أمر مهم للغاية.
إذا كان استخدام وحدة معالجة الرسومات منخفضًا، فهذا يشير إلى وجود مشكلة محتملة في طرازك. تشمل الأسباب الشائعة ما يلي:
- التوازي غير الكافي في النواة، أي أن حجم الدفعة صغير جدًا
- إن استدعاء النواة الصغيرة في حلقة يعني أن تكلفة بدء التشغيل لا يتم استهلاكها.
- تؤدي اختناقات وحدة المعالجة المركزية أو وحدات الإدخال/الإخراج إلى عدم كفاية عبء العمل وانخفاض استخدام وحدة معالجة الرسومات
في صفحة النظرة العامة، يحتوي قسم توصيات الأداء على اقتراحات قابلة للتنفيذ لتحسين استخدام وحدة معالجة الرسومات. في هذا المثال، يكون استخدام وحدة معالجة الرسوميات منخفضًا، لذا فإن اقتراح الأداء هو زيادة حجم الدفعة. باتباع توصية الأداء، أدى زيادة حجم الدفعة من 4 إلى 32 إلى زيادة استخدام وحدة معالجة الرسوميات بمقدار 60.68%.
استخدام وحدة معالجة الرسوميات: في Profiler، يظهر وقت الفاصل الزمني للخطوة عندما يقوم محرك وحدة معالجة الرسومات بتنفيذ عبء عمل. كلما زادت نسبة الاستخدام، كلما كان ذلك أفضل. إن الحكم على اختناقات الأداء من خلال استخدام وحدة معالجة الرسوميات فقط ليس دقيقًا. لا يمكنك استخدام هذا لمعرفة عدد معالجات البث المتعددة التي تعمل.
لاحظ أنه على الرغم من أن هذا المقياس مفيد في اكتشاف فترات الخمول، إلا أن القيمة العالية لا تعني بالضرورة أن وحدة معالجة الرسومات يتم استخدامها بكفاءة عالية. على سبيل المثال، سيكون للنواة أحادية الخيط التي تعمل بشكل مستمر استخدام وحدة معالجة الرسوميات (GPU) بمقدار 100%.
تعتبر كفاءة معالج التدفق المقدرة (Est. SM Efficiency) مؤشرًا أكثر تفصيلاً. يشير إلى النسبة المئوية لـ SM التي كانت قيد الاستخدام أثناء التتبع، والنسبة المئوية للوقت الذي كان فيه تشوه نشط واحد على الأقل على SM، والنسبة المئوية للوقت الذي كانت فيه التشوهات خاملة.
وثائق NVIDIA: هنا
EST. كفاءة SM لها حدود أيضًا. على سبيل المثال، لا يمكن لنواة تحتوي على خيط واحد فقط لكل كتلة الاستفادة الكاملة من جميع أدوات إدارة العمليات. لا يمكن معرفة استخدام كل SM بناءً على كفاءة SM وحدها. لا يمكن معرفة سوى العمليات التي يقوم بها كل SM، بما في ذلك التوقفات أثناء انتظار نتائج تحميل الذاكرة.
من أجل الحفاظ على الاستخدام العالي لـ SM، يجب ضمان وجود عدد كافٍ من اللفائف الجاهزة للتشغيل عند حدوث توقف.
بالنسبة لمشاكل تشخيص الأداء، Est. إن معدل الإشغال المحقق أكثر دقة من التقدير. كفاءة SM واستخدام وحدة معالجة الرسوميات. يشير تقدير الإشغال المحقق إلى عدد الالتواءات لكل وحدة نمطية يمكن أن تكون نشطة في وقت واحد. غالبًا ما يكون وجود عدد كافٍ من التشوهات النشطة هو المفتاح لتحقيق إنتاجية جيدة. على عكس استخدام وحدة معالجة الرسوميات وكفاءة إدارة المعالج، فإن جعل هذه القيمة عالية قدر الإمكان ليس الهدف النهائي.
ومن الناحية التجريبية، يمكن تحقيق مكاسب جيدة في الإنتاجية عن طريق زيادة هذا المؤشر إلى 15% أو أعلى. ولكن في مرحلة ما، سوف تواجه عوائد متناقصة. على سبيل المثال، إذا وصلت القيمة إلى 30%، تصبح الفوائد اللاحقة غير مؤكدة. يُظهر هذا المقياس متوسط جميع مجدولي التشويه أثناء تنفيذ النواة.
وثائق NVIDIA: هنا
كلما كانت قيمة Est أكبر. كلما حققنا الإشغال، كان ذلك أفضل.

التفاصيل: Resnet50_batchsize4

التفاصيل: Resnet50_batchsize32
عرض النواة: تحتوي النواة على "الكتل لكل SM" و"تقدير الإشغال المحقق".
EST. يُعد معدل الإشغال المحقق أداة مفيدة لمقارنة مدى أداء النماذج.

متوسط الكتل لكل وحدة نمطية:
عدد الكتل لكل SM = عدد كتل النواة / عدد SMs لوحدة معالجة الرسوميات. إذا كان هذا الرقم أقل من 1، فهذا يشير إلى أن معالج وحدة معالجة الرسومات المتعددة لم يتم استخدامه بالكامل. "متوسط الكتل لكل SM" هو المتوسط المرجح لجميع عمليات تشغيل اسم النواة هذا، باستخدام مدة كل عملية تشغيل كوزن.
متوسط التقدير الإشغال المحقق
تعريف Est. إن الإشغال المحقق هو نفسه الموضح أعلاه. متوسط التقدير إن الإشغال المحقق هو المتوسط المرجح لجميع عمليات تشغيل اسم النواة، باستخدام مدة كل عملية تشغيل كوزن.
عرض التتبع:
يعرض عرض التتبع جدولًا زمنيًا يوضح مدة تشغيل المشغلين في النموذج والنظام الذي نفذ العملية. يمكن أن يساعدك هذا العرض في تحديد النفقات العامة المرتفعة وأوقات التنفيذ الطويلة، سواء كانت ناجمة عن الإدخال أو تدريب النموذج. في الوقت الحالي، يعرض عرض التتبع استخدام وحدة معالجة الرسومات وتقديرها. كفاءة SM في الجدول الزمني.

في المثال أعلاه، يكون استخدام وحدة معالجة الرسوميات أثناء "ProfilerStep5" في الخيط 28022 أعلى من الاستخدام أثناء "Optimizer.step". يمكنك تكبير الصورة لرؤية السبب.

وكما يمكن أن نرى من الشكل أعلاه، فإن نواة الأولى أطول من نواة الثانية. وقت تنفيذ نواة الأخير قصير للغاية، مما يؤدي إلى انخفاض استخدام وحدة معالجة الرسوميات.
EST. كفاءة SM: كل نواة لها قيمة EST محسوبة. كفاءة SM بين 0-100%. على سبيل المثال، يحتوي النواة أدناه على 64 بلاطة فقط، وSM لوحدة معالجة الرسوميات هذه هو 80، وبالتالي فإن "كفاءة SM المقدرة" هي 64/80، وهو ما يعادل 0.8.

دعم التخزين السحابي
بعد تشغيل pip install tensorboard، لقراءة البيانات عبر موفر سحابي، يمكنك تشغيل:
torch-tb-profiler[blob]
torch-tb-profiler[gs]
torch-tb-profiler[s3]
يمكنك استخدام pip install torch-tb-profiler[blob]، أو pip install torch-tb-profiler[gs]، أو pip install torch-tb-profiler[S3] لقراءة البيانات من مزود سحابي.
لمزيد من المعلومات، انظر: هنا
انتقل إلى الكود المصدر
إحدى الفوائد العظيمة لدمج TensorBoard وPyTorch Profiler مباشرة في Visual Studio Code (VS Code) هي القدرة على الانتقال مباشرة إلى كود المصدر (الملف والسطر) من تتبع مكدس Profiler. يدعم الآن ملحق VS Code Python تكامل TensorBoard.
يعد الانتقال إلى كود المصدر متاحًا فقط عند تشغيل Tensorboard في VS Code. إذا تم تحديد ملف التعريف باستخدام_stack=True، فسوف يظهر تتبع المكدس في واجهة المستخدم الخاصة بالمكون الإضافي. انقر فوق تتبع المكدس في PyTorch Profiler، وسوف يفتح VS Code الملف المقابل وينتقل مباشرة إلى الكود المقابل للتصحيح. يتيح هذا إمكانية تحسين الكود وتعديله بسرعة استنادًا إلى نتائج التحليل والاقتراحات.

انتقل إلى كود المصدر باستخدام Visual Studio Code Plug In UI
لمزيد من المعلومات حول كيفية تحسين أداء حجم الدفعة، يرجى الاطلاع على البرنامج التعليمي المفصل: هنا
يمكن أيضًا دمج PyTorch Profiler مع PyTorch Lightning. يمكنك ببساطة بدء مهمة تدريب البرق باستخدام trainer.profiler=pytorch لتوليد أثر.
مثال مفصل: هنا
العنوان الأصلي: هنا