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 , hesaplama birimlerini temsil eden bir dizi tf.Operation nesneleri (ops) ve işlemler arasında akan veri birimlerini temsil eden tf.Tensor nesneleri içerir.

Grappler, TensorFlow çalışma zamanında varsayılan grafik optimizasyon sistemidir. Grappler, TensorFlow hesaplamalarınızın performansını grafik basitleştirmeleri ve yordamlar arası optimizasyonları etkinleştirmek için fonksiyon gövdelerini satır içine alma gibi diğer üst düzey optimizasyonlar aracılığıyla iyileştirmek için grafik modunda ( tf.function içinde) optimizasyonlar uygular. tf.Graph optimize etmek ayrıca aygıtın en yüksek bellek kullanımını azaltır ve kaynakları hesaplamak için grafik düğümlerinin eşlenmesini optimize ederek donanım kullanımını iyileştirir.

tf.Graph optimizasyonlarınız üzerinde daha hassas kontrol için tf.config.optimizer.set_experimental_options() kullanın.

Mevcut grafik iyileştiriciler

Grappler, MetaOptimizer adlı üst düzey bir sürücü aracılığıyla grafik optimizasyonları gerçekleştirir. TensorFlow ile aşağıdaki grafik optimize ediciler mevcuttur:

  • Sabit katlama iyileştirici - Grafikteki sabit düğümleri katlayarak mümkün olduğunda tensörlerin değerini statik olarak çıkarır ve sonucu sabitleri kullanarak gerçekleştirir.
  • Aritmetik iyileştirici - Ortak alt ifadeleri ortadan kaldırarak ve aritmetik ifadeleri basitleştirerek aritmetik işlemleri basitleştirir.
  • Düzen iyileştirici - Konvolüsyonlar gibi veri formatına bağlı işlemleri daha verimli yürütmek için tensör düzenlerini optimize eder.
  • Remapper optimizer - Yaygın olarak ortaya çıkan alt grafikleri optimize edilmiş kaynaşmış monolitik çekirdeklerle değiştirerek alt grafikleri daha verimli uygulamalara yeniden eşler.
  • Bellek iyileştirici - Her işlem için en yüksek bellek kullanımını incelemek için grafiği analiz eder ve en yüksek bellek kullanımını azaltmak için GPU belleğini CPU'ya değiştirmek için CPU-GPU bellek kopyalama işlemlerini ekler.
  • Bağımlılık iyileştirici - Bir model adımının kritik yolunu kısaltmak için kontrol bağımlılıklarını kaldırır veya yeniden düzenler ya da diğer optimizasyonları etkinleştirir. Ayrıca, Kimlik gibi etkin bir şekilde işlem gerektirmeyen düğümleri de kaldırır.
  • Budama iyileştirici - Grafik çıktısı üzerinde hiçbir etkisi olmayan düğümleri budaır. 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.
  • İşlev iyileştirici - Bir TensorFlow programının işlev kitaplığını optimize eder ve diğer prosedürler arası optimizasyonları etkinleştirmek için işlev gövdelerini sıralar.
  • Şekil iyileştirici - Şekil ve şekille ilgili bilgiler üzerinde çalışan alt grafikleri optimize eder.
  • Otomatik paralel iyileştirici - Toplu iş boyutu boyunca bölerek grafikleri otomatik olarak paralelleştirir. Bu optimize edici varsayılan olarak KAPALI durumdadır.
  • Döngü iyileştirici - Döngüden değişmeyen alt grafikleri döngülerin dışına çıkararak ve döngülerdeki gereksiz yığın işlemlerini kaldırarak grafik kontrol akışını optimize eder. 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.
  • Kapsamlı ayırıcı iyileştirici - Veri hareketini azaltmak ve bazı işlemleri birleştirmek için kapsamlı ayırıcılar sunar.
  • Ana bilgisayar optimize ediciye sabitle - Küçük işlemleri CPU'ya aktarır. Bu optimize edici varsayılan olarak KAPALI durumdadır.
  • Otomatik karma hassas iyileştirici - Performansı artırmak için uygun olduğunda veri türlerini float16'ya dönüştürür. Şu anda yalnızca GPU'lar için geçerlidir.
  • Hata ayıklama striptizci - tf.debugging.Assert , tf.debugging.check_numerics ve tf.print gibi hata ayıklama işlemleriyle ilgili düğümleri grafikten çıkarır. 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 ötesi, varsayılan olarak hevesle yürütülür. Varsayılan yürütmeyi Grafik moduna geçirmek için tf.function işlevini kullanın. 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")
tutucu4 l10n-yer
{'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")
tutucu6 l10n-yer
{'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)
tutucu9 l10n-yer
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 , test_func için Inf bağımsız değişkeni nedeniyle geçersiz bir bağımsız değişken hatası veriyor.

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)

Hata ayıklama striptizci iyileştiricisi, tf.debug.check_numerics düğümünü grafikten çıkarır ve herhangi bir hata oluşturmadan işlevi yürütür.

Özet

TensorFlow çalışma zamanı, yürütmeden önce grafikleri otomatik olarak optimize etmek için Grappler'ı kullanır. Çeşitli grafik iyileştiricileri etkinleştirmek veya devre dışı bırakmak için tf.config.optimizer.set_experimental_options kullanın.

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