TensorFlow Profiler: Profil modeli performansı

TensorFlow.org'da görüntüleyin Google Colab'da çalıştırın Kaynağı GitHub'da görüntüleyin Not defterini indir

genel bakış

Makine öğrenimi algoritmaları genellikle hesaplama açısından pahalıdır. Bu nedenle, modelinizin en optimize sürümünü çalıştırdığınızdan emin olmak için makine öğrenimi uygulamanızın performansını ölçmek çok önemlidir. TensorFlow kodunuzun yürütülmesinin profilini çıkarmak için TensorFlow Profiler'ı kullanın.

Kurmak

from datetime import datetime
from packaging import version

import os

TensorFlow Profiler TensorFlow ve TensorBoard (son sürümlerini gerektirir >=2.2 ).

pip install -U tensorboard_plugin_profile
import tensorflow as tf

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

TensorFlow'un GPU'ya erişebildiğini doğrulayın.

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 geri aramalarıyla bir görüntü sınıflandırma modeli eğitin

Bu eğitimde, sen de sınıflandırmak görüntülere bir modeli eğitim ile elde edilen performans profili yakalayarak TensorFlow Profiler yeteneklerini keşfetmek MNIST veri kümesi .

Eğitim verilerini içe aktarmak ve eğitim ve test kümelerine bölmek için TensorFlow veri kümelerini kullanın.

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.

Piksel değerlerini 0 ile 1 arasında olacak şekilde normalleştirerek eğitim ve test verilerini önceden işleyin.

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'ı kullanarak görüntü sınıflandırma modelini oluşturun.

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']
)

Performans profillerini yakalamak için bir TensorBoard geri çağrısı oluşturun ve modeli eğitirken onu çağırın.

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

Model eğitim performansının profilini çıkarmak için TensorFlow Profiler'ı kullanın

TensorFlow Profiler, TensorBoard'a gömülüdür. Colab büyüsünü kullanarak TensorBoard'u yükleyin ve başlatın. Profil sekmesine giderek performans profillerini görüntüle.

# Load the TensorBoard notebook extension.
%load_ext tensorboard

Bu modelin performans profili aşağıdaki resme benzer.

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

Profil sekmesi hangi gösterileri size model performansının üst düzey bir özetini Bakış sayfasını açar. Sağdaki Adım-Zaman Grafiğine baktığınızda, modelin yüksek oranda girdiye bağlı olduğunu görebilirsiniz (yani, veri giriş hattında çok fazla zaman harcar). Genel Bakış sayfası ayrıca, model performansınızı optimize etmek için takip edebileceğiniz olası sonraki adımlar hakkında öneriler sunar.

Performans darboğaz girdi boru hattı meydana geldiği, soldaki açılır listesinden Araçlar İz Görüntüleyici seçin anlamak için. İz Görüntüleyici, profil oluşturma süresi boyunca CPU ve GPU'da meydana gelen farklı olayların zaman çizelgesini gösterir.

İz Görüntüleyici, dikey eksende birden çok olay grubunu gösterir. Her olay grubunun, izleme olaylarıyla dolu birden çok yatay yolu vardır. İz, bir iş parçacığında veya bir GPU akışında yürütülen olaylar için bir olay zaman çizelgesidir. Bireysel olaylar, zaman çizelgesi yollarındaki renkli, dikdörtgen bloklardır. Zaman soldan sağa hareket eder. Klavye kısayollarını kullanarak izleme olayları gezinin W (yakınlaştırma), S (uzaklaştırma), A (kaydırma sol) ve D (kaydırma sağda).

Tek bir dikdörtgen, bir izleme olayını temsil eder. Kayan araç çubuğunda fare imleci simgesini seçin (veya klavye kısayolunu kullanın 1 ) ve bunu analiz etmek iz olayı tıklayın. Bu, başlangıç ​​saati ve süresi gibi etkinlikle ilgili bilgileri görüntüler.

Tıklamaya ek olarak, bir grup izleme olayı seçmek için fareyi sürükleyebilirsiniz. Bu size bir olay özetiyle birlikte o bölgedeki tüm olayların bir listesini verecektir. Kullanım M Seçilen olayların süresini ölçmek için anahtar.

İzleme olayları şuradan toplanır:

  • İşlemci: CPU olayları adında bir olay grubu altında görüntülenir /host:CPU . Her parça CPU'daki bir iş parçacığını temsil eder. CPU olayları, giriş işlem hattı olaylarını, GPU işlemi (op) zamanlama olaylarını, CPU op yürütme olaylarını vb. içerir.
  • GPU: GPU olaylar önek olay gruplar altında görüntülenir /device:GPU: . Her olay grubu, GPU'da bir akışı temsil eder.

Hata ayıklama performansı darboğazları

Giriş işlem hattınızdaki performans darboğazlarını bulmak için İzleme Görüntüleyici'yi kullanın. Aşağıdaki resim, performans profilinin bir anlık görüntüsüdür.

profiler_trace_viewer_bad_ip

Olay izleri baktığımızda, sen ise GPU inaktif olduğunu görebilirsiniz tf_data_iterator_get_next op CPU üzerinde çalışıyor. Bu operasyon, girdi verilerinin işlenmesinden ve eğitim için GPU'ya gönderilmesinden sorumludur. Genel bir kural olarak, cihazı (GPU/TPU) her zaman aktif tutmak iyi bir fikirdir.

Kullanım tf.data giriş hattını optimize etmek API. Bu durumda, GPU'nun işlemesi için her zaman kullanılabilir veri olduğundan emin olmak için eğitim veri kümesini önbelleğe alalım ve verileri önceden getirelim. Bkz burada kullanımıyla ilgili daha fazla ayrıntı için tf.data girişinizi boru hatlarını optimize etmek.

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

Modeli yeniden eğitin ve önceki geri aramayı yeniden kullanarak performans profilini yakalayın.

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>

Yeniden başlatma TensorBoard ve güncellenmiş girdi boru hattı için performans profili gözlemlemek Profil sekmesini açın.

Optimize edilmiş girdi ardışık düzenine sahip modelin performans profili, aşağıdaki resme benzer.

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

Genel Bakış sayfasından, Ortalama Adım süresinin Giriş Adımı süresi kadar azaldığını görebilirsiniz. Adım-Zaman Grafiği, modelin artık yüksek düzeyde girdiye bağlı olmadığını da gösterir. Optimize edilmiş giriş işlem hattıyla izleme olaylarını incelemek için İzleme Görüntüleyicisini açın.

profiler_trace_viewer_good_ip

O İz Görüntüleyici gösterileri tf_data_iterator_get_next op çok daha hızlı çalıştırır. Bu nedenle GPU, eğitimi gerçekleştirmek için sabit bir veri akışı alır ve model eğitimi yoluyla çok daha iyi kullanım sağlar.

Özet

Model eğitim performansının profilini çıkarmak ve hata ayıklamak için TensorFlow Profiler'ı kullanın. Oku Profiler kılavuzu ve seyretmek TF 2'de Performans profil TensorFlow Profiler hakkında daha fazla bilgi edinmek için TensorFlow Dev Zirve 2020 den konuş.