روز جامعه ML 9 نوامبر است! برای به روز رسانی از TensorFlow، JAX به ما بپیوندید، و بیشتر بیشتر بدانید

TensorFlow Profiler: عملکرد مدل پروفایل

مشاهده در TensorFlow.org در Google Colab اجرا کنید مشاهده منبع در GitHub دانلود دفترچه یادداشت

بررسی اجمالی

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

برپایی

from datetime import datetime
from packaging import version

import os

TensorFlow Profiler به آخرین نسخه های TensorFlow و TensorBoard نیاز دارد ( >=2.2 ).

pip install -U tensorboard_plugin_profile
import tensorflow as tf

print("TensorFlow version: ", tf.__version__)
TensorFlow version:  2.2.0-dev20200405

تأیید کنید که TensorFlow می تواند به GPU دسترسی پیدا کند.

device_name = tf.test.gpu_device_name()
if not device_name:
  raise SystemError('GPU device not found')
print('Found GPU at: {}'.format(device_name))
Found GPU at: /device:GPU:0

با تماس های برگشتی TensorBoard ، یک مدل طبقه بندی تصویر را آموزش دهید

در این آموزش ، شما با ضبط مشخصات عملکرد به دست آمده از آموزش یک مدل برای طبقه بندی تصاویر در مجموعه داده های MNIST ، به قابلیت های TensorFlow Profiler می پردازید.

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

import tensorflow_datasets as tfds
tfds.disable_progress_bar()
(ds_train, ds_test), ds_info = tfds.load(
    'mnist',
    split=['train', 'test'],
    shuffle_files=True,
    as_supervised=True,
    with_info=True,
)
WARNING:absl:Dataset mnist is hosted on GCS. It will automatically be downloaded to your
local data directory. If you'd instead prefer to read directly from our public
GCS bucket (recommended if you're running on GCP), you can instead set
data_dir=gs://tfds-data/datasets.
Downloading and preparing dataset mnist/3.0.0 (download: 11.06 MiB, generated: Unknown size, total: 11.06 MiB) to /root/tensorflow_datasets/mnist/3.0.0...
Dataset mnist downloaded and prepared to /root/tensorflow_datasets/mnist/3.0.0. Subsequent calls will reuse this data.

با نرمال سازی مقادیر پیکسل بین 0 و 1 ، داده های آموزش و آزمون را پیش پردازش کنید.

def normalize_img(image, label):
  """Normalizes images: `uint8` -> `float32`."""
  return tf.cast(image, tf.float32) / 255., label

ds_train = ds_train.map(normalize_img)
ds_train = ds_train.batch(128)
ds_test = ds_test.map(normalize_img)
ds_test = ds_test.batch(128)

با استفاده از Keras مدل طبقه بندی تصویر را ایجاد کنید.

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28, 1)),
  tf.keras.layers.Dense(128,activation='relu'),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=tf.keras.optimizers.Adam(0.001),
    metrics=['accuracy']
)

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

# Create a TensorBoard callback
logs = "logs/" + datetime.now().strftime("%Y%m%d-%H%M%S")

tboard_callback = tf.keras.callbacks.TensorBoard(log_dir = logs,
                                                 histogram_freq = 1,
                                                 profile_batch = '500,520')

model.fit(ds_train,
          epochs=2,
          validation_data=ds_test,
          callbacks = [tboard_callback])
