Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

Yakalayan ile TensorFlow grafik optimizasyonu

TensorFlow.org görüntüleme Google CoLab koş GitHub üzerinde Görünüm kaynak İndir dizüstü

genel bakış

TensorFlow grafik ve işlemleri bile istekli yürütmeleri hem 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 zamanında varsayılan grafik optimizasyonu 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 optimize

Yakalayan gerçekleştirir olarak adlandırılan bir üst düzey sürücü ile en iyi duruma grafik MetaOptimizer . Aşağıdaki grafikte, optimize TensorFlow 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 etkin bir biçimde, örneğin Kimlik no-op olan düğümleri kaldırır.
  • Grafikten çıkış üzerinde hiçbir etkiye sahip erik düğümleri - iyileştirici budama. Genellikle grafik boyutunu azaltmak ve diğer Grappler geçer içinde işleme hızlandırmak için ilk ç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 iyileştirici varsayılan olarak KAPALI hale gelir.
  • 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 bilinen gezi sayısı ve statik Koşullamalar ölü dalları bilinen uzaklaşmaların ile döngüler optimize eder.
  • 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 iyileştirici varsayılan olarak KAPALI hale gelir.
  • 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 iyileştirici varsayılan olarak KAPALI hale gelir.

Kurmak

 import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf
 

kolayca optimize edici devletler geçiş bir bağlam yöneticisinin oluşturulması.

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

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

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. Yakalayan yukarıdaki grafikte iyi duruma uygulanır ve uygulama performansını artırmak için arka planda otomatik olarak çalışır.

Sabit katlama iyileştirici

Bir ön örnek olarak, bir işlev sabitleri ve döner gerçekleştirir işlemleri bir çıkış 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 optimize edici kapatın ve işlevini çalıştırı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.004905937999865273 s

fonksiyon yürütülmesinde bir hıza yukarı gözlemlemek için tekrar fonksiyonu sabit katlama optimize edici etkinleştirme ve yürütme.

 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

Hata Ayıklama striptizci iyileştirici

Basit bir işlevi düşünün olmadığını kontrol eder, giriş argüman ve getiri bunun sayısal değer.

 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, kapalı ayıklama striptizci iyileştirici ile işlevini 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)
 
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 nedeniyle geçersiz argüman hata yükseltir Inf için argüman test_func .

ayıklama striptizci optimize edici etkinleştirme ve tekrar işlevini 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 zamanı otomatik olarak icra önce optimize grafikler 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ı .