Google I / O, 18-20 Mayıs'ta geri dönüyor! Yer ayırın ve programınızı oluşturun Şimdi kaydolun

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 Defteri indirin

Genel Bakış

TensorFlow, hesaplamaları yürütmek için hem grafik hem de istekli yürütmeler kullanır. Bir tf.Graph , hesaplama birimlerini temsil eden bir dizi tf.Operation nesnesi (ops) ve tf.Tensor arasında akan veri birimlerini temsil eden tf.Tensor nesneleri içerir.

Grappler, TensorFlow çalışma zamanındaki varsayılan grafik optimizasyon sistemidir. Grappler, TensorFlow hesaplamalarınızın performansını grafik sadeleştirmeleri ve prosedürler arası optimizasyonları etkinleştirmek için satır içi işlev gövdeleri 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 edilmesi ayrıca aygıtın en yüksek bellek kullanımını azaltır ve kaynakları hesaplamak için grafik düğümlerinin eşlemesini 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. Aşağıdaki grafik iyileştiriciler TensorFlow ile kullanılabilir:

  • Sabit katlama optimize edici - Mümkün olduğunda, grafikteki sabit düğümleri katlayarak tensörlerin değerini statik olarak ortaya çıkarır ve sabitleri kullanarak sonucu gerçekleştirir.
  • Aritmetik iyileştirici - Yaygın alt ifadeleri ortadan kaldırarak ve aritmetik ifadeleri basitleştirerek aritmetik işlemleri basitleştirir.
  • Düzen iyileştirici - Evrişimler gibi veri biçimine bağlı işlemleri daha verimli bir şekilde yürütmek için tensör düzenlerini optimize eder .
  • 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 - 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 ile değiştirmek için CPU-GPU bellek kopyalama işlemlerini ekler.
  • Bağımlılık iyileştirici - Bir model adımı için kritik yolu kısaltmak veya diğer optimizasyonları etkinleştirmek için denetim bağımlılıklarını kaldırır veya yeniden düzenler. Ayrıca, Kimlik gibi etkin bir şekilde işlem yapmayan düğümleri de kaldırır.
  • Budama iyileştirici - Grafikten elde edilen çıktı üzerinde etkisi olmayan düğümleri eritir. Genellikle önce grafiğin boyutunu küçültmek ve diğer Grappler geçişlerinde işlemi 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 satır içine alır.
  • Şekil iyileştirici - Şekil ve şekille ilgili bilgiler üzerinde çalışan alt grafikleri optimize eder .
  • Autoparallel optimizer - 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üsel değişmeyen alt grafikleri döngülerin dışına kaldırarak ve döngülerde fazlalık yığın işlemlerini kaldırarak grafik kontrol akışını optimize eder. Ayrıca, döngüleri statik olarak bilinen gezi sayılarıyla optimize eder ve koşullu ifadelerde 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 ile değiştirir. Bu optimize edici, varsayılan olarak KAPALI durumdadır.
  • Otomatik karışık hassas optimize edici - Performansı artırmak için uygun olan yerlerde veri türlerini float16'ya dönüştürür. Şu anda yalnızca GPU'lar için geçerlidir.
  • Hata ayıklama ayıklayıcı - Grafikten tf.debugging.Assert , tf.debugging.check_numerics ve tf.print gibi hata ayıklama işlemleriyle ilgili düğümleri tf.print . Bu optimize edici, varsayılan olarak KAPALI durumdadır.

Kurulum

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)

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

TensorFlow 2 ve ötesi, varsayılan olarak hevesle çalışır . Varsayılan yürütmeyi Grafik moduna tf.function için tf.function 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 optimize ediciyi 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.0801323579999007 s

Sabit katlama optimize ediciyi etkinleştirin ve işlevin yürütülmesinde bir hızlanma gözlemlemek için işlevi tekrar çalıştırı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.0006300529998952697 s

Sıyırıcı iyileştirici hata ayıklama

Girdi bağımsız değişkeninin sayısal değerini kontrol eden ve onu döndüren basit bir işlevi 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 ayıklayıcı optimize edici kapalıyken çalıştırı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 780, 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) ]]
  (1) Invalid argument:  Bad! : Tensor had Inf values
     [[node CheckNumerics (defined at <ipython-input-7-cbee1561c83e>:5) ]]
     [[Identity/_4]]
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 , tf.debugging.check_numerics yönelik Inf bağımsız değişkeni nedeniyle geçersiz bir bağımsız değişken hatası test_func .

Hata ayıklama sıyırma iyileştiricisini etkinleştirin ve işlevi yeniden çalıştırı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 tf.debug.check_numerics optimize tf.debug.check_numerics , grafikten tf.debug.check_numerics düğümünü tf.debug.check_numerics ve herhangi bir hata oluşturmadan işlevi çalıştırır.

Özet

TensorFlow çalışma zamanı, çalıştırmadan ö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ı .