Epoch 1/2
469/469 [==============================] - 11s 22ms/step - loss: 0.3684 - accuracy: 0.8981 - val_loss: 0.1971 - val_accuracy: 0.9436
Epoch 2/2
 50/469 [==>...........................] - ETA: 9s - loss: 0.2014 - accuracy: 0.9439WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/summary_ops_v2.py:1271: stop (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.
Instructions for updating:
use `tf.profiler.experimental.stop` instead.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/summary_ops_v2.py:1271: stop (from tensorflow.python.eager.profiler) is deprecated and will be removed after 2020-07-01.
Instructions for updating:
use `tf.profiler.experimental.stop` instead.
469/469 [==============================] - 11s 24ms/step - loss: 0.1685 - accuracy: 0.9525 - val_loss: 0.1376 - val_accuracy: 0.9595
<tensorflow.python.keras.callbacks.History at 0x7f23919a6a58>

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

TensorFlow Profiler در TensorBoard تعبیه شده است. TensorBoard را با استفاده از Colab Magic بارگیری کنید و آن را راه اندازی کنید. با رفتن به تب Profile ، نمایه های عملکرد را مشاهده کنید.

# Load the TensorBoard notebook extension.
%load_ext tensorboard

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

# Launch TensorBoard and navigate to the Profile tab to view performance profile
%tensorboard --logdir=logs
<IPython.core.display.Javascript object>

تب Profile صفحه نمای کلی را باز می کند که خلاصه ای از سطح بالایی از عملکرد مدل شما را نشان می دهد. با نگاه کردن به نمودار Step-time در سمت راست ، می بینید که مدل به شدت ورودی است (یعنی زمان زیادی را در خط ورودی داده ها صرف می کند). صفحه نمای کلی همچنین توصیه هایی را در مورد مراحل بعدی بالقوه ای که می توانید برای بهینه سازی عملکرد مدل خود دنبال کنید ، ارائه می دهد.

برای درک اینکه گلوگاه عملکرد در خط لوله ورودی کجا اتفاق می افتد ، از فهرست کشویی Tools در سمت چپ ، Trace Viewer را انتخاب کنید. Trace Viewer به شما یک جدول زمانی از وقایع مختلفی را می گوید که در CPU و GPU در طول پروفایل رخ داده است.

Trace Viewer چندین گروه رویداد را در محور عمودی نشان می دهد. هر گروه رویداد دارای چندین آهنگ افقی است که با رویدادهای ردیابی پر شده است. آهنگ یک جدول زمانی رویداد برای رویدادهای اجرا شده در یک موضوع یا جریان GPU است. رویدادهای فردی بلوک های مستطیلی رنگی و رنگی در مسیرهای جدول زمانی هستند. زمان از چپ به راست حرکت می کند. با استفاده از میانبرهای صفحه کلید W (بزرگنمایی) ، S (بزرگنمایی) ، A (پیمایش به سمت چپ) و D (پیمایش به سمت راست) به رویدادهای ردیابی بروید.

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

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

رویدادهای ردیابی از موارد زیر جمع آوری می شود:

  • CPU: رویدادهای CPU تحت گروه رویدادهایی به نام /host:CPU نمایش داده می شوند /host:CPU . هر آهنگ نمایانگر یک موضوع در CPU است. رویدادهای CPU شامل رویدادهای خط لوله ورودی ، رویدادهای برنامه ریزی عملیات GPU ، رویدادهای اجرای عملیات CPU و غیره است.
  • GPU: رویدادهای GPU در زیر گروه های رویداد پیشوند توسط /device:GPU: نمایش داده می شود /device:GPU: :. هر گروه رویداد نشان دهنده یک جریان در GPU است.

گلوگاه های عملکرد را رفع اشکال کنید

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

profiler_trace_viewer_bad_ip

با مشاهده ردیابی های رویداد ، می بینید که GPU غیرفعال است در حالی که op tf_data_iterator_get_next روی CPU در حال اجرا است. این عملیات وظیفه پردازش داده های ورودی و ارسال آنها به GPU برای آموزش را دارد. به عنوان یک قانون کلی ، بهتر است همیشه دستگاه (GPU / TPU) را فعال نگه دارید.

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

(ds_train, ds_test), ds_info = tfds.load(
    'mnist',
    split=['train', 'test'],
    shuffle_files=True,
    as_supervised=True,
    with_info=True,
)
ds_train = ds_train.map(normalize_img)
ds_train = ds_train.batch(128)
ds_train = ds_train.cache()
ds_train = ds_train.prefetch(tf.data.experimental.AUTOTUNE)
ds_test = ds_test.map(normalize_img)
ds_test = ds_test.batch(128)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.experimental.AUTOTUNE)

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

model.fit(ds_train,
          epochs=2,
          validation_data=ds_test,
          callbacks = [tboard_callback])
Epoch 1/2
469/469 [==============================] - 10s 22ms/step - loss: 0.1194 - accuracy: 0.9658 - val_loss: 0.1116 - val_accuracy: 0.9680
Epoch 2/2
469/469 [==============================] - 1s 3ms/step - loss: 0.0918 - accuracy: 0.9740 - val_loss: 0.0979 - val_accuracy: 0.9712
<tensorflow.python.keras.callbacks.History at 0x7f23908762b0>

TensorBoard را دوباره راه اندازی کرده و برای مشاهده مشخصات عملکرد خط لوله ورودی به روز شده ، مشخصات Profile را باز کنید.

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

%tensorboard --logdir=logs
Reusing TensorBoard on port 6006 (pid 750), started 0:00:12 ago. (Use '!kill 750' to kill it.)
<IPython.core.display.Javascript object>

از صفحه نمای کلی ، می بینید که زمان متوسط ​​قدم نیز مانند زمان گام ورودی کاهش یافته است. نمودار Step-time همچنین نشان می دهد که مدل دیگر به شدت ورودی نیست. Trace Viewer را باز کنید تا رویدادهای ردیابی را با خط لوله ورودی بهینه بررسی کند.

profiler_trace_viewer_g_ip خوب

Trace Viewer نشان می دهد که عملکرد tf_data_iterator_get_next بسیار سریعتر اجرا می شود. بنابراین GPU برای انجام آموزش جریان مداوم داده ای را بدست می آورد و از طریق آموزش مدل به بهره برداری بسیار بهتر می رسد.

خلاصه

برای نمایه سازی و اشکال زدایی عملکرد آموزش از TensorFlow Profiler استفاده کنید. برای کسب اطلاعات بیشتر در مورد TensorFlow Profiler ، راهنمای Profiler را مطالعه کرده و مشخصات عملکرد در TF 2 را از TensorFlow Dev Summit 2020 مشاهده کنید.