Path: blob/master/site/pt-br/guide/migrate/migration_debugging.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Como depurar um pipeline de treinamento migrado do TensorFlow 2
Este notebook demonstra como depurar um pipeline de treinamento ao migrar para o TensorFlow 2 (TF2). É composto pelos seguintes componentes:
Etapas sugeridas e amostras de código para depurar o pipeline de treinamento
Ferramentas para depuração
Outros recursos relacionados
Uma suposição é que você tem o código do TensorFlow 1 (TF1.x) e modelos treinados para comparação e deseja criar um modelo TF2 que alcance uma exatidão de validação semelhante.
Este notebook NÃO cobre problemas de desempenho de depuração para velocidade de inferência/treinamento, ou uso de memória.
Workflow de depuração
Um workflow geral para depurar seus pipelines de treinamento TF2 está mostrado abaixo. Observe que você não precisa seguir essas etapas nessa ordem. Você também pode usar uma abordagem de pesquisa binária onde testa o modelo numa etapa intermediária e depois restringe o escopo da depuração.
Corrigir erros de compilação e de tempo de execução
Validação única de passo para a frente (num guia separado)
a. Num único dispositivo CPU
Verificar se as variáveis são criadas apenas uma vez
Verificar a correspondência de contagens, nomes e formas de variáveis
Reiniciar todas as variáveis, verificar a equivalência numérica com toda a aleatoriedade desativada
Alinhar a geração de números aleatórios, verificar a equivalência numérica na inferência
(Opcional) Verificar se os checkpoints estão carregados corretamente e os modelos TF1.x/TF2 geram saída idêntica
b. Num único dispositivo GPU/TPU
c. Com estratégias para múltiplos dispositivos
Validação de equivalência numérica de treinamento de modelos para alguns passos (exemplos de código disponíveis abaixo)
a. Validação de etapa de treinamento único usando dados pequenos e fixos num único dispositivo de CPU. Especificamente, verificar a equivalência numérica para os seguintes componentes
cálculo de perdas
métricas
taxa de aprendizagem
cálculo de gradiente e atualização
b. Verificar as estatísticas depois do treinamento de 3 ou mais passos para verificar os comportamentos do otimizador, como o momento, ainda com dados fixos num único dispositivo de CPU
c. Em um único dispositivo GPU/TPU
d. Com estratégias para múltiplos dispositivos (veja a introdução de MultiProcessRunner no final deste artigo)
Teste de convergência de ponta a ponta em dataset real
a. Verificar os comportamentos de treinamento com o TensorBoard
usar otimizadores simples, por exemplo, SGD e estratégias de distribuição simples, por exemplo,
tf.distribute.OneDeviceStrategy
primeirométricas de treinamento
métricas de avaliação
descobrir qual é a tolerância razoável para a aleatoriedade inerente
b. Verificar a equivalência com otimizador avançado/agendador de taxa de aprendizado/estratégias de distribuição
c. Verificar a equivalência ao usar precisão mista
Benchmarks de produto adicionais
Configuração
Validação única de passo para frente
A validação única de passo para frente, incluindo o carregamento do checkpoint, é abordada num colab diferente.
Validação de equivalência numérica de treinamento de modelos para alguns passos
Defina a configuração do modelo e prepare um dataset falso.
Defina o modelo TF1.x.
A seguinte classe v1.keras.utils.DeterministicRandomTestTool
fornece um gerenciador de contexto scope()
que pode fazer com que operações aleatórias stateful usem a mesma semente em ambos os grafos/sessões TF1 e execução antecipada (eager).
A ferramenta fornece dois modos de teste:
constant
que usa a mesma semente para cada operação, não importa quantas vezes tenha sido chamada e,num_random_ops
que usa o número de operações stateful aleatórias observadas anteriormente como a semente da operação.
Isto se aplica tanto às operações aleatórias stateful usadas para criar e inicializar variáveis quanto às operações aleatórias stateful usadas no cálculo (como para camadas de dropout).
Execute o modelo TF1.x no modo grafo. Colete estatísticas para as 3 primeiras etapas de treinamento para comparação de equivalência numérica.
Defina o modelo TF2.
Execute o modelo TF2 no modo eager. Colete estatísticas para as 3 primeiras etapas de treinamento para comparação de equivalência numérica.
Compare a equivalência numérica para os primeiros passos de treinamento.
Você também pode dar uma olhada no notebook Validando exatidão e equivalência numérica para conselhos adicionais sobre equivalência numérica.
Testes de unidade
Existem alguns tipos de teste de unidade que podem ajudar a depurar seu código de migração.
Validação única de passo para frente
Validação de equivalência numérica de treinamento de modelos para alguns passos
Benchmark de desempenho de inferência
O modelo treinado faz previsões corretas em pontos de dados fixos e simples
Você pode usar @parameterized.parameters
para testar modelos com diferentes configurações. Detalhes com amostra de código.
Veja que é possível executar APIs de sessão e execução antecipada (eager) no mesmo caso de teste. Os trechos de código abaixo mostram como.
Ferramentas de depuração
tf.print
tf.print vs print/logging.info
Com argumentos configuráveis,
tf.print
pode exibir recursivamente os primeiros e últimos elementos de cada dimensão para tensores impressos. Veja a Documentação da API para mais detalhes.Para execução antecipada (eager),
print
etf.print
imprimem o valor do tensor. Masprint
pode envolver a cópia do dispositivo para o host, o que poderá desacelerar seu código.Para o modo grafo, incluindo o uso dentro
tf.function
, você precisa usartf.print
para imprimir o valor real do tensor.tf.print
é compilado em um op no grafo, enquantoprint
elogging.info
registram apenas no tempo de rastreamento, o que geralmente não é o que você deseja.tf.print
também suporta a impressão de tensores compostos comotf.RaggedTensor
etf.sparse.SparseTensor
.Você também pode usar um callback para monitorar métricas e variáveis. Verifique como usar callbacks personalizados com logs dict e com o atributo self.model.
tf.print vs print dentro de tf.function
tf.distribute.Strategy
Se a
tf.function
contendotf.print
for executada nos workers, por exemplo, ao usarTPUStrategy
ouParameterServerStrategy
, será necessário verificar os logs do worker/servidor de parâmetros para encontrar os valores impressos.Para
print
oulogging.info
, os logs serão impressos no coordenador ao usarParameterServerStrategy
e os logs serão impressos no STDOUT em worker0 ao usar TPUs.
tf.keras.Model
Ao usar modelo das APIs Sequential e Functional, se você deseja imprimir valores, por exemplo, entradas de modelo ou características intermediárias após algumas camadas, você pode dispor das seguintes alternativas.
Escrever uma camada personalizada que use
tf.print
para imprimir as entradas.Incluir as saídas intermediárias que deseja inspecionar nas saídas do modelo.
As camadas
tf.keras.layers.Lambda
têm limitações de (des)serialização. Para evitar problemas de carregamento de checkpoint, escreva uma camada de personalizada numa subclasse. Veja a documentação da API para mais detalhes.Você não pode usar
tf.print
com saídas intermediárias em umtf.keras.callbacks.LambdaCallback
se não tiver acesso aos valores reais, mas apenas aos objetos simbólicos do tensor Keras.
Opção 1: escrever uma camada personalizada
Opção 2: incluir as saídas intermediárias que deseja inspecionar nas saídas do modelo.
Observe que, nesse caso, você poderá precisar de algumas personalizações para usar Model.fit
.
pdb
Você pode usar o pdb tanto no terminal como no Colab para inspecionar valores intermediários para depuração.
Visualização do grafo com o TensorBoard
Você pode examinar o grafo do TensorFlow com o TensorBoard. O TensorBoard também é suportado no colab. O TensorBoard é uma ótima ferramenta para visualizar resumos. Você pode usá-lo para comparar a taxa de aprendizado, pesos do modelo, escala de gradiente, métricas de treinamento/validação ou até mesmo modelar resultados intermediários entre o modelo TF1.x e o modelo TF2 migrado por meio do processo de treinamento e ver se os valores são os esperados.
TensorFlow Profiler
O TensorFlow Profiler pode ajudar você a visualizar a linha do tempo de execução em GPUs/TPUs. Veja o uso básico nesta demonstração do Colab.
MultiProcessRunner
O MultiProcessRunner é uma ferramenta útil ao depurar com MultiWorkerMirroredStrategy e ParameterServerStrategy. Você pode dar uma olhada neste exemplo concreto para ver como usar.
Especificamente, para essas duas estratégias, é recomendável 1) não depender apenas de testes de unidade para cobrir seu fluxo, 2) mas também tentar reproduzir falhas usando-o num teste de unidade para evitar que uma tarefa distribuída real seja executada toda vez que houver uma tentativa de consertar a falha.