TensorFlow Profiler: ביצועי מודל פרופיל

הצג באתר TensorFlow.org הפעל בגוגל קולאב צפה במקור ב-GitHub הורד מחברת

סקירה כללית

אלגוריתמי למידת מכונה הם בדרך כלל יקרים מבחינה חישובית. לכן חיוני לכמת את הביצועים של אפליקציית למידת המכונה שלך כדי להבטיח שאתה מפעיל את הגרסה האופטימלית ביותר של המודל שלך. השתמש בפרופיל TensorFlow כדי ליצור פרופיל של ביצוע קוד TensorFlow שלך.

להכין

from datetime import datetime
from packaging import version

import os

מאבחן TensorFlow דורש את הגרסאות העדכניות של 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

במדריך זה, לך לחקור את היכולות של Profiler TensorFlow ידי לכידת פרופיל הביצועים שהושגו על ידי אימון מודל לתמונות לסווג את הנתונים MNIST .

השתמש במערכי נתונים של 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 כדי ליצור פרופיל של ביצועי אימון מודלים

TensorFlow Profiler מוטבע בתוך TensorBoard. טען את TensorBoard באמצעות Colab Magic והפעל אותו. הצגת פרופילי ביצועים על ידי ניווט אל הכרטיסייה בפרופיל.

# 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>

הכרטיסייה בפרופיל פותחת את דף הסקירה שמציג לך סיכום ברמה גבוהה של ביצועי המודל שלך. בהסתכלות על גרף ה-Step-Time מימין, אתה יכול לראות שהמודל מוגבל מאוד לקלט (כלומר, הוא מבלה זמן רב בצינור קלט הנתונים). דף הסקירה הכללית מספק לך גם המלצות לגבי הצעדים הבאים פוטנציאליים שתוכל לבצע כדי לייעל את ביצועי המודל שלך.

כדי להבין היכן צוואר בקבוק הביצועים מתרחש בצנרת הקלט, בחר Viewer העקבות מן הכלים הנפתחים מהשמאל. ה-Trace Viewer מציג לך ציר זמן של האירועים השונים שהתרחשו במעבד וב-GPU במהלך תקופת הפרופיל.

מציג המעקב מציג קבוצות אירועים מרובות על הציר האנכי. לכל קבוצת אירועים יש מספר מסלולים אופקיים, מלאים באירועי מעקב. המסלול הוא ציר זמן של אירועים לאירועים המבוצעים על שרשור או זרם GPU. אירועים בודדים הם הבלוקים הצבעוניים והמלבניים במסלולי ציר הזמן. הזמן זז משמאל לימין. נווט אירועי עקבות על ידי שימוש בקיצורי מקשי W (זום), S (להקטין), (גלילה שמאלה), ו A D (מימין גלילה).

מלבן בודד מייצג אירוע עקבות. בחר את סמל סמן העכבר בסרגל הכלים צף (או להשתמש במקשי המקלדת 1 ) ולחץ על האירוע עקבות לנתח אותו. פעולה זו תציג מידע על האירוע, כגון שעת ההתחלה ומשך הזמן שלו.

בנוסף ללחיצה, אתה יכול לגרור את העכבר כדי לבחור קבוצה של אירועי מעקב. זה ייתן לך רשימה של כל האירועים באותו אזור יחד עם סיכום האירוע. השתמש M המפתח למדוד את משך הזמן של האירועים שנבחרו.

אירועי עקבות נאספים מ:

  • מעבד: אירועי CPU מוצגים תחת קבוצת אירועים בשם /host:CPU . כל רצועה מייצגת חוט במעבד. אירועי מעבד כוללים אירועי צינור קלט, אירועי תזמון של תפעול GPU (op), אירועי ביצוע הפעלה של מעבד וכו'.
  • GPU: אירועי GPU מוצגים תחת קבוצות אירוע כשלפניו /device:GPU: . כל קבוצת אירועים מייצגת זרם אחד ב-GPU.

איתור באגים בצווארי בקבוק בביצועים

השתמש ב-Trace Viewer כדי לאתר את צווארי הבקבוק בביצועים בצינור הקלט שלך. התמונה למטה היא תמונת מצב של פרופיל הביצועים.

profiler_trace_viewer_bad_ip

כאשר מסתכלים על עקבות האירוע, אתה יכול לראות כי GPU אינו פעיל בעוד tf_data_iterator_get_next אופ פועל על מעבד. ניתוח זה אחראי על עיבוד נתוני הקלט ושליחתם ל-GPU להדרכה. ככלל אצבע, מומלץ תמיד להשאיר את המכשיר (GPU/TPU) פעיל.

השתמש tf.data API כדי לייעל את צינור ההזנה. במקרה זה, הבה נשמור את מערך האימון במטמון ונביא מראש את הנתונים כדי להבטיח שתמיד יהיו נתונים זמינים לעיבוד ה-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 ופתח את הכרטיסייה בפרופיל לצפות בפרופיל ביצועים עבור צינור ההזנה המעודכנת.

פרופיל הביצועים של הדגם עם צינור הקלט הממוטב דומה לתמונה למטה.

%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_good_ip

המופעים Viewer Trace כי tf_data_iterator_get_next אופ מבצעת הרבה יותר מהר. לכן ה-GPU מקבל זרם קבוע של נתונים לביצוע אימון ומשיג ניצול הרבה יותר טוב באמצעות אימון מודלים.

סיכום

השתמש ב-TensorFlow Profiler כדי ליצור פרופיל וניפוי באגים בביצועי אימון המודל. קראו את מדריך Profiler ולצפות פרופיל ביצועים ב TF 2 הדיבורים מן הפסגה TensorFlow Dev 2020 כדי ללמוד עוד על Profiler TensorFlow.