Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Ottimizzazione grafico tensorflow con Grappler

View on TensorFlow.org Eseguire in Google Colab Visualizza sorgente su GitHub Scarica notebook

Panoramica

Tensorflow utilizza sia grafico e esecuzioni ansiosi di eseguire calcoli. Un tf.Graph contiene un insieme di tf.Operation oggetti (PO) che rappresentano unità di calcolo e tf.Tensor oggetti che rappresentano le unità di dati che fluiscono tra op.

Grappler è il sistema di ottimizzazione grafico predefinito nel runtime tensorflow. Grappler applica ottimizzazioni in modo grafico (in un raggio tf.function ) per migliorare le prestazioni dei vostri calcoli tensorflow attraverso semplificazioni grafico e altre ottimizzazioni ad alto livello, come inlining organi funzione per abilitare ottimizzazioni inter-procedurali. Ottimizzando la tf.Graph riduce anche l'utilizzo della memoria del dispositivo di picco e migliora l'utilizzo dell'hardware ottimizzando la mappatura dei nodi del grafo di risorse di calcolo.

Utilizzare tf.config.optimizer.set_experimental_options() per un controllo più preciso sui tuoi tf.Graph ottimizzazioni.

ottimizzatori grafico disponibili

Esegue grappler graph ottimizzazioni attraverso un driver a livello superiore chiamato MetaOptimizer . I seguenti ottimizzatori grafico sono disponibili con tensorflow:

  • Costante ottimizzatore pieghevole - staticamente deduce il valore dei tensori quando possibile piegando nodi costanti nel grafico e materializza il risultato usando costanti.
  • Aritmetica ottimizzatore - semplifica le operazioni aritmetiche, eliminando sottoespressioni comuni e semplificando le dichiarazioni aritmetiche.
  • La layout ottimizzatore - ottimizza tensore layout per eseguire operazioni dipendenti formato dati quali circonvoluzioni più efficiente.
  • Rimappatore ottimizzatore - riassocia sottografi Onto implementazioni più efficienti sostituendo sottografi comunemente si verificano con ottimizzati kernel monolitici fusi.
  • Memoria ottimizzatore - analisi i dati per controllare l'utilizzo della memoria di picco per ciascuna operazione e inserisce le operazioni di copia memoria CPU-GPU da travasamento memoria GPU alla CPU per ridurre l'utilizzo della memoria di picco.
  • Dipendenza ottimizzatore - rimuove o riordina controllare le dipendenze per abbreviare il percorso critico per un passo o modello consente altre ottimizzazioni. rimuove anche i nodi che sono effettivamente no-ops quali Identity.
  • Potatura ottimizzatore - Prugne nodi che non hanno effetto sull'uscita dal grafico. Di solito è eseguito per primo per ridurre le dimensioni del grafico e accelerare l'elaborazione in altri Grappler passa.
  • Ottimizzatore Funzione - Ottimizza la libreria delle funzioni di un programma tensorflow e inline funzionano gli organi per consentire altre ottimizzazioni inter-procedurali.
  • Forma ottimizzatore - Ottimizza sottografi che operano su forma e modellano le informazioni correlate.
  • Autoparallel ottimizzatore - parallelizza automaticamente grafici suddividendo lungo la dimensione batch. Questo ottimizzatore è disattivata per impostazione predefinita.
  • Loop ottimizzatore - ottimizza il flusso di controllo grafico di issare sottografi ciclo-invariante su anse ed eliminando operazioni di stack ridondanti in loop. ottimizza anche loop con i conteggi viaggio noti staticamente e rimuove staticamente noti rami secchi in condizionali.
  • Scoped allocatore ottimizzatore - presenta ambito allocatori per ridurre lo spostamento dei dati e di consolidare alcune operazioni.
  • Pin per ottimizzatore ospite - Swap piccole operazioni nella CPU. Questo ottimizzatore è disattivata per impostazione predefinita.
  • Auto mista di precisione ottimizzatore - tipi di dati Converte float16 se del caso per migliorare le prestazioni. Attualmente si applica solo alle GPU.
  • Debug stripper - Strips nodi sono collegati con operazioni di debug come tf.debugging.Assert , tf.debugging.check_numerics , e tf.print dal grafico. Questo ottimizzatore è disattivata per impostazione predefinita.

Impostare

 import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf
 

Creare un gestore contesto facilmente ginocchiera stati Optimizer.

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

prestazioni di esecuzione Confronto con e senza Grappler

Tensorflow 2 e al di là esegue con entusiasmo per impostazione predefinita. Utilizzare tf.function per commutare l'esecuzione di default in modalità Graph. Grappler viene eseguito automaticamente in background per applicare le ottimizzazioni grafico di cui sopra e migliorare le prestazioni di esecuzione.

Costante ottimizzatore pieghevole

Come esempio preliminare, si consideri una funzione che esegue operazioni sulle costanti e rendimenti un'uscita.

 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
 

Spegnere l'ottimizzatore costante piegatura ed eseguire la funzione:

 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

Consentire la piegatura ottimizzatore costante ed eseguire la funzione di nuovo per osservare un'accelerazione nell'esecuzione funzione.

 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

Debug spogliarellista ottimizzatore

Si consideri una semplice funzione che controlla il valore numerico del suo argomento input e restituisce.

 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
 

In primo luogo, eseguire la funzione con l'ottimizzatore di debug spogliarellista spento.

 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 genera un errore argomento non valido a causa della Inf argomento per test_func .

Attivare la spogliarellista ottimizzatore di debug ed eseguire di nuovo la funzione.

 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)
 

L'ottimizzatore di debug stripper spoglia il tf.debug.check_numerics nodo dal grafico ed esegue la funzione senza sollevare errori.

Sommario

Il runtime tensorflow utilizza Grappler ai grafici ottimizzare automaticamente prima dell'esecuzione. Utilizzare tf.config.optimizer.set_experimental_options per abilitare o disabilitare le varie ottimizzatori grafico.

Per ulteriori informazioni su Grappler, vedere tensorflow Grafico ottimizzazioni .