يوضح هذا الدليل كيفية استخدام الأدوات المتاحة مع TensorFlow Profiler لتتبع أداء نماذج TensorFlow. سوف تتعلم كيفية فهم كيفية أداء النموذج الخاص بك على المضيف (وحدة المعالجة المركزية) ، أو الجهاز (GPU) ، أو على مجموعة من كل من المضيف والجهاز (الأجهزة).
يساعد التوصيف على فهم استهلاك موارد الأجهزة (الوقت والذاكرة) لعمليات TensorFlow المختلفة في نموذجك وحل مشكلات الأداء ، وفي النهاية ، جعل النموذج ينفذ بشكل أسرع.
سيرشدك هذا الدليل إلى كيفية تثبيت Profiler ، والأدوات المختلفة المتاحة ، والأوضاع المختلفة لكيفية جمع Profiler لبيانات الأداء ، وبعض أفضل الممارسات الموصى بها لتحسين أداء النموذج.
إذا كنت ترغب في تكوين ملف تعريف لأداء النموذج الخاص بك على Cloud TPU ، فراجع دليل Cloud TPU .
قم بتثبيت المتطلبات الأساسية لـ Profiler و GPU
قم بتثبيت ملحق Profiler لـ TensorBoard مع نقطة. لاحظ أن منشئ ملفات التعريف يتطلب أحدث إصدارات TensorFlow و TensorBoard (> = 2.2).
pip install -U tensorboard_plugin_profile
للتوصيف على GPU ، يجب عليك:
- تلبية برامج تشغيل NVIDIA® GPU ومتطلبات CUDA® Toolkit المدرجة في متطلبات برنامج دعم وحدة معالجة الرسومات TensorFlow .
تأكد من وجود واجهة أدوات إنشاء ملفات التعريف NVIDIA® CUDA® (CUPTI) على المسار:
/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \ grep libcupti
إذا لم يكن لديك CUPTI على المسار ، فقم بإرفاق دليل التثبيت الخاص به إلى متغير البيئة $LD_LIBRARY_PATH
عن طريق تشغيل:
export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH
بعد ذلك ، قم بتشغيل الأمر ldconfig
أعلاه مرة أخرى للتحقق من العثور على مكتبة CUPTI.
حل مشاكل الامتياز
عند تشغيل التنميط باستخدام CUDA® Toolkit في بيئة Docker أو على Linux ، فقد تواجه مشكلات تتعلق بامتيازات CUPTI غير الكافية ( CUPTI_ERROR_INSUFFICIENT_PRIVILEGES
). انتقل إلى NVIDIA Developer Docs لمعرفة المزيد حول كيفية حل هذه المشكلات على Linux.
لحل مشكلات امتياز CUPTI في بيئة Docker ، قم بتشغيل
docker run option '--privileged=true'
أدوات ملف التعريف
قم بالوصول إلى Profiler من علامة التبويب Profile في TensorBoard ، والتي تظهر فقط بعد التقاط بعض بيانات النموذج.
يحتوي ملف التعريف على مجموعة مختارة من الأدوات للمساعدة في تحليل الأداء:
- نظرة عامة على الصفحة
- محلل خط أنابيب الإدخال
- احصائيات TensorFlow
- عارض التتبع
- إحصائيات GPU Kernel
- أداة ملف تعريف الذاكرة
- جراب عارض
صفحة نظرة عامة
توفر صفحة النظرة العامة عرض المستوى الأعلى لكيفية أداء نموذجك أثناء تشغيل ملف التعريف. تعرض لك الصفحة صفحة نظرة عامة مجمعة لمضيفك وجميع الأجهزة ، وبعض التوصيات لتحسين أداء تدريب النموذج الخاص بك. يمكنك أيضًا تحديد مضيفين فرديين في قائمة المضيف المنسدلة.
تعرض صفحة النظرة العامة البيانات على النحو التالي:
ملخص الأداء : يعرض ملخصًا عالي المستوى لأداء النموذج الخاص بك. يتكون ملخص الأداء من جزأين:
تقسيم الوقت المتدرج: يقسم متوسط وقت الخطوة إلى فئات متعددة للمكان الذي يقضي فيه الوقت:
- التجميع: الوقت المستغرق في تجميع الحبيبات.
- الإدخال: الوقت المستغرق في قراءة بيانات الإدخال.
- الإخراج: الوقت المستغرق في قراءة بيانات الإخراج.
- إطلاق النواة: الوقت الذي يقضيه المضيف في إطلاق النواة
- وقت حساب المضيف ..
- وقت الاتصال من جهاز إلى جهاز.
- وقت الحوسبة على الجهاز.
- كل الآخرين ، بما في ذلك Python النفقات العامة.
دقة حساب الجهاز - يبين النسبة المئوية لوقت حساب الجهاز الذي يستخدم حسابات 16 و 32 بت.
رسم بياني لوقت الخطوة : يعرض رسمًا بيانيًا لوقت خطوة الجهاز (بالملي ثانية) عبر جميع الخطوات التي تم أخذ عينات منها. يتم تقسيم كل خطوة إلى فئات متعددة (بألوان مختلفة) حيث يتم قضاء الوقت. تتوافق المنطقة الحمراء مع جزء من وقت الخطوة الذي كانت فيه الأجهزة جالسة في وضع الخمول في انتظار بيانات الإدخال من المضيف. تُظهر المنطقة الخضراء مقدار الوقت الذي كان يعمل فيه الجهاز بالفعل.
أعلى 10 عمليات TensorFlow على الجهاز (مثل GPU) : تعرض العمليات على الجهاز التي تم تشغيلها لأطول فترة.
يعرض كل صف الوقت الذاتي للعملية (كنسبة مئوية من الوقت الذي تستغرقه جميع العمليات) ، والوقت التراكمي ، والفئة ، والاسم.
بيئة التشغيل : يعرض ملخصًا عالي المستوى لبيئة تشغيل النموذج بما في ذلك:
- عدد الأجهزة المضيفة المستخدمة.
- نوع الجهاز (GPU / TPU).
- عدد نوى الجهاز.
توصية بشأن الخطوة التالية : إعداد التقارير عندما يكون النموذج مرتبطًا بالإدخال ويوصي بالأدوات التي يمكنك استخدامها لتحديد معوقات أداء النموذج وحلها.
محلل خط أنابيب الإدخال
عندما يقرأ برنامج TensorFlow البيانات من ملف ، فإنه يبدأ في الجزء العلوي من الرسم البياني TensorFlow بطريقة متسلسلة. تنقسم عملية القراءة إلى عدة مراحل لمعالجة البيانات متصلة في سلسلة ، حيث يكون إخراج إحدى المراحل هو المدخل إلى المرحلة التالية. يسمى هذا النظام لقراءة البيانات خط أنابيب الإدخال .
يحتوي خط الأنابيب النموذجي لقراءة السجلات من الملفات على المراحل التالية:
- قراءة الملف.
- معالجة الملف (اختياري).
- نقل الملفات من المضيف إلى الجهاز.
يمكن أن يؤدي خط أنابيب الإدخال غير الفعال إلى إبطاء تطبيقك بشدة. يعتبر التطبيق مقيدًا بالإدخال عندما يقضي جزءًا كبيرًا من الوقت في خط أنابيب الإدخال. استخدم الرؤى التي تم الحصول عليها من محلل خط أنابيب الإدخال لفهم أين يكون خط أنابيب الإدخال غير فعال.
يخبرك محلل خط أنابيب الإدخال على الفور ما إذا كان برنامجك مرتبطًا بالإدخال ويرشدك خلال تحليل جانب الجهاز والمضيف لتصحيح اختناقات الأداء في أي مرحلة في خط أنابيب الإدخال.
تحقق من الإرشادات الخاصة بأداء تدفق الإدخال للحصول على أفضل الممارسات الموصى بها لتحسين خطوط أنابيب إدخال البيانات الخاصة بك.
لوحة أجهزة القياس في خط أنابيب الإدخال
لفتح محلل خط أنابيب الإدخال ، حدد ملف التعريف ، ثم حدد input_pipeline_analyzer من قائمة الأدوات المنسدلة.
تحتوي لوحة القيادة على ثلاثة أقسام:
- ملخص : يلخص مسار الإدخال العام بمعلومات حول ما إذا كان التطبيق الخاص بك مرتبطًا بالإدخال ، وإذا كان الأمر كذلك ، فكم.
- التحليل من جانب الجهاز : يعرض نتائج التحليل التفصيلية من جانب الجهاز ، بما في ذلك وقت خطوة الجهاز ونطاق الوقت الذي يقضيه الجهاز في انتظار بيانات الإدخال عبر النوى في كل خطوة.
- تحليل جانب المضيف : يعرض تحليلاً مفصلاً على جانب المضيف ، بما في ذلك تفصيل وقت معالجة الإدخال على المضيف.
ملخص خط أنابيب الإدخال
يُبلغ الملخص إذا كان البرنامج الخاص بك مقيدًا بإدخال من خلال تقديم النسبة المئوية للوقت الذي يقضيه الجهاز في انتظار الإدخال من المضيف. إذا كنت تستخدم خط أنابيب إدخال قياسي تم تجهيزه ، تقوم الأداة بالإبلاغ عن المكان الذي يقضي فيه معظم وقت معالجة الإدخال.
تحليل جانب الجهاز
يوفر التحليل من جانب الجهاز رؤى حول الوقت الذي يقضيه الجهاز مقابل المضيف ومقدار الوقت الذي تم قضاؤه في انتظار بيانات الإدخال من المضيف.
- وقت الخطوة المرسوم مقابل رقم الخطوة : يعرض رسمًا بيانيًا لوقت خطوة الجهاز (بالملي ثانية) عبر جميع الخطوات التي تم أخذ عينات منها. يتم تقسيم كل خطوة إلى فئات متعددة (بألوان مختلفة) حيث يتم قضاء الوقت. تتوافق المنطقة الحمراء مع جزء من وقت الخطوة الذي كانت فيه الأجهزة جالسة في وضع الخمول في انتظار بيانات الإدخال من المضيف. تُظهر المنطقة الخضراء مقدار الوقت الذي كان يعمل فيه الجهاز بالفعل.
- إحصائيات وقت الخطوة : يعرض المتوسط والانحراف المعياري والمدى ([الحد الأدنى ، الحد الأقصى]) لوقت خطوة الجهاز.
تحليل جانب المضيف
يُبلغ تحليل جانب المضيف عن تفصيل وقت معالجة الإدخال (الوقت المستغرق في tf.data
API ops) على المضيف إلى عدة فئات:
- قراءة البيانات من الملفات عند الطلب : الوقت المستغرق في قراءة البيانات من الملفات دون التخزين المؤقت والجلب المسبق والتداخل.
- قراءة البيانات من الملفات مسبقًا : الوقت المستغرق في قراءة الملفات ، بما في ذلك التخزين المؤقت والجلب المسبق والتداخل.
- المعالجة المسبقة للبيانات : الوقت المنقضي في عمليات المعالجة المسبقة ، مثل إزالة ضغط الصورة.
- انتظار البيانات المراد نقلها إلى الجهاز : الوقت المستغرق في وضع البيانات في قائمة انتظار البيانات قبل نقل البيانات إلى الجهاز.
قم بتوسيع Input Op Statistics لفحص الإحصائيات الخاصة بعمليات الإدخال الفردية وفئاتها مقسمة حسب وقت التنفيذ.
سيظهر جدول بيانات المصدر مع كل إدخال يحتوي على المعلومات التالية:
- إدخال Op : يعرض اسم عملية TensorFlow لمرجع الإدخال.
- العدد : يعرض العدد الإجمالي لمثيلات تنفيذ العملية أثناء فترة التنميط.
- إجمالي الوقت (بالمللي ثانية) : يعرض المجموع التراكمي للوقت المنقضي في كل من هذه الحالات.
- إجمالي الوقت٪ : يُظهر إجمالي الوقت المنقضي في عملية التشغيل كجزء من إجمالي الوقت المنقضي في معالجة الإدخال.
- إجمالي الوقت الذاتي (بالمللي ثانية) : يعرض المجموع التراكمي للوقت الذاتي الذي يقضيه في كل من هذه الحالات. يقيس الوقت الذاتي هنا الوقت الذي يقضيه داخل الجسم الوظيفي ، باستثناء الوقت الذي يقضيه في الوظيفة التي يستدعيها.
- إجمالي الوقت الذاتي٪ . يُظهر إجمالي الوقت الذاتي كجزء من إجمالي الوقت المنقضي في معالجة الإدخال.
- الفئة . يعرض فئة معالجة مرجع الإدخال.
احصائيات TensorFlow
تعرض أداة TensorFlow Stats أداء كل عملية TensorFlow (عملية تشغيل) يتم تنفيذها على المضيف أو الجهاز أثناء جلسة التوصيف.
تعرض الأداة معلومات الأداء في جزأين:
يعرض الجزء العلوي ما يصل إلى أربعة مخططات دائرية:
- توزيع وقت التنفيذ الذاتي لكل عملية تشغيل على المضيف.
- توزيع وقت التنفيذ الذاتي لكل نوع op على المضيف.
- توزيع وقت التنفيذ الذاتي لكل عملية تشغيل على الجهاز.
- توزيع وقت التنفيذ الذاتي لكل نوع عملية على الجهاز.
يُظهر الجزء السفلي جدولاً يُبلغ عن بيانات حول عمليات TensorFlow بصف واحد لكل عملية وعمود واحد لكل نوع من أنواع البيانات (فرز الأعمدة عن طريق النقر فوق عنوان العمود). انقر فوق الزر تصدير كملف CSV على الجانب الأيمن من الجزء العلوي لتصدير البيانات من هذا الجدول كملف CSV.
لاحظ أن:
إذا كان لدى أي عمليات عمليات طفل:
- إجمالي الوقت "المتراكم" لعملية تشمل الوقت الذي تم قضاؤه داخل العمليات الفرعية.
- إجمالي وقت "الذات" لعملية لا تشمل الوقت الذي يقضيه داخل عمليات الطفل.
إذا تم تنفيذ عملية على المضيف:
- ستكون النسبة المئوية لإجمالي الوقت الذاتي الذي تكبدته العملية على الجهاز 0.
- ستكون النسبة المئوية التراكمية لإجمالي الوقت الذاتي على الجهاز حتى وقت التشغيل هذا متضمنًا 0.
إذا تم تنفيذ عملية على الجهاز:
- ستكون النسبة المئوية لإجمالي الوقت الذاتي الذي يتكبده هذا المرجع على المضيف 0.
- ستكون النسبة المئوية التراكمية لإجمالي الوقت الذاتي على المضيف حتى هذا المرجع بما في ذلك 0.
يمكنك اختيار تضمين أو استبعاد وقت الخمول في المخططات الدائرية والجدول.
عارض التتبع
يعرض عارض التتبع مخططًا زمنيًا يُظهر:
- مدد العمليات التي تم تنفيذها بواسطة نموذج TensorFlow الخاص بك
- أي جزء من النظام (مضيف أو جهاز) نفذ عملية تشغيل. عادةً ما ينفذ المضيف عمليات الإدخال ، ويعالج بيانات التدريب مسبقًا وينقلها إلى الجهاز ، بينما ينفذ الجهاز تدريب النموذج الفعلي
يسمح لك عارض التتبع بتحديد مشاكل الأداء في نموذجك ، ثم اتخاذ الخطوات لحلها. على سبيل المثال ، على مستوى عالٍ ، يمكنك تحديد ما إذا كان التدريب على الإدخال أو النموذج يستغرق معظم الوقت. بالتفصيل ، يمكنك تحديد العمليات التي تستغرق وقتًا أطول في التنفيذ. لاحظ أن عارض التتبع يقتصر على مليون حدث لكل جهاز.
واجهة عارض التتبع
عندما تفتح عارض التتبع ، فإنه يظهر يعرض آخر تشغيل لك:
تحتوي هذه الشاشة على العناصر الرئيسية التالية:
- جزء المخطط الزمني : يعرض العمليات التي نفذها الجهاز والمضيف بمرور الوقت.
- جزء التفاصيل : يعرض معلومات إضافية عن العمليات المحددة في جزء المخطط الزمني.
يحتوي جزء المخطط الزمني على العناصر التالية:
- الشريط العلوي : يحتوي على عناصر تحكم مساعدة مختلفة.
- محور الوقت : يعرض الوقت بالنسبة إلى بداية التتبع.
- تسميات الأقسام والمسار : يحتوي كل قسم على مسارات متعددة ويحتوي على مثلث على اليسار يمكنك النقر فوقه لتوسيع القسم وطيّه. يوجد قسم واحد لكل عنصر معالجة في النظام.
- محدد الأداة : يحتوي على أدوات متنوعة للتفاعل مع عارض التتبع مثل Zoom و Pan و Select و Timing. استخدم أداة التوقيت لتحديد فترة زمنية.
- الأحداث : تعرض الوقت الذي تم خلاله تنفيذ عملية التشغيل أو مدة الأحداث الوصفية ، مثل خطوات التدريب.
الأقسام والمسارات
يحتوي عارض التتبع على الأقسام التالية:
- قسم واحد لكل عقدة جهاز ، مُسمى برقم شريحة الجهاز وعقدة الجهاز داخل الشريحة (على سبيل المثال ،
/device:GPU:0 (pid 0)
). يحتوي كل قسم من عقدة الجهاز على المسارات التالية:- الخطوة : توضح مدة خطوات التدريب التي كانت تعمل على الجهاز
- TensorFlow Ops : يعرض العمليات المنفذة على الجهاز
- XLA Ops : يعرض عمليات XLA (العمليات) التي يتم تشغيلها على الجهاز إذا كان XLA هو المترجم المستخدم (يتم ترجمة كل عملية TensorFlow إلى واحدة أو عدة عمليات XLA. ويترجم مترجم XLA عمليات XLA إلى رمز يتم تشغيله على الجهاز).
- قسم واحد للخيوط التي تعمل على وحدة المعالجة المركزية للجهاز المضيف ، بعنوان "خيوط المضيف" . يحتوي القسم على مسار واحد لكل مؤشر ترابط CPU. لاحظ أنه يمكنك تجاهل المعلومات المعروضة بجانب تسميات الأقسام.
الأحداث
يتم عرض الأحداث ضمن المخطط الزمني بألوان مختلفة ؛ الألوان نفسها ليس لها معنى محدد.
يمكن أن يعرض عارض التتبع أيضًا آثار استدعاءات دالة Python في برنامج TensorFlow الخاص بك. إذا كنت تستخدم tf.profiler.experimental.start
API ، فيمكنك تمكين تتبع Python باستخدام ProfilerOptions
المسماةtuple عند بدء التشكيل الجانبي. بدلاً من ذلك ، إذا كنت تستخدم وضع أخذ العينات للتنميط ، يمكنك تحديد مستوى التتبع باستخدام خيارات القائمة المنسدلة في مربع حوار ملف تعريف الالتقاط .
إحصائيات نواة GPU
تعرض هذه الأداة إحصائيات الأداء والمرجع الأصلي لكل نواة مُسرعة من خلال وحدة معالجة الرسومات.
تعرض الأداة المعلومات في جزأين:
يعرض الجزء العلوي مخططًا دائريًا يُظهر نواة CUDA التي لها أعلى إجمالي الوقت المنقضي.
يعرض الجزء السفلي جدولاً بالبيانات التالية لكل زوج فريد kernel-op:
- ترتيب تنازلي لإجمالي مدة GPU المنقضية مجمعة حسب زوج kernel-op.
- اسم النواة التي تم إطلاقها.
- عدد تسجيلات GPU المستخدمة بواسطة kernel.
- الحجم الإجمالي للذاكرة المشتركة (الثابتة + الديناميكية المشتركة) المستخدمة بالبايت.
- يتم التعبير عن بُعد الكتلة كـ
blockDim.x, blockDim.y, blockDim.z
. - يتم التعبير عن أبعاد الشبكة بالشكل
gridDim.x, gridDim.y, gridDim.z
. - ما إذا كان المرجع مؤهلًا لاستخدام Tensor Cores أم لا.
- ما إذا كانت النواة تحتوي على تعليمات Tensor Core أم لا.
- اسم المرجع الذي أطلق هذه النواة.
- عدد تكرارات زوج kernel-op هذا.
- إجمالي الوقت المنقضي لوحدة معالجة الرسومات بالميكروثانية.
- متوسط الوقت المنقضي لوحدة معالجة الرسومات بالميكروثانية.
- الحد الأدنى من الوقت المنقضي لوحدة معالجة الرسومات بالميكروثانية.
- أقصى وقت منقضي لوحدة معالجة الرسومات بالميكروثانية.
أداة ملف تعريف الذاكرة
تراقب أداة ملف تعريف الذاكرة استخدام الذاكرة لجهازك أثناء فترة التنميط. يمكنك استخدام هذه الأداة من أجل:
- تصحيح مشكلات نفاد الذاكرة (OOM) عن طريق تحديد ذروة استخدام الذاكرة وتخصيص الذاكرة المقابل لعمليات TensorFlow. يمكنك أيضًا تصحيح مشكلات OOM التي قد تنشأ عند تشغيل الاستدلال متعدد الإيجارات .
- تصحيح مشاكل تجزئة الذاكرة.
تعرض أداة ملف تعريف الذاكرة البيانات في ثلاثة أقسام:
- ملخص ملف تعريف الذاكرة
- مخطط الذاكرة الزمني
- جدول تقسيم الذاكرة
ملخص ملف تعريف الذاكرة
يعرض هذا القسم ملخصًا عالي المستوى لملف تعريف الذاكرة لبرنامج TensorFlow الخاص بك كما هو موضح أدناه:
يحتوي ملخص ملف تعريف الذاكرة على ستة حقول:
- معرف الذاكرة : قائمة منسدلة تسرد جميع أنظمة ذاكرة الجهاز المتاحة. حدد نظام الذاكرة الذي تريد عرضه من القائمة المنسدلة.
- # التخصيص : عدد عمليات تخصيص الذاكرة التي تم إجراؤها أثناء فترة التنميط.
- #Deallocation : عدد عمليات إلغاء تخصيص الذاكرة في الفاصل الزمني للتنميط
- سعة الذاكرة: السعة الإجمالية (بالجيجابايت) لنظام الذاكرة الذي تحدده.
- استخدام كومة الذروة : أقصى استخدام للذاكرة (بالجيب) منذ بدء تشغيل النموذج.
- ذروة استخدام الذاكرة : ذروة استخدام الذاكرة (بالجيب) في فاصل التوصيف. يحتوي هذا الحقل على الحقول الفرعية التالية:
- الطابع الزمني : الطابع الزمني لوقت حدوث أقصى استخدام للذاكرة في الرسم البياني للخط الزمني.
- حجز المكدس : مقدار الذاكرة المحجوزة في المكدس (في GiBs).
- تخصيص الكومة : مقدار الذاكرة المخصص في الكومة (بالجيب).
- الذاكرة الحرة : مقدار الذاكرة الفارغة (بالجيب). سعة الذاكرة هي إجمالي حجز المكدس وتخصيص الكومة والذاكرة الخالية.
- التجزئة : النسبة المئوية للتجزئة (الأقل أفضل). يتم حسابها كنسبة مئوية
(1 - Size of the largest chunk of free memory / Total free memory)
.
مخطط زمني للذاكرة
يعرض هذا القسم مخططًا لاستخدام الذاكرة (بالجيب) والنسبة المئوية للتجزئة مقابل الوقت (بالمللي ثانية).
يمثل المحور X المخطط الزمني (بالمللي ثانية) لفاصل التنميط. يمثل المحور Y الموجود على اليسار استخدام الذاكرة (في GiBs) ويمثل المحور Y الموجود على اليمين النسبة المئوية للتجزئة. في كل نقطة زمنية على المحور X ، يتم تقسيم الذاكرة الإجمالية إلى ثلاث فئات: مكدس (باللون الأحمر) ، وكومة (باللون البرتقالي) ، وحرة (باللون الأخضر). مرر مؤشر الماوس فوق طابع زمني محدد لعرض تفاصيل حول أحداث تخصيص / إلغاء تخصيص الذاكرة في تلك النقطة كما هو موضح أدناه:
تعرض النافذة المنبثقة المعلومات التالية:
- الطابع الزمني (مللي ثانية) : موقع الحدث المحدد على المخطط الزمني.
- الحدث : نوع الحدث (تخصيص أو إلغاء تخصيص).
- Request_size (GiBs) : مقدار الذاكرة المطلوب. سيكون هذا رقمًا سالبًا لأحداث إلغاء التخصيص.
- Customize_size (GiBs) : المقدار الفعلي للذاكرة المخصصة. سيكون هذا رقمًا سالبًا لأحداث إلغاء التخصيص.
- tf_op : عملية TensorFlow التي تطلب التخصيص / إلغاء التخصيص.
- step_id : خطوة التدريب التي وقع فيها هذا الحدث.
- region_type : نوع كيان البيانات المخصص لهذه الذاكرة المخصصة. القيم المحتملة هي
temp
persist
output
التنشيط والتدرجات ، والمستمرة /dynamic
للأوزان والثوابت. - data_type : نوع عنصر الموتر (على سبيل المثال ، uint8 لعدد صحيح بدون إشارة 8 بت).
- tensor_shape : شكل الموتر الذي يتم تخصيصه / إلغاء تخصيصه.
- memory_in_use (GiBs) : إجمالي الذاكرة المستخدمة في هذا الوقت.
جدول انهيار الذاكرة
يوضح هذا الجدول عمليات تخصيص الذاكرة النشطة عند نقطة ذروة استخدام الذاكرة في فاصل التوصيف.
يوجد صف واحد لكل عملية TensorFlow Op ولكل صف الأعمدة التالية:
- اسم العملية: اسم مرجع TensorFlow.
- حجم التخصيص (GiBs) : إجمالي مساحة الذاكرة المخصصة لهذا المرجع.
- الحجم المطلوب (GiBs) : إجمالي حجم الذاكرة المطلوبة لهذا المرجع.
- مرات التكرار : عدد التخصيصات لهذا المرجع.
- نوع المنطقة : نوع كيان البيانات المخصص لهذه الذاكرة المخصصة. القيم المحتملة هي
temp
persist
output
التنشيط والتدرجات ، والمستمرة /dynamic
للأوزان والثوابت. - نوع البيانات : نوع عنصر الموتر.
- الشكل : شكل الموترات المخصصة.
عارض جراب
تعرض أداة Pod Viewer تفاصيل خطوة التدريب عبر جميع العاملين.
- يحتوي الجزء العلوي على شريط تمرير لتحديد رقم الخطوة.
- يعرض الجزء السفلي مخططًا عموديًا مكدسًا. هذه طريقة عرض عالية المستوى لفئات وقت الخطوة المقسمة الموضوعة فوق بعضها البعض. يمثل كل عمود مكدس عاملًا فريدًا.
- عند التمرير فوق عمود مكدس ، تعرض البطاقة الموجودة على الجانب الأيسر مزيدًا من التفاصيل حول تقسيم الخطوات.
tf.data تحليل عنق الزجاجة
تكتشف أداة تحليل عنق الزجاجة tf.data
تلقائيًا الاختناقات في خطوط أنابيب الإدخال tf.data
في برنامجك وتقدم توصيات حول كيفية إصلاحها. يعمل مع أي برنامج يستخدم tf.data
بغض النظر عن النظام الأساسي (CPU / GPU / TPU). تستند تحليلاتها وتوصياتها على هذا الدليل .
يكتشف عنق الزجاجة باتباع الخطوات التالية:
- ابحث عن المضيف الأكثر ارتباطًا بالمدخلات.
- ابحث عن أبطأ تنفيذ لخط أنابيب إدخال
tf.data
. - إعادة بناء الرسم البياني لخط أنابيب الإدخال من تتبع ملف التعريف.
- ابحث عن المسار الحرج في الرسم البياني لخط أنابيب الإدخال.
- حدد التحول الأبطأ على المسار الحرج باعتباره عنق الزجاجة.
تنقسم واجهة المستخدم إلى ثلاثة أقسام: ملخص تحليل الأداء ، وملخص لجميع خطوط أنابيب الإدخال ، ورسم بياني لخط أنابيب الإدخال .
ملخص تحليل الأداء
يقدم هذا القسم ملخصًا للتحليل. يقوم بالإبلاغ عن خطوط إدخال tf.data
البطيئة المكتشفة في الملف الشخصي. يعرض هذا القسم أيضًا المضيف الأكثر ارتباطًا بالإدخال وأبطأ خط أنابيب مع زمن انتقال قصوى. والأهم من ذلك ، أنه يحدد أي جزء من خط أنابيب الإدخال هو عنق الزجاجة وكيفية إصلاحه. يتم توفير معلومات عنق الزجاجة مع نوع المكرر واسمه الطويل.
كيف تقرأ الاسم الطويل لمكرر tf.data
اسم طويل منسق كـ Iterator::<Dataset_1>::...::<Dataset_n>
. في الاسم الطويل ، <Dataset_n>
مع نوع المكرر وتمثل مجموعات البيانات الأخرى في الاسم الطويل تحويلات المصب.
على سبيل المثال ، ضع في اعتبارك مجموعة بيانات خط أنابيب الإدخال التالية:
dataset = tf.data.Dataset.range(10).map(lambda x: x).repeat(2).batch(5)
ستكون الأسماء الطويلة للمكررات من مجموعة البيانات أعلاه:
نوع التكرار | اسم طويل |
---|---|
نطاق | التكرار :: دفعة :: كرر :: خريطة :: نطاق |
خريطة | التكرار :: دفعة :: كرر :: خريطة |
يكرر | التكرار :: دفعة :: كرر |
حزمة | التكرار :: دفعة |
ملخص لجميع خطوط أنابيب الإدخال
يوفر هذا القسم ملخصًا لجميع خطوط أنابيب الإدخال عبر جميع المضيفين. عادة ما يكون هناك خط أنابيب إدخال واحد. عند استخدام إستراتيجية التوزيع ، يوجد خط أنابيب إدخال مضيف واحد يقوم بتشغيل كود tf.data
للبرنامج وخطوط إدخال متعددة للأجهزة تسترجع البيانات من خط أنابيب إدخال المضيف وتنقلها إلى الأجهزة.
لكل خط أنابيب إدخال ، فإنه يعرض إحصائيات وقت التنفيذ. يتم احتساب المكالمة على أنها بطيئة إذا استغرقت أكثر من 50 ميكرو ثانية.
رسم بياني لخط أنابيب الإدخال
يعرض هذا القسم الرسم البياني لخط أنابيب الإدخال مع معلومات وقت التنفيذ. يمكنك استخدام "المضيف" و "خط الإدخال" لاختيار المضيف وخط أنابيب الإدخال الذي تريد رؤيته. يتم فرز عمليات تنفيذ خط أنابيب الإدخال حسب وقت التنفيذ بترتيب تنازلي يمكنك اختياره باستخدام قائمة الترتيب المنسدلة.
العقد على المسار الحرج لها خطوط عريضة جريئة. عقدة عنق الزجاجة ، وهي العقدة ذات أطول وقت ذاتي على المسار الحرج ، لها مخطط أحمر. العقد الأخرى غير الحرجة لها مخططات متقطعة رمادية اللون.
في كل عقدة ، يشير وقت البدء إلى وقت بدء التنفيذ. يمكن تنفيذ نفس العقدة عدة مرات ، على سبيل المثال ، إذا كان هناك Batch
في خط أنابيب الإدخال. إذا تم تنفيذه عدة مرات ، فهذا هو وقت بدء التنفيذ الأول.
المدة الإجمالية هي وقت جدار التنفيذ. إذا تم تنفيذه عدة مرات ، فسيكون مجموع مرات الحائط لجميع عمليات التنفيذ.
الوقت الذاتي هو إجمالي الوقت بدون الوقت المتداخل مع العقد الفرعية المباشرة الخاصة به.
"# Calls" هو عدد المرات التي يتم فيها تنفيذ خط أنابيب الإدخال.
جمع بيانات الأداء
يجمع TensorFlow Profiler أنشطة المضيف وآثار GPU لنموذج TensorFlow الخاص بك. يمكنك تكوين منشئ ملفات التعريف لتجميع بيانات الأداء من خلال الوضع البرمجي أو وضع أخذ العينات.
التنميط واجهات برمجة التطبيقات
يمكنك استخدام واجهات برمجة التطبيقات التالية لإجراء التنميط.
الوضع البرمجي باستخدام TensorBoard Keras Callback (
tf.keras.callbacks.TensorBoard
)# Profile from batches 10 to 15 tb_callback = tf.keras.callbacks.TensorBoard(log_dir=log_dir, profile_batch='10, 15') # Train the model and use the TensorBoard Keras callback to collect # performance profiling data model.fit(train_data, steps_per_epoch=20, epochs=5, callbacks=[tb_callback])
الوضع البرمجي باستخدام
tf.profiler
Function APItf.profiler.experimental.start('logdir') # Train the model here tf.profiler.experimental.stop()
الوضع البرمجي باستخدام مدير السياق
with tf.profiler.experimental.Profile('logdir'): # Train the model here pass
وضع أخذ العينات: قم بإجراء التنميط عند الطلب باستخدام
tf.profiler.experimental.server.start
لبدء تشغيل خادم gRPC مع تشغيل نموذج TensorFlow. بعد بدء تشغيل خادم gRPC وتشغيل النموذج الخاص بك ، يمكنك التقاط ملف تعريف من خلال زر Capture Profile في المكوّن الإضافي لملف تعريف TensorBoard. استخدم البرنامج النصي في قسم Install profiler أعلاه لتشغيل مثيل TensorBoard إذا لم يكن قيد التشغيل بالفعل.كمثال،
# Start a profiler server before your model runs. tf.profiler.experimental.server.start(6009) # (Model code goes here). # Send a request to the profiler server to collect a trace of your model. tf.profiler.experimental.client.trace('grpc://localhost:6009', 'gs://your_tb_logdir', 2000)
مثال على تصنيف العديد من العمال:
# E.g. your worker IP addresses are 10.0.0.2, 10.0.0.3, 10.0.0.4, and you # would like to profile for a duration of 2 seconds. tf.profiler.experimental.client.trace( 'grpc://10.0.0.2:8466,grpc://10.0.0.3:8466,grpc://10.0.0.4:8466', 'gs://your_tb_logdir', 2000)
استخدم مربع حوار ملف تعريف الالتقاط لتحديد:
- قائمة محددة بفواصل لعناوين URL لخدمة الملف الشخصي أو أسماء TPU.
- مدة التنميط.
- مستوى تتبع استدعاء الجهاز والمضيف ووظيفة Python.
- كم مرة تريد أن يقوم منشئ ملفات التعريف بإعادة محاولة التقاط ملفات التعريف إذا لم تنجح في البداية.
التنميط الحلقات التدريبية المخصصة
لتشكيل حلقات تدريب مخصصة في كود TensorFlow الخاص بك ، قم بأداة حلقة التدريب باستخدام tf.profiler.experimental.Trace
API لتحديد حدود الخطوة لملف التعريف.
يتم استخدام وسيطة name
كبادئة لأسماء الخطوات ، ويتم إلحاق وسيطة الكلمة الأساسية step_num
في أسماء الخطوات ، وتجعل وسيطة الكلمة الأساسية _r
تتم معالجة حدث التتبع هذا كحدث خطوة بواسطة منشئ ملفات التعريف.
كمثال،
for step in range(NUM_STEPS):
with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
train_data = next(dataset)
train_step(train_data)
سيؤدي ذلك إلى تمكين تحليل الأداء المستند إلى الخطوة لملف التعريف وسيؤدي إلى ظهور أحداث الخطوة في عارض التتبع.
تأكد من تضمين مكرر مجموعة البيانات في سياق tf.profiler.experimental.Trace
لتحليل دقيق لخط أنابيب الإدخال.
مقتطف الشفرة أدناه مضاد للنمط:
for step, train_data in enumerate(dataset):
with tf.profiler.experimental.Trace('train', step_num=step, _r=1):
train_step(train_data)
التنميط حالات الاستخدام
يغطي ملف التعريف عددًا من حالات الاستخدام على طول أربعة محاور مختلفة. يتم دعم بعض المجموعات حاليًا وستتم إضافة البعض الآخر في المستقبل. بعض حالات الاستخدام هي:
- التنميط المحلي مقابل التنميط عن بُعد : هاتان طريقتان شائعتان لإعداد بيئة التوصيف الخاصة بك. في التنميط المحلي ، يتم استدعاء API على نفس الجهاز الذي ينفذه نموذجك ، على سبيل المثال ، محطة عمل محلية مع وحدات معالجة الرسومات. في التنميط عن بُعد ، يتم استدعاء واجهة برمجة تطبيقات التوصيف على جهاز مختلف من حيث يتم تنفيذ نموذجك ، على سبيل المثال ، على Cloud TPU.
- تحديد ملفات تعريف عدة عمال : يمكنك وضع ملفات تعريف لأجهزة متعددة عند استخدام إمكانات التدريب الموزعة في TensorFlow.
- النظام الأساسي للأجهزة : وحدات المعالجة المركزية (CPUs) ، ووحدات معالجة الرسومات (GPU) ، ووحدات المعالجة المركزية (TPU).
يوفر الجدول أدناه نظرة عامة سريعة على حالات الاستخدام المدعومة من TensorFlow المذكورة أعلاه:
التنميط API | محلي | بعيد | تعدد العمال | منصات الأجهزة |
---|---|---|---|---|
رد اتصال Keras من TensorBoard | أيد | غير مدعوم | غير مدعوم | وحدة المعالجة المركزية ، وحدة معالجة الرسومات |
tf.profiler.experimental start / stop API | أيد | غير مدعوم | غير مدعوم | وحدة المعالجة المركزية ، وحدة معالجة الرسومات |
tf.profiler.experimental client.trace API | أيد | أيد | أيد | وحدة المعالجة المركزية ، GPU ، TPU |
مدير السياق API | أيد | غير مدعوم | غير مدعوم | وحدة المعالجة المركزية ، وحدة معالجة الرسومات |
أفضل الممارسات لأداء النموذج الأمثل
استخدم التوصيات التالية حسب الاقتضاء لنماذج TensorFlow لتحقيق الأداء الأمثل.
بشكل عام ، قم بإجراء جميع التحويلات على الجهاز وتأكد من استخدام أحدث إصدار متوافق من المكتبات مثل cuDNN و Intel MKL لمنصتك.
تحسين خط أنابيب إدخال البيانات
استخدم البيانات من [#input_pipeline_analyzer] لتحسين خط أنابيب إدخال البيانات. يمكن أن يؤدي خط أنابيب إدخال البيانات الفعال إلى تحسين سرعة تنفيذ النموذج بشكل كبير عن طريق تقليل وقت خمول الجهاز. حاول دمج أفضل الممارسات المفصلة في Better Performance مع دليل tf.data API وأدناه لجعل خط أنابيب إدخال البيانات الخاص بك أكثر كفاءة.
بشكل عام ، يمكن أن تؤدي موازاة أي عمليات لا تحتاج إلى تنفيذها بالتتابع إلى تحسين خط أنابيب إدخال البيانات بشكل كبير.
في كثير من الحالات ، من المفيد تغيير ترتيب بعض المكالمات أو ضبط الوسائط بحيث تعمل بشكل أفضل مع نموذجك. أثناء تحسين خط أنابيب بيانات الإدخال ، قم بقياس أداة تحميل البيانات فقط دون التدريب وخطوات الانتشار العكسي لتقدير تأثير التحسينات بشكل مستقل.
حاول تشغيل نموذجك ببيانات تركيبية للتحقق مما إذا كان خط أنابيب الإدخال يمثل عقبة في الأداء.
استخدم
tf.data.Dataset.shard
على وحدات معالجة الرسومات المتعددة. تأكد من أن تكون جزءًا مبكرًا جدًا في حلقة الإدخال لمنع حدوث انخفاض في الإنتاجية. عند العمل باستخدام سجلات TFRecords ، تأكد من تقسيم قائمة سجلات TFRecords وليس محتويات سجلات TFRecords.قم
tf.data.AUTOTUNE
num_parallel_calls
ضع في اعتبارك الحد من استخدام
tf.data.Dataset.from_generator
لأنه أبطأ مقارنة بعمليات TensorFlow النقية.ضع في اعتبارك تقييد استخدام
tf.py_function
لأنه لا يمكن إجراء تسلسل له وغير مدعوم للتشغيل في TensorFlow الموزع.استخدم
tf.data.Options
للتحكم في التحسينات الثابتة لخط أنابيب الإدخال.
اقرأ أيضًا دليل تحليل أداء tf.data
لمزيد من الإرشادات حول تحسين خط أنابيب الإدخال.
تحسين زيادة البيانات
عند العمل مع بيانات الصورة ، اجعل زيادة البيانات أكثر كفاءة من خلال الإرسال إلى أنواع بيانات مختلفة بعد تطبيق التحويلات المكانية ، مثل التقليب والقص والتدوير وما إلى ذلك.
استخدم NVIDIA® DALI
في بعض الحالات ، كما هو الحال عندما يكون لديك نظام به نسبة GPU إلى CPU عالية ، قد لا تكون جميع التحسينات المذكورة أعلاه كافية للتخلص من الاختناقات في أداة تحميل البيانات الناتجة عن قيود دورات وحدة المعالجة المركزية.
إذا كنت تستخدم NVIDIA® GPUs لرؤية الكمبيوتر وتطبيقات التعلم العميق الصوتية ، ففكر في استخدام مكتبة تحميل البيانات ( DALI ) لتسريع خط أنابيب البيانات.
تحقق من NVIDIA® DALI: وثائق العمليات للحصول على قائمة عمليات DALI المدعومة.
استخدام الخيوط والتنفيذ المتوازي
قم بتشغيل عمليات التشغيل على مؤشرات ترابط متعددة لوحدة المعالجة المركزية باستخدام واجهة برمجة تطبيقات tf.config.threading
لتنفيذها بشكل أسرع.
يقوم TensorFlow تلقائيًا بتعيين عدد سلاسل التوازي افتراضيًا. يعتمد تجمع مؤشرات الترابط المتاح لتشغيل عمليات TensorFlow على عدد سلاسل عمليات وحدة المعالجة المركزية المتاحة.
تحكم في أقصى سرعة موازية لعملية واحدة باستخدام tf.config.threading.set_intra_op_parallelism_threads
. لاحظ أنه إذا قمت بتشغيل عمليات متعددة بالتوازي ، فسيقومون جميعًا بمشاركة مجموعة مؤشرات الترابط المتاحة.
إذا كان لديك عمليات مستقلة غير معطلة (عمليات بدون مسار موجه بينها على الرسم البياني) ، فاستخدم tf.config.threading.set_inter_op_parallelism_threads
لتشغيلها بشكل متزامن باستخدام تجمع مؤشرات الترابط المتاح.
متفرقات
عند العمل مع طرز أصغر على وحدات معالجة الرسومات NVIDIA® ، يمكنك تعيين tf.compat.v1.ConfigProto.force_gpu_compatible=True
لإجبار جميع موترات وحدة المعالجة المركزية على التخصيص مع الذاكرة المثبتة CUDA لإعطاء دفعة كبيرة لأداء النموذج. ومع ذلك ، توخ الحذر أثناء استخدام هذا الخيار لنماذج غير معروفة / كبيرة جدًا لأن هذا قد يؤثر سلبًا على أداء المضيف (وحدة المعالجة المركزية).
تحسين أداء الجهاز
اتبع أفضل الممارسات المفصلة هنا وفي دليل تحسين أداء وحدة معالجة الرسومات لتحسين أداء نموذج TensorFlow على الجهاز.
إذا كنت تستخدم NVIDIA GPUs ، فقم بتسجيل استخدام GPU والذاكرة في ملف CSV عن طريق تشغيل:
nvidia-smi
--query-gpu=utilization.gpu,utilization.memory,memory.total,
memory.free,memory.used --format=csv
تكوين تخطيط البيانات
عند العمل مع البيانات التي تحتوي على معلومات القناة (مثل الصور) ، قم بتحسين تنسيق تخطيط البيانات لتفضيل القنوات الأخيرة (NHWC عبر NCHW).
تعمل تنسيقات بيانات القناة الأخيرة على تحسين استخدام Tensor Core وتوفر تحسينات كبيرة في الأداء خاصة في النماذج التلافيفية عند اقترانها بـ AMP. لا يزال من الممكن تشغيل تخطيطات بيانات NCHW بواسطة Tensor Cores ، ولكنها تقدم حملًا إضافيًا بسبب عمليات النقل التلقائي.
يمكنك تحسين تخطيط البيانات لتفضيل تخطيطات NHWC عن طريق تعيين data_format="channels_last"
لطبقات مثل tf.keras.layers.Conv2D
و tf.keras.layers.Conv3D
و tf.keras.layers.RandomRotation
.
استخدم tf.keras.backend.set_image_data_format
لتعيين تنسيق تخطيط البيانات الافتراضي لواجهة برمجة تطبيقات Keras الخلفية.
ماكس خارج ذاكرة التخزين المؤقت L2
When working with NVIDIA® GPUs, execute the code snippet below before the training loop to max out the L2 fetch granularity to 128 bytes.
import ctypes
_libcudart = ctypes.CDLL('libcudart.so')
# Set device limit on the current device
# cudaLimitMaxL2FetchGranularity = 0x05
pValue = ctypes.cast((ctypes.c_int*1)(), ctypes.POINTER(ctypes.c_int))
_libcudart.cudaDeviceSetLimit(ctypes.c_int(0x05), ctypes.c_int(128))
_libcudart.cudaDeviceGetLimit(pValue, ctypes.c_int(0x05))
assert pValue.contents.value == 128
Configure GPU thread usage
The GPU thread mode decides how GPU threads are used.
Set the thread mode to gpu_private
to make sure that preprocessing does not steal all the GPU threads. This will reduce the kernel launch delay during training. You can also set the number of threads per GPU. Set these values using environment variables.
import os
os.environ['TF_GPU_THREAD_MODE']='gpu_private'
os.environ['TF_GPU_THREAD_COUNT']='1'
Configure GPU memory options
In general, increase the batch size and scale the model to better utilize GPUs and get higher throughput. Note that increasing the batch size will change the model's accuracy so the model needs to be scaled by tuning hyperparameters like the learning rate to meet the target accuracy.
Also, use tf.config.experimental.set_memory_growth
to allow GPU memory to grow to prevent all the available memory from being fully allocated to ops that require only a fraction of the memory. This allows other processes which consume GPU memory to run on the same device.
To learn more, check out the Limiting GPU memory growth guidance in the GPU guide to learn more.
Miscellaneous
Increase the training mini-batch size (number of training samples used per device in one iteration of the training loop) to the maximum amount that fits without an out of memory (OOM) error on the GPU. Increasing the batch size impacts the model's accuracy—so make sure you scale the model by tuning hyperparameters to meet the target accuracy.
Disable reporting OOM errors during tensor allocation in production code. Set
report_tensor_allocations_upon_oom=False
intf.compat.v1.RunOptions
.For models with convolution layers, remove bias addition if using batch normalization. Batch normalization shifts values by their mean and this removes the need to have a constant bias term.
Use TF Stats to find out how efficiently on-device ops run.
Use
tf.function
to perform computations and optionally, enable thejit_compile=True
flag (tf.function(jit_compile=True
). To learn more, go to Use XLA tf.function .Minimize host Python operations between steps and reduce callbacks. Calculate metrics every few steps instead of at every step.
Keep the device compute units busy.
Send data to multiple devices in parallel.
Consider using 16-bit numerical representations , such as
fp16
—the half-precision floating point format specified by IEEE—or the Brain floating-point bfloat16 format.
Additional resources
- The TensorFlow Profiler: Profile model performance tutorial with Keras and TensorBoard where you can apply the advice in this guide.
- The Performance profiling in TensorFlow 2 talk from the TensorFlow Dev Summit 2020.
- The TensorFlow Profiler demo from the TensorFlow Dev Summit 2020.
Known limitations
Profiling multiple GPUs on TensorFlow 2.2 and TensorFlow 2.3
TensorFlow 2.2 and 2.3 support multiple GPU profiling for single host systems only; multiple GPU profiling for multi-host systems is not supported. To profile multi-worker GPU configurations, each worker has to be profiled independently. From TensorFlow 2.4 multiple workers can be profiled using the tf.profiler.experimental.client.trace
API.
CUDA® Toolkit 10.2 or later is required to profile multiple GPUs. As TensorFlow 2.2 and 2.3 support CUDA® Toolkit versions only up to 10.1, you need to create symbolic links to libcudart.so.10.1
and libcupti.so.10.1
:
sudo ln -s /usr/local/cuda/lib64/libcudart.so.10.2 /usr/local/cuda/lib64/libcudart.so.10.1
sudo ln -s /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.2 /usr/local/cuda/extras/CUPTI/lib64/libcupti.so.10.1