Desenvolvimento

16 mar, 2017

Depurando modelos TensorFlow com tfdbg

Publicidade

Artigo de Shanqing Cai, publicado originalmente pelo Google Developers Blog. A tradução foi feita pela Redação iMasters com autorização.

***

Estamos entusiasmados em compartilhar o TensorFlow Debugger (tfdbg), uma ferramenta que facilita a depuração de modelos de aprendizado de máquina (ML) em TensorFlow.

TensorFlow, biblioteca ML de código aberto do Google, é baseado em gráficos de fluxo de dados. Um programa TensorFlow ML típico consiste em dois estágios separados:

  1. Configurando o modelo ML como um gráfico de fluxo de dados usando a API Python da biblioteca,
  2. Treinando ou executando inferência no gráfico usando o método Session.run().

Se ocorrerem erros e bugs durante o segundo estágio (ou seja, o tempo de execução TensorFlow), eles são difíceis de depurar.

Para entender por que esse é o caso, observe que para os depuradores padrão do Python, a chamada Session.run() é efetivamente uma única instrução e não expõe a estrutura interna do gráfico em execução (nodes e suas conexões) e estado (arrays de saída ou tensores dos nodes). Depuradores de nível inferior, como gdb, não podem organizar quadros de pilha e valores de variáveis de uma forma relevante para operações de gráfico TensorFlow. Um depurador de tempo de execução especializado esteve entre as solicitações de recurso mais frequentemente levantadas pelos usuários TensorFlow.

tfdbg responde a essa necessidade de depuração de tempo de execução. Vejamos tfdbg em ação com um pequeno snippet de código que configura e executa um gráfico TensorFlow simples para encaixar uma equação linear simples através da descida de gradiente.

import numpy as np
import tensorflow as tf
import tensorflow.python.debug as tf_debug
xs = np.linspace(-0.5, 0.49, 100)
x = tf.placeholder(tf.float32, shape=[None], name="x")
y = tf.placeholder(tf.float32, shape=[None], name="y")
k = tf.Variable([0.0], name="k")
y_hat = tf.multiply(k, x, name="y_hat")
sse = tf.reduce_sum((y - y_hat) * (y - y_hat), name="sse")
train_op = tf.train.GradientDescentOptimizer(learning_rate=0.02).minimize(sse)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

sess = tf_debug.LocalCLIDebugWrapperSession(sess)
for _ in range(10):
  sess.run(train_op, feed_dict={x: xs, y: 42 * xs})

Como a linha em destaque nesse exemplo mostra, o objeto de sessão está envolto como uma classe para depuração (LocalCLIDebugWrapperSession), portanto, chamar do método run() iniciará a interface de linha de comando (CLI) do tfdbg. Usando cliques do mouse ou comandos, você pode prosseguir com as chamadas de execução sucessivas, inspecionar os nodes do gráfico e seus atributos, visualizar o histórico completo da execução de todos os nodes relevantes no gráfico através da lista de tensores intermediários. Usando o comando invoke_stepper, você pode deixar a chamada Session.run() rodar no “modo stepper”, no qual você pode passar para os nodes de sua escolha, observar e modificar suas saídas, seguidas por outras ações passo a passo, de uma forma análoga a depurar linguagens processuais (por exemplo, em gdb ou pdb).

Uma classe de problemas frequentemente encontrados no desenvolvimento de modelos TensorFlow ML é o aparecimento de valores numéricos ruins (infinities e NaNs) devido ao excesso, divisão por zero, log de zero etc. Em grandes gráficos TensorFlow, encontrar a fonte de tais nodes pode ser tedioso e demorado. Com a ajuda da CLI tfdbg e seu suporte de ponto de interrupção condicional, você pode identificar rapidamente o node culpado. O vídeo abaixo demonstra como depurar problemas de infinidade/NaN em uma rede neural com tfdbg:

Um screencast do TensorFlow Debugger em ação, a partir deste texto.

Comparado com opções de depuração alternativas, como Print Ops, tfdbg requer menos linhas de alteração de código, fornece uma cobertura mais abrangente dos gráficos e oferece uma experiência de depuração mais interativa. Ele acelerará o desenvolvimento de modelos e os fluxos de trabalho de depuração. Ele oferece recursos adicionais, como depuração offline de tensores descartados de ambientes de servidor e integração com tf.contrib.learn. Para começar, visite esta documentação. Este trabalho de pesquisa apresenta o projeto de tfdbg em maior detalhe.

A versão TensorFlow mínima requerida para tfdbg é 0.12.1. Para relatar bugs, apresente os problemas na  TensorFlow’s GitHub Issues Page/Página de Problemas do GitHub do TensorFlow. Para obter ajuda de uso geral, publique perguntas no StackOverflow usando a tag tensorflow.

Agradecimentos

Este projeto não seria possível sem a ajuda e o feedback dos membros da Equipe do Google TensorFlow Core/API e do Applied Machine Intelligence Team.

***

Este artigo é do Google Developers Blog. Ele foi escrito por Shanqing Cai. A tradução foi feita pela Redação iMasters com autorização. Você pode acessar o original em: https://developers.googleblog.com/2017/02/debug-tensorflow-models-with-tfdbg.html.