TensorFlow Profiler: Performa model profil

Lihat di TensorFlow.org Jalankan di Google Colab Lihat sumber di GitHub Unduh buku catatan

Ringkasan

Algoritma pembelajaran mesin biasanya mahal secara komputasi. Oleh karena itu, sangat penting untuk mengukur kinerja aplikasi pembelajaran mesin Anda untuk memastikan bahwa Anda menjalankan versi model yang paling optimal. Gunakan TensorFlow Profiler untuk membuat profil eksekusi kode TensorFlow Anda.

Mempersiapkan

from datetime import datetime
from packaging import version

import os

The TensorFlow Profiler memerlukan versi terbaru dari TensorFlow dan TensorBoard ( >=2.2 ).

pip install -U tensorboard_plugin_profile
import tensorflow as tf

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

Konfirmasikan bahwa TensorFlow dapat mengakses 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

Latih model klasifikasi gambar dengan callback TensorBoard

Dalam tutorial ini, Anda mengeksplorasi kemampuan dari TensorFlow Profiler dengan menangkap profil kinerja yang diperoleh dengan melatih model gambar mengklasifikasikan dalam dataset MNIST .

Gunakan set data TensorFlow untuk mengimpor data pelatihan dan membaginya menjadi set pelatihan dan pengujian.

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.

Praproses data pelatihan dan pengujian dengan menormalkan nilai piksel menjadi antara 0 dan 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)

Buat model klasifikasi citra menggunakan 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']
)

Buat callback TensorBoard untuk merekam profil performa dan menyebutnya saat melatih model.

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

Gunakan TensorFlow Profiler untuk membuat profil performa pelatihan model

TensorFlow Profiler disematkan di dalam TensorBoard. Muat TensorBoard menggunakan sihir Colab dan luncurkan. Lihat profil kinerja dengan menavigasi ke tab Profil.

# Load the TensorBoard notebook extension.
%load_ext tensorboard

Profil kinerja untuk model ini mirip dengan gambar di bawah ini.

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

Tab Profil membuka halaman Ikhtisar yang menunjukkan Anda ringkasan tingkat tinggi kinerja model Anda. Melihat Grafik Langkah-waktu di sebelah kanan, Anda dapat melihat bahwa model sangat terikat dengan input (yaitu, menghabiskan banyak waktu di jalur input data). Halaman Ikhtisar juga memberi Anda rekomendasi tentang kemungkinan langkah berikutnya yang dapat Anda ikuti untuk mengoptimalkan kinerja model Anda.

Untuk memahami di mana hambatan kinerja terjadi pada pipa input, pilih Trace Viewer dari Alat dropdown di sebelah kiri. Trace Viewer menunjukkan garis waktu dari berbagai peristiwa yang terjadi pada CPU dan GPU selama periode pembuatan profil.

Trace Viewer memperlihatkan beberapa grup peristiwa pada sumbu vertikal. Setiap grup acara memiliki beberapa trek horizontal, diisi dengan acara jejak. Trek adalah garis waktu peristiwa untuk peristiwa yang dijalankan pada utas atau aliran GPU. Peristiwa individu adalah blok persegi panjang berwarna di trek garis waktu. Waktu bergerak dari kiri ke kanan. Arahkan peristiwa jejak dengan menggunakan cara pintas keyboard W (memperbesar), S (zoom out), A (scroll kiri), dan D (gulir kanan).

Sebuah persegi panjang tunggal mewakili peristiwa jejak. Pilih ikon kursor mouse di tool bar mengambang (atau menggunakan cara pintas keyboard 1 ) dan klik jejak acara untuk menganalisanya. Ini akan menampilkan informasi tentang acara, seperti waktu mulai dan durasinya.

Selain mengklik, Anda dapat menyeret mouse untuk memilih sekelompok peristiwa pelacakan. Ini akan memberi Anda daftar semua acara di area itu bersama dengan ringkasan acara. Gunakan M kunci untuk mengukur durasi waktu peristiwa yang dipilih.

Jejak peristiwa dikumpulkan dari:

  • CPU: peristiwa CPU ditampilkan di bawah kelompok acara bernama /host:CPU . Setiap trek mewakili utas pada CPU. Peristiwa CPU termasuk peristiwa pipa input, peristiwa penjadwalan operasi GPU (op), peristiwa eksekusi operasi CPU, dll.
  • GPU: peristiwa GPU ditampilkan di bawah kelompok acara diawali dengan /device:GPU: . Setiap grup peristiwa mewakili satu aliran di GPU.

Debug kemacetan kinerja

Gunakan Trace Viewer untuk menemukan kemacetan kinerja di saluran input Anda. Gambar di bawah adalah snapshot dari profil kinerja.

profiler_trace_viewer_bad_ip

Melihat jejak acara, Anda dapat melihat bahwa GPU tidak aktif sementara tf_data_iterator_get_next op berjalan pada CPU. Operasi ini bertanggung jawab untuk memproses data input dan mengirimkannya ke GPU untuk pelatihan. Sebagai aturan umum, sebaiknya selalu jaga agar perangkat (GPU/TPU) tetap aktif.

Gunakan tf.data API untuk mengoptimalkan pipa masukan. Dalam hal ini, mari kita cache set data pelatihan dan ambil data sebelumnya untuk memastikan bahwa selalu ada data yang tersedia untuk diproses oleh GPU. Lihat di sini untuk rincian lebih lanjut tentang cara menggunakan tf.data untuk mengoptimalkan jaringan pipa masukan Anda.

(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)

Latih model lagi dan rekam profil kinerja dengan menggunakan kembali panggilan balik dari sebelumnya.

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>

Re-peluncuran TensorBoard dan membuka tab Profil untuk mengamati profil kinerja untuk pipa input diperbarui.

Profil kinerja untuk model dengan saluran input yang dioptimalkan mirip dengan gambar di bawah ini.

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

Dari halaman Ikhtisar, Anda dapat melihat bahwa waktu Langkah Rata-rata telah berkurang seperti halnya waktu Langkah Input. Grafik Langkah-waktu juga menunjukkan bahwa model tidak lagi terikat dengan input tinggi. Buka Trace Viewer untuk memeriksa peristiwa pelacakan dengan saluran input yang dioptimalkan.

profiler_trace_viewer_good_ip

Trace Viewer menunjukkan bahwa tf_data_iterator_get_next op mengeksekusi jauh lebih cepat. Oleh karena itu, GPU mendapatkan aliran data yang stabil untuk melakukan pelatihan dan mencapai pemanfaatan yang jauh lebih baik melalui pelatihan model.

Ringkasan

Gunakan TensorFlow Profiler untuk membuat profil dan men-debug performa pelatihan model. Baca Profiler panduan dan menonton profil Kinerja di TF 2 pembicaraan dari TensorFlow Dev Summit 2020 untuk mempelajari lebih lanjut tentang TensorFlow Profiler.