عملکرد TensorFlow را با استفاده از Profiler بهینه کنید

این راهنما نحوه استفاده از ابزارهای موجود با TensorFlow Profiler برای ردیابی عملکرد مدلهای TensorFlow شما را نشان می دهد. شما یاد خواهید گرفت که چگونه عملکرد مدل خود را روی میزبان (CPU) ، دستگاه (GPU) یا ترکیبی از میزبان و دستگاه (ها) درک کنید.

پروفایل به شما کمک می کند تا میزان مصرف سخت افزار (زمان و حافظه) عملیات مختلف TensorFlow (مدل ها) در مدل شما را درک کرده و گلوگاه های عملکرد را برطرف کرده و در نهایت ، اجرای مدل را سریعتر انجام دهیم.

این راهنما شما را در چگونگی نصب Profiler ، ابزارهای مختلف موجود ، حالت های مختلف نحوه جمع آوری داده های عملکرد Profiler و برخی از بهترین روش های توصیه شده برای بهینه سازی عملکرد مدل ، راهنمایی می کند.

اگر می خواهید مشخصات عملکرد مدل را در ابر TPU ها، به مراجعه راهنمای ابر TPU .

پیش نیازهای Profiler و GPU را نصب کنید

پلاگین Profiler را برای TensorBoard با pip نصب کنید. توجه داشته باشید که Profiler به آخرین نسخه های TensorFlow و TensorBoard نیاز دارد (> = 2.2).

pip install -U tensorboard_plugin_profile

برای نمایه سازی در GPU ، باید:

  1. دیدار با رانندگان NVIDIA® GPU و الزامات CUDA® جعبه ابزار ذکر شده در TensorFlow GPU نرم افزار مورد نیاز پشتیبانی .
  2. اطمینان حاصل کنید که ابزارهای NVIDIA® CUDA® پروفایل رابط (CUPTI) در مسیر وجود دارد:

    /sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH) | \
    grep libcupti
    

اگر شما CUPTI در مسیر ندارد، دایرکتوری نصب خود را به prepend کنید $LD_LIBRARY_PATH متغیر محیطی در حال اجرا توسط:

export LD_LIBRARY_PATH=/usr/local/cuda/extras/CUPTI/lib64:$LD_LIBRARY_PATH

سپس، اجرای ldconfig دستور بالا دوباره که به منظور بررسی کتابخانه CUPTI یافت شده است.

مسائل امتیاز را حل کنید

هنگامی که شما اجرا پروفایل با CUDA® جعبه ابزار در یک محیط کارگر بارانداز و یا بر روی لینوکس، شما ممکن است مسائل مربوط به امتیازات CUPTI کافی (روبرو می شوند CUPTI_ERROR_INSUFFICIENT_PRIVILEGES ). برو به اسناد توسعه NVIDIA برای کسب اطلاعات بیشتر در مورد چگونه شما می توانید این مسائل بر روی لینوکس را حل کند.

برای حل مشکلات امتیاز CUPTI در یک محیط Docker ، اجرا کنید

docker run option '--privileged=true'

ابزار پروفایل

دسترسی به نیمرخ از تب مشخصات در TensorBoard، که به نظر می رسد تنها پس از برخی از داده ها مدل شما را دستگیر کرده اند.

Profiler دارای مجموعه ای از ابزارها برای کمک به تجزیه و تحلیل عملکرد است:

  • صفحه نمای کلی
  • آنالیز کننده خط لوله ورودی
  • آمار TensorFlow
  • ردیابی کننده
  • آمار هسته GPU
  • ابزار نمایه حافظه
  • Pod Viewer

صفحه نمای کلی

صفحه مروری نمای بالایی از نحوه عملکرد مدل شما در حین اجرای نمایه را ارائه می دهد. این صفحه یک صفحه مروری کلی برای میزبان و همه دستگاه ها و برخی توصیه ها برای بهبود عملکرد آموزش مدل شما به شما نشان می دهد. همچنین می توانید میزبانهای جداگانه را در لیست کشویی میزبان انتخاب کنید.

صفحه مروری داده ها را به صورت زیر نمایش می دهد:

