Esta página foi traduzida pela API Cloud Translation.
Switch to English

optimização gráfico TensorFlow com Grappler

Ver TensorFlow.org Executar no Google Colab Ver fonte no GitHub Baixar notebook

Visão geral

TensorFlow usa tanto gráfico e execuções ansiosos para executar cálculos. Um tf.Graph contém um conjunto de tf.Operation objectos (ops) que representam unidades de cálculo e tf.Tensor objectos que representam as unidades de dados que fluem entre ops.

Grappler é o sistema de otimização de gráfico padrão no tempo de execução TensorFlow. Grappler aplica otimizações em modo gráfico (dentro tf.function ) para melhorar o desempenho de seus cálculos TensorFlow através de simplificações gráfico e outras otimizações de alto nível, tais como inlining corpos de função para ativar otimizações inter-processuais. Optimizar a tf.Graph também reduz a utilização de memória pico dispositivo e melhora a utilização do hardware através da optimização do mapeamento de nodos gráfico aos recursos computacionais.

Use tf.config.optimizer.set_experimental_options() para melhor controle sobre seus tf.Graph otimizações.

otimizadores de gráficos disponíveis

Executa Grappler gráfico optimizações através de um controlador de nível superior chamado de MetaOptimizer . Os seguintes optimizadores gráfico estão disponíveis com TensorFlow:

  • Constante optimizador de dobragem - estaticamente deduz o valor de tensores quando possíveis dobrando nodos constantes no gráfico e se materializa o resultado usando constantes.
  • Otimizador de aritmética - simplifica as operações aritméticas, eliminando subexpressions comuns e simplificando declarações aritméticas.
  • Disposição optimizador - aperfeiçoa tensor layouts para executar operações dependentes do formato de dados, tais como espiras de forma mais eficiente.
  • Remapper Optimizer - Remapeia subgráficos Onto implementações mais eficiente por meio da substituição subgráficos vulgarmente ocorrem com núcleos monolíticos fundidos optimizados.
  • Memory Optimizer - Analisa o gráfico para inspecionar o uso de memória de pico para cada operação e insere operações de cópia de memória CPU-GPU para trocar memória da GPU para CPU para reduzir o uso de memória de pico.
  • Dependência optimizador - Remove ou rearranja controlar dependências de encurtar o caminho crítico para um passo ou modelo permite outras optimizações. Também remove os nós que são efetivamente não-ops como identidade.
  • Poda Optimizer - nós Prunes que não têm nenhum efeito sobre a saída do gráfico. Geralmente é executado em primeiro lugar para reduzir o tamanho do gráfico e acelerar o processamento no outro Grappler passa.
  • Função otimizador - otimiza a biblioteca função de um programa TensorFlow e inlines funcionar corpos para permitir que outras otimizações inter-processuais.
  • Forma otimizador - Otimiza subgraphs que operam em forma e moldam as informações relacionadas.
  • Autoparallel optimizador - parallelizes automaticamente gráficos por meio de separação ao longo da dimensão do lote. Este otimizador está desativada por padrão.
  • Laço optimizador - de optimizar o fluxo de controlo de gráfico de içar subgráficos de loop-out invariante de loops e removendo operações de pilha redundantes em loops. Também otimiza malhas com contagens viagem estaticamente conhecidos e remove estaticamente conhecidos galhos mortos no condicionais.
  • Escopo de alocador otimizador - introduz escopo allocators para reduzir o movimento de dados e para consolidar algumas operações.
  • Pin para otimizador de acolhimento - Swaps pequenas operações para a CPU. Este otimizador está desativada por padrão.
  • Auto mista precisão otimizador - tipos de dados converte em float16 quando aplicável para melhorar o desempenho. Atualmente só se aplica aos GPUs.
  • Depuração extractor - Tiras nodos relacionados com operações de depuração, tais como tf.debugging.Assert , tf.debugging.check_numerics , e tf.print a partir do gráfico. Este otimizador está desativada por padrão.

Configuração

 import numpy as np
import timeit
import traceback
import contextlib


import tensorflow as tf
 

Crie um gerenciador de contexto para facilmente alternar estados otimizador.

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

desempenho da execução comparar com e sem Grappler

TensorFlow 2 e além executa ansiosamente por padrão. Use tf.function para alternar a execução padrão para o modo Graph. Grappler é executado automaticamente em segundo plano para aplicar as otimizações gráfico acima e melhorar o desempenho de execução.

optimizador de dobragem constante

Como um exemplo preliminar, considere uma função que executa operações em constantes e retorna uma saída.

 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
 

Desligue o optimizador constante dobragem e executar a função de:

 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

Permitir que a dobragem optimizador constante e executar de novo a função de observar um aumento de velocidade em função de execução.

 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

Depuração extractor optimizador

Considere uma função simples que verifica o valor numérico de seu argumento de entrada e devolve-lo.

 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
 

Em primeiro lugar, executar a função com o otimizador de depuração de stripper desligado.

 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 gera um erro de argumento inválido por causa da Inf argumento para test_func .

Ativar a stripper otimizador de depuração e executar a função novamente.

 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)
 

O optimizador de depuração de stripper retira o tf.debug.check_numerics nó a partir do gráfico e executa a função sem levantar quaisquer erros.

Resumo

O tempo de execução TensorFlow usa Grappler a gráficos Otimizar automaticamente antes da execução. Use tf.config.optimizer.set_experimental_options para ativar ou desativar os vários otimizadores gráfico.

Para mais informações sobre Grappler, consulte TensorFlow Gráfico otimizações .