Path: blob/master/site/pt-br/guide/graph_optimization.ipynb
25115 views
Copyright 2020 The TensorFlow Authors.
Otimização de grafo do TensorFlow com o Grappler
Visão geral
O TensorFlow usa execuções no modo grafo e adiantado (eager) para fazer as computações. Um tf.Graph
contém um conjunto de objetos tf.Operation
(operações), que representam unidades de computação, e objetos tf.Tensor
, que representam as unidades de dados que fluem entre as operações.
O Grappler é o sistema padrão de otimização de grafo do runtime do TensorFlow e aplica otimizações no modo grafo (dentro de tf.function
) para aumentar o desempenho das computações do TensorFlow por meio de simplificações do grafo e outras otimizações de alto nível, como embutir o corpo de funções para ativar otimizações interprocedurais. Otimizar o tf.Graph
também reduz o pico de uso de memória e melhora a utilização do hardware ao otimizar o mapeamento dos nós do grafo para os recursos computacionais.
Use tf.config.optimizer.set_experimental_options()
para ter um controle mais granular das otimizações do tf.Graph
.
Otimizadores de grafo disponíveis
O Grappler faz as otimizações de grafo por meio de um driver chamado MetaOptimizer
. Os otimizadores de grafo abaixo estão disponíveis no TensorFlow:
Otimizador com constant folding – infere estatisticamente o valor dos tensores quando possível fazendo o folding de nós constantes no grafo e materializa o resultado usando constantes.
Otimizador aritmético – simplifica as operações aritméticas eliminando subexpressões comuns e simplificando declarações aritméticas.
Otimizador de layout – otimiza layouts de tensores para executar operações que dependem do formato dos dados, como convoluções, de maneira mais eficaz.
Otimizador de remapeamento – remapeia subgrafos para implementações mais eficientes por meio da substituição de subgrafos com ocorrência comum por kernels monolíticos combinados e otimizados.
Otimizador de memória – analisa o grafo para avaliar o pico de uso de memória de cada operação e insere as operações de cópia de memória CPU-GPU para trocar memória de GPU por CPU a fim de reduzir o pico de uso de memória.
Otimizador de dependência – remove ou reorganiza as dependências de controle para encurtar o caminho crítico de um passo do modelo ou permitir outras otimizações. Além disso, remove nós que não são realmente operações, como Identity.
Otimizador de pruning – remove do grafo nós que não têm efeito na saída. Geralmente, é executado primeiro para reduzir o tamanho do grafo e acelerar o processamento de outros passos do Grappler.
Otimizador de função – otimiza a biblioteca de funções de um programa do TensorFlow e o embute corpo de funções para ativar outras otimizações interprocedurais.
Otimizador de formato – otimiza subgrafos que operam o formato e informações relacionadas ao formato.
Otimizador de autoparalelização – paraleliza automaticamente os grafos por meio da divisão na dimensão de lote. Esse otimizador é desativado por padrão.
Otimizador de loop – otimiza o fluxo de controle do grafo retirando dos loops os subgrafos que não variam nos loops e removendo operações de pilhas redundantes. Além disso, otimiza loops com contagens de execução conhecidas estatisticamente e remove ramificações mortas conhecidas estatisticamente em condicionais.
Otimizador de alocador com escopo – introduz alocadores com escopo para reduzir o movimento de dados e consolidar algumas operações.
Otimizador pin to host – troca pequenas operações para a CPU. Esse otimizador é desativado por padrão.
Otimizador de precisão mista automático – converte tipos de dados em float16 quando aplicável para melhorar o desempenho. Atualmente, aplica-se somente a GPUs.
Eliminador de depuração – elimina do grafo nós relacionados a operações de depuração, como
tf.debugging.Assert
,tf.debugging.check_numerics
etf.print
. Esse otimizador é desativado por padrão.
Configuração
Crie um gerenciador de contexto para ativar e desativar estados de otimizadores com facilidade.
Compare o desempenho da execução com e sem o Grappler
O TensorFlow 2 e posteriores fazer execução adiantada (eager) por padrão. Use tf.function
para mudar a execução padrão para o modo grafo. O Grappler executa automaticamente em segundo plano para aplicar as otimizações de grafo acima e melhorar o desempenho da execução.
Otimizador com constant folding
Vejamos um exemplo preliminar. Considere uma função que realize operações em constantes e retorne uma saída.
Desative o otimizador com constant folding e execute a função:
Ative o otimizador com constant folding e execute a função novamente. Observe a aceleração ao executar a função.
Otimizador de eliminação de depuração
Considere uma função simples que verifique o valor numérico de seu argumento de entrada e o retorne.
Primeiro, execute a função com o otimizador de eliminação de depuração desativado.
tf.debugging.check_numerics
gera um erro de argumento inválido por causa do argumento Inf
em test_func
.
Ative o otimizador de eliminação de depuração e execute a função novamente.
O otimizador de eliminação de depuração elimina o nó tf.debug.check_numerics
do grafo e executa a função sem gerar nenhum erro.
Resumo
O runtime do TensorFlow usa o Grappler para otimizar os grafos automaticamente antes da execução. Use tf.config.optimizer.set_experimental_options
para ativar ou desativar os diversos otimizadores de grafo.
Confira mais informações sobre o Grappler em Otimizações de grafo do TensorFlow.