تصویر

  • عملکرد خلاصه: نمایش خلاصه سطح بالایی از عملکرد مدل خود را. خلاصه عملکرد دو بخش دارد:

    1. تفکیک مرحله به مرحله: تقسیم متوسط ​​زمان گام به چندین دسته از زمان صرف شده:

      • تدوین: زمان صرف شده برای جمع آوری هسته ها.
      • ورودی: زمان صرف شده برای خواندن داده های ورودی.
      • خروجی: زمان صرف شده برای خواندن داده های خروجی.
      • راه اندازی هسته: زمانی که میزبان برای راه اندازی هسته صرف کرده است
      • میزبان زمان محاسبه ..
      • زمان ارتباط دستگاه به دستگاه
      • زمان محاسبه روی دستگاه
      • همه موارد دیگر ، از جمله پایتون سربار.
    2. دقت محاسبه دستگاه - درصدی از زمان محاسبه دستگاه را گزارش می کند که از محاسبات 16 و 32 بیتی استفاده می کند.

  • گام زمان نمودار: یک گراف از زمان گام دستگاه (به میلی ثانیه) بیش از همه مراحل نمونه برداری شد. هر مرحله به چند دسته تقسیم می شود (با رنگ های مختلف) که در آن زمان صرف می شود. قسمت قرمز مربوط به بخشی از زمان پله ای است که دستگاه ها بیکار نشسته اند و منتظر دریافت اطلاعات ورودی از میزبان هستند. قسمت سبز نشان می دهد که دستگاه واقعاً چه مدت کار می کند.

  • صفحه 10 عملیات TensorFlow بر روی دستگاه (به عنوان مثال GPU): نمایش عملیات روی دستگاه که طولانی ترین بود.

    هر سطر زمان خود اپ (مانند درصدی از زمان برای همه اپ ها) ، زمان تجمعی ، دسته و نام را نشان می دهد.

  • محیط زیست اجرا: نمایش خلاصه در سطح بالا از محیط زیست مدل اجرا از جمله:

    • تعداد میزبان استفاده شده
    • نوع دستگاه (GPU / TPU).
    • تعداد هسته های دستگاه
  • توصیه برای مرحله بعد: گزارش وقتی که یک مدل ورودی محدود است و ابزار توصیه شما می توانید برای قرار دادن و تنگناها عملکرد مدل عزم استفاده کنید.

آنالیز کننده خط لوله ورودی

هنگامی که یک برنامه TensorFlow داده ها را از یک فایل می خواند ، در بالای نمودار TensorFlow به صورت خط لوله آغاز می شود. فرآیند خواندن به چندین مرحله پردازش داده متصل به یکدیگر تقسیم می شود ، جایی که خروجی یک مرحله ورودی به مرحله بعدی است. این سیستم از داده ها خواندن است که به نام خط لوله ورودی.

خط لوله معمول برای خواندن سوابق از پرونده ها مراحل زیر را دارد:

  1. خواندن پرونده
  2. پیش پردازش پرونده (اختیاری).
  3. انتقال پرونده از میزبان به دستگاه.

خط لوله ورودی ناکارآمد می تواند به شدت باعث کاهش سرعت برنامه شما شود. یک برنامه در نظر گرفته شده ورودی محدود هنگامی که آن را خرج می کند بخش قابل توجهی از زمان در خط لوله ورودی. از بینش های به دست آمده از تجزیه و تحلیل خط لوله ورودی استفاده کنید تا درک کنید که خط لوله ورودی ناکارآمد است.

تجزیه و تحلیل خط لوله ورودی بلافاصله به شما می گوید که آیا برنامه شما ورودی محدود است یا شما را از طریق تجزیه و تحلیل دستگاه و میزبان هدایت می کند تا گلوگاه های عملکرد را در هر مرحله از خط لوله ورودی اشکال زدایی کنید.

برای بهینه سازی خطوط لوله ورودی داده ، راهنمایی در مورد عملکرد خط لوله ورودی را بررسی کنید.

داشبورد خط لوله ورودی

برای باز کردن تجزیه و تحلیل خط لوله ورودی، مشخصات انتخاب کنید، سپس از منوی کرکره ای input_pipeline_analyzer ابزارهای انتخاب کنید.

تصویر

داشبورد شامل سه بخش است:

  1. خلاصه: خلاصه خط لوله ورودی به طور کلی با اطلاعات در مورد اینکه آیا درخواست شما به ورودی محدود و اگر چنین است، چه مقدار.
  2. تجزیه و تحلیل دستگاه های سمت: نمایش جزئیات، نتایج تجزیه و تحلیل دستگاه های سمت، از جمله دستگاه گام به زمان و طیف وسیعی از زمان را صرف دستگاه در حال انتظار برای داده های ورودی در سراسر هسته در هر مرحله.
  3. تجزیه و تحلیل میزبان سمت را نشان می دهد تجزیه و تحلیل دقیق در قسمت میزبان، از جمله یک شکست از زمان پردازش ورودی بر روی میزبان.

خلاصه خط لوله ورودی

خلاصه گزارش اگر برنامه شما ورودی را موظف به ارائه درصد زمان صرف شده در دستگاه منتظر ورودی از میزبان است. اگر از خط لوله ورودی استاندارد استفاده می کنید ، ابزار گزارش می دهد که بیشتر زمان پردازش ورودی صرف شده است.

آنالیز سمت دستگاه

