Grappler ile TensorFlow grafik optimizasyonu

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ış

TensorFlow, hesaplamaları yürütmek için hem grafiği hem de istekli yürütmeleri kullanır. Bir tf.Graph bir dizi içerir tf.Operation hesaplama ve birimlerini temsil eden nesneler (OPS) tf.Tensor ops arasında akmasına veri birimlerini temsil eden nesneler.

Grappler, TensorFlow çalışma zamanında varsayılan grafik optimizasyon sistemidir. Yakalayan (içinde grafik modunda en iyi duruma uygulanır tf.function grafik basitleştirmeler ve arası usul optimizasyonlar sağlamak için işlev organları inlining gibi başka yüksek seviye en iyi duruma üzerinden TensorFlow hesaplamaları performansını artırmak için). Optimize tf.Graph ayrıca cihazın yüksek bellek kullanımını azaltır ve işlem kaynaklarına grafik düğüm eşleme optimize donanım kullanımını geliştirir.

Kullanım tf.config.optimizer.set_experimental_options() sizin üzerinde daha hassas kontrolü için tf.Graph optimizasyonları.

Mevcut grafik iyileştiriciler

Yakalayan gerçekleştirir olarak adlandırılan bir üst düzey sürücü ile en iyi duruma grafik MetaOptimizer . TensorFlow ile aşağıdaki grafik optimize ediciler mevcuttur:

  • Sabit katlama iyileştirici - Statik grafikte sabit düğümleri katlayarak mümkün tensörlerinin değerini algılar ve sabitleri kullanılarak sonucu gerçekleştirir.
  • Aritmetik iyileştirici - basitleştiren ortak alt ifadeler ortadan kaldırılması ve aritmetik ifadeleri basitleştirerek aritmetik işlemler.
  • Düzen iyileştirici - Optimize tensör düzenleri böyle kıvrımlar olarak veri biçimi bağımlı işlemlerini yürütmek daha verimli.
  • Remapper iyileştirici - optimize kaynaşık monolitik çekirdekli sık meydana gelen subgraphs değiştirerek daha etkili uygulamalar üzerine yeniden eşler subgraphs.
  • Bellek iyileştirici - yüksek bellek kullanımını azaltmak için CPU'ya grafik işlemcisi bellek pompalanması için her işlem ve ek işlemci grafik işlemcisi bellek kopyalama işlemleri için yüksek bellek kullanımını incelemek için grafik analiz eder.
  • Bağımlılık iyileştirici - kaldırır veya rearranges bağımlılıkları model aşaması için kritik yolu kısaltmak veya diğer optimizasyonlar sağlayan denetim verir. Ayrıca, Kimlik gibi etkin bir şekilde işlem gerektirmeyen düğümleri de kaldırır.
  • Grafikten çıkış üzerinde hiçbir etkiye sahip erik düğümleri - iyileştirici budama. Genellikle ilk önce grafiğin boyutunu küçültmek ve diğer Grappler geçişlerinde işlemeyi hızlandırmak için çalıştırılır.
  • Fonksiyon iyileştirici - optimize bir TensorFlow programının işlevi kütüphanesi ve inlines diğer arası usul optimizasyonlar etkinleştirmek için bedenlerini çalışır.
  • Şekil iyileştirici - şekil üzerinde işlem ve ilgili bilgiyi şekil optimize subgraphs.
  • Autoparallel iyileştirici - Otomatik olarak toplu boyutu boyunca bölerek grafikleri parallelizes. Bu optimize edici varsayılan olarak KAPALI durumdadır.
  • Döngü iyileştirici - optimize döngüleri üzerinden döngü değişmeyen subgraphs vinçle ve döngülerde gereksiz yığın işlemleri kaldırarak grafik kontrol akışı. Ayrıca, statik olarak bilinen açma sayılarıyla döngüleri optimize eder ve koşullu olarak statik olarak bilinen ölü dalları kaldırır.
  • Dürbünlü allocator iyileştirici - tanıştırmak veri hareketini azaltmak ve bazı işlemleri pekiştirmek ayırıcılar kapsamlı.
  • Konak optimizer için Pim - CPU üzerine Swaplar küçük operasyonları. Bu optimize edici varsayılan olarak KAPALI durumdadır.
  • Otomatik karışık hassas iyileştirici - float16 CONVERT veri tipleri uygulanabildiği yerde performansını artırmak için. Şu anda yalnızca GPU'lar için geçerlidir.
  • Ayıklama sıyırıcı gibi - hata giderme operasyonları ile ilişkili Şeritler düğümleri tf.debugging.Assert , tf.debugging.check_numerics ve tf.print grafikten. Bu optimize edici varsayılan olarak KAPALI durumdadır.

Kurmak

import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf

Optimize edici durumları arasında kolayca geçiş yapmak için bir bağlam yöneticisi oluşturun.

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

Grappler ile ve Grappler olmadan yürütme performansını karşılaştırın

TensorFlow 2 ve yürütür ötesinde hevesle varsayılan olarak. Kullanım tf.function Grafik moduna varsayılan yürütme geçin. Grappler, yukarıdaki grafik optimizasyonlarını uygulamak ve yürütme performansını iyileştirmek için arka planda otomatik olarak çalışır.

Sabit katlama optimize edici

Bir ön örnek olarak, sabitler üzerinde işlemler gerçekleştiren ve bir çıktı döndüren bir işlevi düşünün.

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

Sabit katlama iyileştiriciyi kapatın ve işlevi yürütün:

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

Sabit katlama iyileştiriciyi etkinleştirin ve işlevin yürütülmesinde bir hızlanma gözlemlemek için işlevi yeniden yürütün.

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

Hata ayıklama striptizci optimize edici

Girdi argümanının sayısal değerini kontrol eden ve onu döndüren basit bir fonksiyon düşünün.

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

İlk olarak, işlevi hata ayıklama striptizci iyileştirici kapalıyken yürütün.

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 nedeniyle geçersiz argüman hata yükseltir Inf için argüman test_func .

Hata ayıklama striptizci optimize ediciyi etkinleştirin ve işlevi yeniden yürütün.

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)

Ayıklama sıyırıcı iyileştirici şeritler tf.debug.check_numerics grafikten düğümü ve hataları yükseltmeden işlevini yürütür.

Özet

TensorFlow çalışma zamanı, yürütmeden önce grafikleri otomatik olarak optimize etmek için Grappler'ı kullanır. Kullanım tf.config.optimizer.set_experimental_options çeşitli grafik optimize etkinleştirmek veya etkisizleştirmek için.

Grappler hakkında daha fazla bilgi için bkz TensorFlow Grafik Optimizasyonları .