Optimalisasi grafik TensorFlow dengan Grappler

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

Ringkasan

TensorFlow menggunakan grafik dan eksekusi bersemangat untuk mengeksekusi komputasi. Sebuah tf.Graph berisi sekumpulan objek tf.Operation (ops) yang mewakili unit komputasi dan objek tf.Tensor yang mewakili unit data yang mengalir di antara ops.

Grappler adalah sistem pengoptimalan grafik default di runtime TensorFlow. Grappler menerapkan pengoptimalan dalam mode grafik (dalam tf.function ) untuk meningkatkan kinerja komputasi TensorFlow Anda melalui penyederhanaan grafik dan pengoptimalan tingkat tinggi lainnya seperti menyejajarkan badan fungsi untuk mengaktifkan pengoptimalan antar-prosedural. Mengoptimalkan tf.Graph juga mengurangi penggunaan memori puncak perangkat dan meningkatkan pemanfaatan perangkat keras dengan mengoptimalkan pemetaan node grafik untuk menghitung sumber daya.

Gunakan tf.config.optimizer.set_experimental_options() untuk kontrol yang lebih baik atas pengoptimalan tf.Graph Anda.

Pengoptimal grafik yang tersedia

Grappler melakukan pengoptimalan grafik melalui driver tingkat atas yang disebut MetaOptimizer . Pengoptimal grafik berikut tersedia dengan TensorFlow:

  • Pengoptimal lipat konstan - Secara statis menyimpulkan nilai tensor jika memungkinkan dengan melipat simpul konstan dalam grafik dan mewujudkan hasilnya menggunakan konstanta.
  • Pengoptimal aritmatika - Menyederhanakan operasi aritmatika dengan menghilangkan subekspresi umum dan menyederhanakan pernyataan aritmatika.
  • Pengoptimal tata letak - Mengoptimalkan tata letak tensor untuk menjalankan operasi yang bergantung pada format data seperti konvolusi secara lebih efisien.
  • Pengoptimal Remapper - Memetakan ulang subgraf ke implementasi yang lebih efisien dengan mengganti subgraf yang umum terjadi dengan kernel monolitik fusi yang dioptimalkan.
  • Pengoptimal memori - Menganalisis grafik untuk memeriksa penggunaan memori puncak untuk setiap operasi dan menyisipkan operasi penyalinan memori CPU-GPU untuk menukar memori GPU ke CPU guna mengurangi penggunaan memori puncak.
  • Pengoptimal dependensi - Menghapus atau mengatur ulang dependensi kontrol untuk mempersingkat jalur kritis untuk langkah model atau mengaktifkan pengoptimalan lainnya. Juga menghapus node yang secara efektif tidak beroperasi seperti Identity.
  • Pengoptimal pemangkasan - Memangkas simpul yang tidak berpengaruh pada output dari grafik. Biasanya dijalankan terlebih dahulu untuk mengurangi ukuran grafik dan mempercepat pemrosesan dalam lintasan Grappler lainnya.
  • Pengoptimal fungsi - Mengoptimalkan pustaka fungsi program TensorFlow dan menyejajarkan badan fungsi untuk mengaktifkan pengoptimalan antar-prosedural lainnya.
  • Pengoptimal bentuk - Mengoptimalkan subgraf yang beroperasi pada informasi terkait bentuk dan bentuk.
  • Pengoptimal Autoparallel - Secara otomatis memparalelkan grafik dengan membagi sepanjang dimensi batch. Pengoptimal ini OFF secara default.
  • Pengoptimal loop - Mengoptimalkan aliran kontrol grafik dengan mengangkat subgraf loop-invarian keluar dari loop dan dengan menghapus operasi tumpukan yang berlebihan dalam loop. Juga mengoptimalkan loop dengan jumlah perjalanan yang diketahui secara statis dan menghilangkan cabang mati yang diketahui secara statis dalam kondisional.
  • Pengoptimal pengalokasi tercakup - Memperkenalkan pengalokasi tercakup untuk mengurangi pergerakan data dan untuk mengkonsolidasikan beberapa operasi.
  • Pin ke pengoptimal host - Menukar operasi kecil ke CPU. Pengoptimal ini OFF secara default.
  • Pengoptimal presisi campuran otomatis - Mengonversi tipe data ke float16 jika dapat diterapkan untuk meningkatkan kinerja. Saat ini hanya berlaku untuk GPU.
  • Debug stripper - Menghapus node yang terkait dengan operasi debugging seperti tf.debugging.Assert , tf.debugging.check_numerics , dan tf.print dari grafik. Pengoptimal ini OFF secara default.

Mempersiapkan

import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf

