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
vetf.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-yer2021-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ı .