تجزیه و تحلیل سمت دستگاه ، اطلاعاتی در مورد زمان صرف شده بر روی دستگاه در مقابل میزبان و مدت زمان صرف شده دستگاه در انتظار دریافت داده های ورودی از میزبان ارائه می دهد.

  1. زمان مرحله رسم برابر تعداد گام: یک گراف از زمان گام دستگاه (به میلی ثانیه) بیش از همه مراحل نمونه برداری شد. هر مرحله به چند دسته تقسیم می شود (با رنگ های مختلف) که در آن زمان صرف می شود. قسمت قرمز مربوط به بخشی از زمان پله ای است که دستگاه ها بیکار نشسته اند و منتظر دریافت اطلاعات ورودی از میزبان هستند. قسمت سبز نشان می دهد که چه مدت از زمان کار دستگاه در واقع است.
  2. آمار زمان مرحله: گزارش متوسط، انحراف استاندارد، و دامنه ([حداقل، حداکثر) از زمان گام دستگاه.

تحلیل سمت میزبان

تجزیه و تحلیل میزبان سمت گزارش یک شکست از زمان پردازش ورودی (زمان صرف شده در tf.data عملیات API) بر روی میزبان به چند دسته:

  • خواندن داده ها از فایل ها بر روی تقاضا: زمان در خواندن اطلاعات از فایل های بدون caching، واکشی اولیه، و interleaving به سر برد.
  • خواندن داده ها از فایل های در پیش: زمان صرف خواندن فایل، از جمله ذخیره، واکشی اولیه، و interleaving.
  • داده از پیش پردازش: زمان در عملیات پیش پردازش، مانند رفع فشار تصویر به سر برد.
  • داده نوبت بندی به دستگاه منتقل شوند: زمان صرف قرار دادن داده ها را به صف infeed قبل از انتقال داده ها به دستگاه.

باز ورودی آمار عملیات به بازرسی فعالیت عملیات ورودی فردی و دسته خود را با زمان اجرای شکسته.

تصویر

یک جدول داده منبع با هر ورودی حاوی اطلاعات زیر ظاهر می شود:

  1. عملیات ورودی: نشان می دهد که TensorFlow نام عملیات در op ورودی.
  2. تعداد: نشان می دهد تعداد کل موارد اعدام عملیات در طول دوره پروفایل است.
  3. مجموع مدت زمان (به میلی ثانیه): از مجموع تجمعی از زمان صرف شده در هر یک از این موارد نشان می دهد.
  4. مجموع مدت زمان٪ را نشان می دهد کل زمان در عملیات به عنوان یک بخش از کل زمان صرف شده در پردازش ورودی به سر برد.
  5. مجموع خود زمان (به میلی ثانیه): از مجموع تجمعی از زمان خود را صرف در هر یک از این موارد نشان می دهد. زمان خود در اینجا زمان صرف شده در داخل بدن را اندازه گیری می کند ، به استثنای زمان صرف شده در عملکردی که فراخوانی می شود.
  6. مجموع مدت زمان خود. کل زمان خود را به عنوان کسری از کل زمان صرف شده برای پردازش ورودی نشان می دهد.
  7. رده. دسته پردازش ورودی را نشان می دهد.

آمار TensorFlow

ابزار TensorFlow Stats عملکرد هر TensorFlow (op) را که در یک جلسه پروفایل بر روی میزبان یا دستگاه اجرا می شود ، نمایش می دهد.

تصویر

این ابزار اطلاعات عملکرد را در دو صفحه نمایش می دهد:

  • در قسمت بالا حداکثر چهار نمودار دایره ای نمایش داده می شود:

    1. توزیع زمان اجرای خودکار هر یک از گزینه ها بر روی میزبان.
    2. توزیع زمان اجرای خودکار هر نوع op بر روی میزبان.
    3. توزیع زمان اجرای خودکار هر یک از دستگاه ها.
    4. توزیع زمان اجرای خودکار هر نوع عملیات بر روی دستگاه.
  • در قسمت پایین ، جدولی نشان داده شده است که داده های مربوط به عملیات TensorFlow را با یک ردیف برای هر عملیات و یک ستون برای هر نوع داده گزارش می کند (ستون ها را با کلیک روی عنوان ستون مرتب کنید). با کلیک بر روی صادرات به CSV روی دکمه در سمت راست پنجره بالا به صادرات داده ها از این جدول به عنوان یک فایل CSV.

    توجه داشته باشید که:

    • اگر هر گونه گزینه دارای عملیات کودک است:

      • کل زمان "جمع شده" یک عمل شامل زمان صرف شده در داخل عملیات کودک است.

      • کل زمان "خود" یک عمل شامل زمان صرف شده در داخل عملیات کودک نیست.

    • اگر op بر روی میزبان اجرا شود:

      • درصد کل زمان شخصی در دستگاه انجام شده بر روی دستگاه 0 خواهد بود.
      • درصد تجمعی کل زمان شخصی در دستگاه تا و با احتساب این کار 0 خواهد بود.
    • اگر op در دستگاه اجرا شود:

      • درصد کل زمان کار شخصی در میزبان انجام شده توسط این برنامه 0 خواهد بود.
      • درصد تجمعی کل زمان شخصی در میزبان تا و شامل این عمل 0 خواهد بود.

می توانید زمان بیکاری را در نمودارهای جدول و جدول قرار دهید یا آن را حذف کنید.

ردیابی کننده

مشاهده کننده ردیابی یک جدول زمانی را نشان می دهد که نشان می دهد:

  • مدت زمان عملیاتی که توسط مدل TensorFlow شما اجرا شده است
  • کدام قسمت از سیستم (میزبان یا دستگاه) عملیات را اجرا می کند. به طور معمول ، میزبان عملیات ورودی را اجرا می کند ، داده های آموزش را پردازش می کند و آنها را به دستگاه منتقل می کند ، در حالی که دستگاه آموزش مدل واقعی را اجرا می کند

ردیاب ردیابی به شما امکان می دهد مشکلات عملکردی را در مدل خود شناسایی کنید ، سپس برای حل آنها قدم بردارید. به عنوان مثال ، در سطح بالا ، می توانید تشخیص دهید که آموزش ورودی یا مدل بیشتر وقت را می گیرد. با حفاری کردن ، می توانید تشخیص دهید که کدام عملیات طولانی ترین زمان اجرا را دارند. توجه داشته باشید که مشاهده کننده ردیابی به هر دستگاه به 1 میلیون رویداد محدود می شود.

ردیابی رابط بیننده

هنگام باز کردن ردیاب ، به نظر می رسد آخرین اجرای شما:

تصویر

این صفحه شامل عناصر اصلی زیر است:

  1. پنجره گاهشمار: نشان می دهد عملیات که دستگاه و میزبان اجرا در طول زمان.
  2. پنجره جزئیات را نشان می دهد اطلاعات اضافی برای عملیات در سمت گاهشمار انتخاب شده است.

پنجره Timeline شامل عناصر زیر است:

  1. نوار بالا: شامل کنترل های مختلف کمکی.
  2. محور زمان را نشان می دهد زمان نسبت به آغاز کمیاب است.
  3. بخش و آهنگ برچسب: هر بخش شامل چند آهنگ است یک مثلث در سمت چپ که شما می توانید کلیک کنید و به گسترش و فروپاشی بخش و. برای هر عنصر پردازشی در سیستم یک بخش وجود دارد.
  4. ابزار انتخاب: شامل ابزار های مختلف برای برقراری ارتباط با بیننده اثری مانند زوم، پان، انتخاب، و زمان. برای مشخص کردن فاصله زمانی از ابزار Timing استفاده کنید.
  5. رویدادها: این نشان می دهد زمان که در طی آن یک op اعدام شد و یا مدت زمان متا حوادث، از جمله مراحل آموزش.
بخشها و آهنگها

ردیاب ردیابی شامل بخش های زیر است:

  • یکی از بخش برای هر گره دستگاه، نشاندار شده با تعداد تراشه دستگاه و گره دستگاه داخل تراشه (به عنوان مثال، /device:GPU:0 (pid 0) ). هر بخش گره دستگاه شامل آهنگ های زیر است:
    • مرحله: مدت زمان مراحل آموزش که بر روی دستگاه در حال اجرا بودند را نشان می دهد
    • TensorFlow عملیات: نشان می دهد عملیات اجرا بر روی دستگاه
    • XLA عملیات: نشان می دهد XLA عملیات (OPS) بودند که بر روی دستگاه صورت XLA کامپایلر استفاده می شود (هر عملیات TensorFlow به یک یا چند عملیات XLA ترجمه کامپایلر XLA ترجمه عملیات XLA به کد که قابل اجرا بر روی دستگاه.).
  • یکی از بخش ها برای موضوع در حال اجرا در CPU دستگاه میزبان، برچسب "میزبان موضوعات". این بخش شامل یک آهنگ برای هر موضوع CPU است. توجه داشته باشید که می توانید اطلاعات نمایش داده شده در کنار برچسب های بخش را نادیده بگیرید.
مناسبت ها

رویدادهای درون جدول زمانی با رنگ های مختلف نمایش داده می شوند. رنگها معنای خاصی ندارند.

ردیابی کننده می تواند ردپای تماس های عملکرد پایتون را در برنامه TensorFlow شما نمایش دهد. در صورت استفاده از tf.profiler.experimental.start API، شما می توانید Python فعال ردیابی با استفاده از ProfilerOptions namedtuple در هنگام شروع پروفایل. روش دیگر، اگر شما با استفاده از حالت نمونه برداری برای پروفایل، شما می توانید سطح ردیابی با استفاده از گزینه های کرکره ای در ضبط مشخصات محاوره ای را انتخاب کنید.

تصویر

آمار هسته GPU

این ابزار آمار عملکرد و عملکرد اصلی هر هسته GPU را نشان می دهد.

تصویر

این ابزار اطلاعات را در دو صفحه نمایش می دهد:

  • در قسمت بالا نمودار پای نمایش داده می شود که هسته های CUDA را نشان می دهد که بیشترین کل زمان سپری شده را دارند.

  • در قسمت پایین یک جدول با داده های زیر برای هر جفت کرنل-اپ منحصر به فرد نمایش داده می شود:

    • یک مرتبه به ترتیب نزولی کل مدت GPU سپری شده گروه بندی شده بر اساس جفت کرنل-اپ.
    • نام هسته راه اندازی شده
    • تعداد رجیسترهای GPU مورد استفاده هسته.
    • اندازه کل حافظه اشتراکی (استاتیک + پویا اشتراکی) که در بایت استفاده می شود.
    • بعد بلوک بیان شده به عنوان blockDim.x, blockDim.y, blockDim.z .
    • ابعاد شبکه به عنوان بیان gridDim.x, gridDim.y, gridDim.z .
    • آیا عملیات واجد شرایط است که استفاده از تانسور هسته .
    • اینکه آیا هسته شامل دستورالعمل های Tensor Core است.
    • نام op که این هسته را راه اندازی کرده است.
    • تعداد وقایع این جفت هسته-op.
    • کل زمان GPU سپری شده در میکروثانیه.
    • میانگین زمان GPU سپری شده در میکروثانیه.
    • حداقل زمان GPU سپری شده در میکروثانیه.
    • حداکثر زمان GPU سپری شده در میکروثانیه.

ابزار نمایه حافظه

حافظه مشخصات ابزار نظارت و استفاده از حافظه دستگاه خود را در طول فاصله پروفایل است. می توانید از این ابزار برای موارد زیر استفاده کنید:

  • با تعیین دقیق اوج مصرف حافظه و تخصیص حافظه مربوطه به عملکردهای TensorFlow ، مشکلات حافظه (OOM) را رفع اشکال کنید. شما همچنین می توانید اشکال زدایی مسائل OOM که ممکن است بوجود می آیند که شما اجرا چند اجاره استنتاج است.
  • مشکلات تقسیم حافظه را رفع اشکال کنید.

ابزار نمایه حافظه ، داده ها را در سه بخش نمایش می دهد:

  1. خلاصه مشخصات حافظه
  2. نمودار جدول زمانی حافظه
  3. جدول خرابی حافظه

خلاصه مشخصات حافظه

این بخش خلاصه ای از سطح بالا از مشخصات حافظه برنامه TensorFlow شما را نشان می دهد که در زیر نشان داده شده است:

خلاصه مشخصات حافظه دارای شش قسمت است:

  1. ID حافظه: کرکره که لیست تمام سیستم های حافظه دستگاه موجود است. سیستم حافظه ای را که می خواهید مشاهده کنید از لیست کشویی انتخاب کنید.
  2. #Allocation: تعداد تخصیص حافظه ساخته شده در طول فاصله پروفایل است.
  3. #Deallocation: تعداد deallocations حافظه در فاصله پروفایل
  4. ظرفیت حافظه: ظرفیت کل (در GiBs) حافظه سیستم که شما انتخاب کنید.
  5. قله هیپ طریقه استفاده: استفاده از حافظه اوج (در GiBs) از مدل شروع به دویدن.
  6. طریقه استفاده قله حافظه: استفاده از حافظه اوج (در GiBs) در فاصله پروفایل است. این قسمت شامل زیرمجموعه های زیر است:
    1. مهر زمان: مهر زمان از زمانی که استفاده از حافظه اوج بر روی جدول زمانی نمودار رخ داده است.
    2. پشته رزرو: میزان حافظه محفوظ در پشته (در GiBs).
    3. تخصیص هیپ: مقدار حافظه اختصاص داده در پشته (در GiBs).
    4. حافظه آزاد: مقدار حافظه آزاد (در GiBs). ظرفیت حافظه مجموع ذخیره Stack ، تخصیص Heap و حافظه آزاد است.
    5. تکه تکه شدن: درصد تکه تکه شدن (پایین تر است بهتر است). آن را به عنوان یک درصد از محاسبه (1 - Size of the largest chunk of free memory / Total free memory) .

نمودار جدول زمانی حافظه

در این بخش نمودار استفاده از حافظه (در GiBs) و درصد تکه تکه شدن در برابر زمان (در میلی ثانیه) نمایش داده می شود.

تصویر

محور X نشان دهنده جدول زمانی (بر حسب میلی ثانیه) فاصله پروفایل است. محور Y در سمت چپ نشان دهنده میزان استفاده از حافظه (در GiBs) و محور Y در سمت راست درصد تکه تکه شدن است. در هر نقطه از زمان در محور X ، حافظه کل به سه دسته تقسیم می شود: پشته (به رنگ قرمز) ، انباشت (به رنگ نارنجی) و آزاد (به رنگ سبز). برای مشاهده جزئیات مربوط به وقایع تخصیص حافظه / محل جابجایی در آن نقطه ، مانند یک نشانگر زمانی مشخص حرکت کنید:

تصویر

پنجره بازشو اطلاعات زیر را نمایش می دهد:

  • برچسب زمان (MS): محل این رویداد انتخاب در جدول زمانی.
  • رویداد: نوع رویداد (تخصیص و یا آزادسازی).
  • requested_size (GiBs): مقدار حافظه درخواست شده است. این یک عدد منفی برای حوادث غیرمجاز خواهد بود.
  • allocation_size (GiBs): مقدار واقعی حافظه اختصاص داده است. این یک عدد منفی برای حوادث غیرمجاز خواهد بود.
  • tf_op: عملیات TensorFlow که درخواست تخصیص / آزادسازی.
  • step_id: گام آموزش در است که این رویداد رخ داده است.
  • region_type: نوع موجودیت داده که این حافظه اختصاص داده است برای. مقادیر ممکن عبارتند از temp برای موقت، output برای فعال و شیب، و persist / dynamic وزن و ثابت.
  • data_type: نوع عنصر تانسور (به عنوان مثال، uint8 برای 8 بیتی عدد صحیح بدون علامت).
  • tensor_shape: شکل تانسور اختصاص داده / deallocated.
  • memory_in_use (GiBs): حافظه کل است که در استفاده در این نقطه از زمان.

جدول شکست حافظه

این جدول تخصیص حافظه فعال را در نقطه اوج استفاده از حافظه در فاصله پروفایل نشان می دهد.

تصویر

برای هر TensorFlow Op یک ردیف وجود دارد و هر ردیف دارای ستون های زیر است:

  • نام عملیات: نام عملیات TensorFlow است.
  • حجم تخصیص (GiBs): مقدار کل حافظه اختصاص داده شده به این عملیات.
  • اندازه های درخواست شده (GiBs): مقدار کل حافظه درخواست برای این عملیات.
  • ظهور: تعداد از بودجه لازم برای این عملیات.
  • نوع منطقه: نوع نهاد داده که این حافظه اختصاص داده است برای. مقادیر ممکن عبارتند از temp برای موقت، output برای فعال و شیب، و persist / dynamic وزن و ثابت.
  • نوع داده ها: نوع عنصر تانسور.
  • شکل: شکل تانسورها اختصاص داده است.

بیننده غلاف

ابزار Pod Viewer تجزیه مرحله آموزش در بین همه کارگران را نشان می دهد.

تصویر

  • در قسمت بالا یک نوار لغزنده برای انتخاب شماره مرحله وجود دارد.
  • در قسمت پایین نمودار ستونی انباشته شده نمایش داده می شود. این نمای سطح بالایی از تقسیم بندی طبقه بندی های مرحله ای است که در بالای یکدیگر قرار گرفته اند. هر ستون انباشته نشان دهنده یک کارگر منحصر به فرد است.
  • هنگامی که بالای ستون انباشته شده می روید ، کارت در سمت چپ جزئیات بیشتری در مورد تجزیه مرحله را نشان می دهد.

tf.data تجزیه و تحلیل گلوگاه

tf.data ابزار تجزیه و تحلیل تنگنا به طور خودکار تشخیص تنگناها در tf.data خطوط لوله ورودی در برنامه شما و توصیه در مورد چگونگی رفع آنها فراهم می کند. آن را با هر برنامه با استفاده از کار tf.data صرف نظر از پلت فرم (CPU / GPU / TPU). تجزیه و تحلیل و توصیه های آن در این است راهنمای .

با انجام این مراحل تنگنا را تشخیص می دهد:

  1. بیشترین میزبان ورودی را پیدا کنید.
  2. یافتن کمترین اجرای یک tf.data خط لوله ورودی.
  3. نمودار خط لوله ورودی را از ردیف پروفایلر بازسازی کنید.
  4. مسیر مهم را در نمودار خط لوله ورودی پیدا کنید.
  5. کمترین تحول در مسیر حیاتی را به عنوان یک گلوگاه شناسایی کنید.

تجزیه و تحلیل عملکرد خلاصه، خلاصه ای از تمام ورودی خطوط لوله و ورودی خط لوله نمودار: UI است به سه بخش تقسیم شده است.

خلاصه تحلیل عملکرد

تصویر

این بخش خلاصه ای از تجزیه و تحلیل را ارائه می دهد. آن را بر روی آرام گزارش tf.data خطوط لوله ورودی شناسایی در مشخصات. این بخش همچنین بیشترین میزبان ورودی ورودی و کمترین خط لوله ورودی آن را با حداکثر تأخیر نشان می دهد. از همه مهمتر ، مشخص می کند که کدام قسمت از خط لوله ورودی گلوگاه است و نحوه رفع آن. اطلاعات گلوگاه با نوع تکرار کننده و نام طولانی آن ارائه می شود.

نحوه خواندن نام طولانی tf.data iterator

یک نام طولانی به عنوان فرمت 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 عملیات در خط لوله ورودی. اگر چندین بار اجرا شود ، زمان شروع اولین اعدام است.

مجموع مدت زمان زمان دیوار از اعدام است. اگر چندین بار اجرا شود ، حاصل جمع دیواره های تمام اعدام ها است.

زمان خود مجموع مدت زمان بدون زمان همپوشانی با گره فرزند فوری آن است.

"# تماس" تعداد دفعات اجرای خط لوله ورودی است.

داده های عملکرد را جمع آوری کنید

TensorFlow Profiler فعالیت های میزبان و ردیابی GPU مدل TensorFlow شما را جمع آوری می کند. می توانید Profiler را برای جمع آوری داده های عملکرد از طریق حالت برنامه ریزی یا حالت نمونه پیکربندی کنید.

پروفایل API ها

برای انجام پروفایل می توانید از API های زیر استفاده کنید.

  • حالت برنامه ریزی با استفاده از TensorBoard Keras مخاطبین ( 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 API تابع

    tf.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 و در حال اجرا مدل خود را، شما می توانید مشخصات از طریق ضبط دکمه مشخصات در این افزونه مشخصات 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 که با ویرگول جدا شده است.
  • مدت زمان پروفایل.
  • سطح ردیابی تماس دستگاه ، میزبان و عملکرد پایتون.
  • چند بار می خواهید که پروفایلر در صورت عدم موفقیت در ابتدا ، پروفایل ها را دوباره امتحان کند.

پروفایل حلقه های آموزش سفارشی

به نمایه حلقه آموزش سفارشی در کد 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)

این کار باعث می شود تجزیه و تحلیل عملکرد گام به گام Profiler انجام شود و باعث شود رویدادهای مرحله در نمایش دهنده ردیابی نشان داده شوند.

اطمینان حاصل کنید که شامل تکرار مجموعه داده در 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 پروفایل بر روی همان دستگاهی که مدل شما در حال اجرا دارد فراخوانی می شود ، به عنوان مثال یک ایستگاه کاری محلی با GPU. در پروفایل از راه دور ، API پروفایل در دستگاهی متفاوت از مکانی که مدل شما در آن اجرا می کند فراخوانی می شود ، به عنوان مثال در Cloud TPU.
  • پروفایل کارگران متعدد: شما می توانید چندین ماشین در هنگام استفاده از قابلیت های آموزش توزیع TensorFlow مشخصات.
  • پلت فرم سخت افزار: پردازنده مشخصات، GPU ها و TPU ها.

جدول زیر یک مرور سریع از موارد استفاده با پشتیبانی TensorFlow ذکر شده در بالا ارائه می دهد:

Profiling API محلی از راه دور چند کارگر سیستم عامل های سخت افزار
TensorBoard Keras Callback پشتیبانی پشتیبانی نشده پشتیبانی نشده پردازنده ، پردازنده گرافیکی
tf.profiler.experimental START / STOP API پشتیبانی پشتیبانی نشده پشتیبانی نشده پردازنده ، پردازنده گرافیکی
tf.profiler.experimental client.trace API پشتیبانی پشتیبانی پشتیبانی CPU ، GPU ، TPU
Context API مدیر پشتیبانی پشتیبانی نشده پشتیبانی نشده پردازنده ، پردازنده گرافیکی

بهترین روش ها برای عملکرد بهینه مدل

برای دستیابی به عملکرد مطلوب ، از توصیه های زیر برای مدلهای TensorFlow خود استفاده کنید.

به طور کلی ، همه تغییرات را در دستگاه انجام دهید و اطمینان حاصل کنید که از آخرین نسخه سازگار کتابخانه مانند cuDNN و Intel MKL برای سیستم عامل خود استفاده می کنید.

خط لوله داده ورودی را بهینه کنید

برای بهینه سازی خط لوله ورودی داده خود ، از داده های [# تجزیه و تحلیل_ خط لوله ورودی] استفاده کنید. خط لوله ورودی داده کارآمد با کاهش زمان بیکاری دستگاه می تواند سرعت اجرای مدل شما را به شدت بهبود بخشد. سعی کنید به ترکیب بهترین شیوه ها در جزئیات عملکرد بهتر با API tf.data راهنمای و در زیر به خط لوله داده های ورودی خود را کارآمد تر.

  • به طور کلی ، موازی سازی هرگونه عملکردی که نیازی به اجرای متوالی ندارد ، می تواند خط لوله ورودی داده را به طور قابل توجهی بهینه کند.

  • در بسیاری از موارد ، به تغییر ترتیب برخی از تماس ها یا تنظیم استدلال ها کمک می کند تا برای مدل شما بهتر باشد. در حالی که خط لوله داده ورودی را بهینه می کنید ، فقط بارگذار داده را بدون آموزش و مراحل انتشار مجدد معیار کنید تا اثر بهینه سازی ها به طور مستقل کم شود.

  • سعی کنید مدل خود را با داده های مصنوعی اجرا کنید تا بررسی کنید خط لوله ورودی گلوگاه عملکرد است.

  • استفاده از tf.data.Dataset.shard برای آموزش چند پردازنده گرافیکی. اطمینان حاصل کنید که خیلی زود در حلقه ورودی خرد می کنید تا از کاهش توان تولید جلوگیری کنید. هنگام کار با TFRecords ، اطمینان حاصل کنید که لیست TFRecords و نه محتوای TFRecords را خرد کرده اید.

  • موازی چند عملیات به صورت پویا تنظیم مقدار num_parallel_calls با استفاده از tf.data.AUTOTUNE .

  • در نظر بگیرید محدود کردن استفاده از tf.data.Dataset.from_generator آن را به عنوان کندتر نسبت به عملیات TensorFlow خالص است.

  • در نظر بگیرید محدود کردن استفاده از tf.py_function عنوان آن می تواند مرتب شود و پشتیبانی نمی شود به اجرا در TensorFlow توزیع شده است.

  • استفاده از tf.data.Options برای کنترل بهینه سازی استاتیک به خط لوله ورودی.

همچنین به عنوان خوانده شده tf.data تجزیه و تحلیل عملکرد راهنمای برای راهنمایی بیشتر در بهینه سازی خط لوله ورودی خود را.

افزایش داده ها را بهینه کنید

در هنگام کار با داده های تصویر، را خود را تقویت داده کارآمد تر توسط ریخته گری به انواع داده های مختلف پس از اعمال تحولات فضایی، از قبیل کوه در می رم، برداشت، چرخش، و غیره

از NVIDIA® DALI استفاده کنید

در برخی موارد ، مثلاً هنگامی که سیستمی با نسبت پردازنده گرافیکی به پردازنده بالا دارید ، ممکن است تمام بهینه سازی های بالا برای از بین بردن گلوگاه های موجود در لودر داده به دلیل محدودیت در چرخه های پردازنده کافی نباشد.

اگر شما با استفاده از تکنولوژی NVIDIA® GPU ها برای بینایی کامپیوتر و برنامه های کاربردی یادگیری عمیق صوتی، استفاده از در حال بارگذاری اطلاعات کتابخانه ( DALI ) برای سرعت بخشیدن به خط لوله داده است.

را بررسی کنید عملیات: NVIDIA® DALI اسناد و مدارک برای یک لیست از عملیات DALI پشتیبانی می شود.

از نخ و اجرای موازی استفاده کنید

عملیات اجرا بر روی چند موضوعات CPU با tf.config.threading API برای اجرای آنها سریعتر است.

TensorFlow به طور خودکار تعداد رشته های موازی کاری را به طور پیش فرض تنظیم می کند. استخر نخ موجود برای اجرای عملیات TensorFlow به تعداد نخ های CPU موجود بستگی دارد.

کنترل حداکثر تسریع موازی برای عملیات واحد با استفاده از tf.config.threading.set_intra_op_parallelism_threads . توجه داشته باشید که اگر چندین اپلیکیشن را به طور موازی اجرا کنید ، همه آنها از مجموعه رشته موجود استفاده می کنند.

اگر شما مستقل غیر مسدود کردن عملیات (عملیات با مسیر حرکت به بین آنها در نمودار)، استفاده از tf.config.threading.set_inter_op_parallelism_threads به آنها اجرا به صورت همزمان با استفاده از استخر موضوع موجود است.

متفرقه

در هنگام کار با مدل های کوچکتر در NVIDIA® GPU ها، شما می توانید راه tf.compat.v1.ConfigProto.force_gpu_compatible=True به زور همه تانسورها CPU با CUDA حافظه دوخته اختصاص داده شود به افزایش قابل توجهی به عملکرد مدل. با این حال ، هنگام استفاده از این گزینه برای مدلهای ناشناخته / بسیار بزرگ ، احتیاط کنید زیرا این امر ممکن است بر عملکرد میزبان (CPU) تأثیر منفی بگذارد.

عملکرد دستگاه را بهبود ببخشید

دنبال بهترین شیوه در اینجا و در جزئیات راهنمای بهینه سازی عملکرد GPU برای بهینه سازی بر روی دستگاه عملکرد مدل TensorFlow.

اگر از GPU های NVIDIA استفاده می کنید ، با اجرای GPU و استفاده از حافظه را در یک فایل CSV وارد کنید:

nvidia-smi
--query-gpu=utilization.gpu,utilization.memory,memory.total,
memory.free,memory.used --format=csv

پیکربندی طرح داده

هنگام کار با داده هایی که حاوی اطلاعات کانال هستند (مانند تصاویر) ، قالب طرح داده را بهینه کنید تا کانالها آخرین (NHWC نسبت به NCHW) را ترجیح دهند.

فرمت های داده کانال آخرین بهبود تانسور هسته بهره برداری و ارائه بهبود قابل توجه عملکرد به خصوص در مدل های کانولوشن با AMP همراه است. طرح های داده NCHW هنوز هم می توانند توسط هسته های Tensor کار کنند ، اما به دلیل عملیات انتقال اتوماتیک ، سربار اضافی معرفی می کنند.

شما می توانید طرح داده بهینه سازی ترجیح می دهند به طرح بندی NHWC با تنظیم data_format="channels_last" برای لایه های مانند tf.keras.layers.Conv2D ، tf.keras.layers.Conv3D و tf.keras.layers.experimental.preprocessing.RandomRotation .

استفاده از tf.keras.backend.set_image_data_format به تنظیم پیش فرض فرمت طرح داده برای بخش مدیریت API 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.

متفرقه

  • 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 in tf.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 the jit_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

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