Buat pengelola konteks untuk beralih status pengoptimal dengan mudah.

@contextlib.contextmanager
def options(options):
  old_opts = tf.config.optimizer.get_experimental_options()
  tf.config.optimizer.set_experimental_options(options)
  try:
    yield
  finally:
    tf.config.optimizer.set_experimental_options(old_opts)

Bandingkan kinerja eksekusi dengan dan tanpa Grappler

TensorFlow 2 dan seterusnya dijalankan dengan penuh semangat secara default. Gunakan tf.function untuk mengalihkan eksekusi default ke mode Grafik. Grappler berjalan secara otomatis di latar belakang untuk menerapkan pengoptimalan grafik di atas dan meningkatkan kinerja eksekusi.

Pengoptimal lipat konstan

Sebagai contoh awal, pertimbangkan fungsi yang melakukan operasi pada konstanta dan mengembalikan output.

def test_function_1():
  @tf.function
  def simple_function(input_arg):
    print('Tracing!')
    a = tf.constant(np.random.randn(2000,2000), dtype = tf.float32)
    c = a
    for n in range(50):
      c = c@a
    return tf.reduce_mean(c+input_arg)

  return simple_function

Matikan pengoptimal lipat konstan dan jalankan fungsinya:

with options({'constant_folding': False}):
  print(tf.config.optimizer.get_experimental_options())
  simple_function = test_function_1()
  # Trace once
  x = tf.constant(2.2)
  simple_function(x)
  print("Vanilla execution:", timeit.timeit(lambda: simple_function(x), number = 1), "s")
{'constant_folding': False, 'disable_model_pruning': False, 'disable_meta_optimizer': False}
Tracing!
Vanilla execution: 0.0018392090000816097 s

Aktifkan pengoptimal lipat konstan dan jalankan fungsi lagi untuk mengamati percepatan dalam eksekusi fungsi.

with options({'constant_folding': True}):
  print(tf.config.optimizer.get_experimental_options())
  simple_function = test_function_1()
  # Trace once
  x = tf.constant(2.2)
  simple_function(x)
  print("Constant folded execution:", timeit.timeit(lambda: simple_function(x), number = 1), "s")
{'constant_folding': True, 'disable_model_pruning': False, 'disable_meta_optimizer': False}
Tracing!
Constant folded execution: 0.0006749789999958011 s

Debug pengoptimal stripper

Pertimbangkan fungsi sederhana yang memeriksa nilai numerik dari argumen inputnya dan mengembalikannya.

def test_function_2():
  @tf.function
  def simple_func(input_arg):
    output = input_arg
    tf.debugging.check_numerics(output, "Bad!")
    return output
  return simple_func

Pertama, jalankan fungsi dengan pengoptimal debug stripper dimatikan.

test_func = test_function_2()
p1 = tf.constant(float('inf'))
try:
  test_func(p1)
except tf.errors.InvalidArgumentError as e:
  traceback.print_exc(limit=2)
2021-09-22 20:34:55.871238: E tensorflow/core/kernels/check_numerics_op.cc:292] abnormal_detected_host @0x7f4878e00100 = {0, 1} Bad!
Traceback (most recent call last):
  File "/tmp/ipykernel_22954/3616845043.py", line 4, in <module>
    test_func(p1)
  File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/eager/def_function.py", line 885, in __call__
    result = self._call(*args, **kwds)
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at tmp/ipykernel_22954/2241890286.py:5) ]] [Op:__inference_simple_func_131]

Errors may have originated from an input operation.
Input Source operations connected to node CheckNumerics:
 input_arg (defined at tmp/ipykernel_22954/3616845043.py:4)

Function call stack:
simple_func

tf.debugging.check_numerics memunculkan kesalahan argumen yang tidak valid karena argumen Inf ke test_func .

Aktifkan pengoptimal debug stripper dan jalankan fungsi lagi.

with options({'debug_stripper': True}):
  test_func2 = test_function_2()
  p1 = tf.constant(float('inf'))
  try:
    test_func2(p1)
  except tf.errors.InvalidArgumentError as e:
    traceback.print_exc(limit=2)

Pengoptimal debug stripper menghapus simpul tf.debug.check_numerics dari grafik dan menjalankan fungsi tanpa menimbulkan kesalahan apa pun.

Ringkasan

Waktu proses TensorFlow menggunakan Grappler untuk mengoptimalkan grafik secara otomatis sebelum dieksekusi. Gunakan tf.config.optimizer.set_experimental_options untuk mengaktifkan atau menonaktifkan berbagai pengoptimal grafik.

Untuk informasi selengkapnya tentang Grappler, lihat Pengoptimalan Grafik TensorFlow .