Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

Optimasi grafik TensorFlow dengan Grappler

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

Gambaran

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

Grappler adalah sistem optimalisasi grafik default dalam runtime TensorFlow. Grappler menerapkan optimisasi dalam mode grafik (dalam tf.function ) untuk meningkatkan kinerja perhitungan TensorFlow Anda melalui penyederhanaan grafik dan optimalisasi tingkat tinggi lainnya seperti inlining badan fungsi untuk mengaktifkan optimalisasi 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 optimasi tf.Graph Anda.

Pengoptimal grafik yang tersedia

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

  • Constant folding optimizer - Secara statik menyimpulkan nilai tensor jika memungkinkan dengan melipat node konstan dalam grafik dan mematerialisasikan hasilnya menggunakan konstanta.
  • Pengoptimal aritmatika - Menyederhanakan operasi aritmatika dengan menghilangkan subekspresi umum dan menyederhanakan pernyataan aritmatika.
  • Layout optimizer - Mengoptimalkan tata letak tensor untuk menjalankan operasi yang bergantung pada format data seperti konvolusi secara lebih efisien.
  • Pengoptimal remapper - Memetakan kembali subgraph ke dalam implementasi yang lebih efisien dengan mengganti subgraph yang biasa terjadi dengan kernel monolitik berfusi yang dioptimalkan.
  • Memory optimizer - Menganalisa grafik untuk memeriksa penggunaan memori puncak untuk setiap operasi dan memasukkan operasi penyalinan memori CPU-GPU untuk menukar memori GPU ke CPU untuk mengurangi penggunaan memori puncak.
  • Dependency optimizer - Menghapus atau mengatur ulang dependensi kontrol untuk mempersingkat jalur kritis untuk langkah model atau mengaktifkan optimisasi lainnya. Juga menghapus node yang secara efektif no-ops seperti Identity.
  • Pruning optimizer - Memangkas node yang tidak berpengaruh pada output dari grafik. Biasanya dijalankan pertama kali untuk mengurangi ukuran grafik dan mempercepat pemrosesan di lintasan Grappler lainnya.
  • Pengoptimal fungsi - Mengoptimalkan pustaka fungsi dari program TensorFlow dan menyatukan badan-badan fungsi untuk memungkinkan optimalisasi antar-prosedur lainnya.
  • Pengoptimal bentuk - Mengoptimalkan subgraph yang beroperasi pada informasi terkait bentuk dan bentuk.
  • Pengoptimal otomatis paralel - Secara otomatis memparalelkan grafik dengan membelah sepanjang dimensi bets. Pengoptimal ini dinonaktifkan secara default.
  • Loop optimizer - Mengoptimalkan aliran kontrol grafik dengan mengangkat subgraph loop-invarian keluar dari loop dan dengan menghapus operasi tumpukan redundan dalam loop. Juga mengoptimalkan loop dengan jumlah perjalanan yang diketahui secara statis dan menghilangkan cabang mati yang diketahui secara statis dalam kondisi.
  • Pengoptimal pengalokasian lingkup - Memperkenalkan pengalokasian lingkup untuk mengurangi pergerakan data dan untuk mengkonsolidasikan beberapa operasi.
  • Pin to host optimizer - Mengganti operasi kecil ke CPU. Pengoptimal ini dinonaktifkan secara default.
  • Pengoptimal presisi campuran otomatis - Mengubah tipe data menjadi float16 jika dapat diterapkan untuk meningkatkan kinerja. Saat ini hanya berlaku untuk GPU.
  • Debug stripper - Strip Nodes yang terkait dengan operasi debugging seperti tf.debugging.Assert , tf.debugging.check_numerics , dan tf.print dari grafik. Pengoptimal ini dinonaktifkan secara default.

Mempersiapkan

 import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf
 

Buat pengelola konteks untuk dengan mudah mengganti status pengoptimal.

 @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 Graph. Grappler berjalan secara otomatis di latar belakang untuk menerapkan optimasi grafik di atas dan meningkatkan kinerja eksekusi.

Pengoptimal pelipatan 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 optimizer 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.004905937999865273 s

Aktifkan optimizer 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.0005699149999145448 s

Pengoptimal stripper debug

Pertimbangkan fungsi sederhana yang memeriksa nilai numerik 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 optimizer stripper debug 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)
 
Traceback (most recent call last):
  File "<ipython-input-8-1ac473fdfbab>", line 4, in <module>
    test_func(p1)
  File "/tmpfs/src/tf_docs_env/lib/python3.6/site-packages/tensorflow/python/eager/def_function.py", line 580, in __call__
    result = self._call(*args, **kwds)
tensorflow.python.framework.errors_impl.InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at <ipython-input-7-cbee1561c83e>:5) ]]
     [[Identity/_4]]
  (1) Invalid argument:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at <ipython-input-7-cbee1561c83e>:5) ]]
0 successful operations.
0 derived errors ignored. [Op:__inference_simple_func_131]

Errors may have originated from an input operation.
Input Source operations connected to node CheckNumerics:
 input_arg (defined at <ipython-input-8-1ac473fdfbab>:4)

Input Source operations connected to node CheckNumerics:
 input_arg (defined at <ipython-input-8-1ac473fdfbab>:4)

Function call stack:
simple_func -> simple_func


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

Aktifkan pengoptimal stripper debug 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 stripper debug tf.debug.check_numerics simpul tf.debug.check_numerics dari grafik dan mengeksekusi fungsi tersebut tanpa menimbulkan kesalahan.

Ringkasan

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

Untuk informasi lebih lanjut tentang Grappler, lihat TensorFlow Graph Optimizations .