Path: blob/master/site/pt-br/guide/estimator.ipynb
25115 views
Copyright 2019 The TensorFlow Authors.
Estimadores
Aviso: os Estimadores são recomendados para novos códigos. Os Estimadores executam código
v1.Session
, que é mais difícil de escrever corretamente e pode se comportar se forma inesperada, ainda mais quando usado em conjunto com código do TF 2. Os Estimators são abarcados pelas garantias de compatibilidade, mas não recebem mais correções, exceto para vulnerabilidades de segurança. Confira mais detalhes no guia de migração.
Este documento apresenta o tf.estimator
, uma API de alto nível do TensorFlow. Os Estimadores encapsulam as seguintes ações:
Treinamento
Avaliação
Previsão
Exportação para serviço
O TensorFlow implementa diversos Estimadores pré-criados. Ainda há suporte a Estimators personalizados, mas principalmente por questões de compatibilidade legada. Os Estimadores personalizados não devem ser usados para novos códigos. Todos os Estimadores, sejam pré-criados ou personalizados, são classes baseadas na classe tf.estimator.Estimator
.
Veja um exemplo rápido nos tutoriais sobre Estimadores. Confira uma visão geral do design da API neste artigo técnico.
Configuração
Vantagens
Similar a tf.keras.Model
, um estimator
é uma abstração de modelo. tf.estimator
conta com recursos ainda em desenvolvimento para tf.keras
, que são:
Treinamento baseado em servidor de parâmetros
Integração total com o TFX
Funcionalidades dos Estimadores
Os Estimadores proporcionam os seguintes benefícios:
É possível executar modelos baseados em Estimadores em um host local ou em um ambiente distribuído com vários servidores sem alterar seu modelo. Além disso, é possível executar modelos baseados em Estimadores em CPUs, GPUs ou TPUs sem alterar o código do seu modelo.
Os Estimadores oferecem um loop de treinamento distribuído seguro que controla como e quando:
Carregar dados
Tratar exceções
Criar arquivos de checkpoint e recuperar-se de falhas
Salvar resumos para o TensorBoard
Ao escrever uma aplicação com Estimadores, você precisa separar o pipeline de entrada de dados e o modelo. Essa separação simplifica os experimentos com datasets diferentes.
Uso de Estimadores pré-criados
Com os Estimadores pré-criados, você pode trabalhar em um nível conceitual muito maior do que ao trabalhar com as APIs base do TensorFlow. Você não precisa mais se preocupar com a criação do grafo computacional ou de sessões, pois os Estimadores tratam esses detalhes internos para você. Além disso, com os Estimadores pré-criados, você pode usar diferentes arquiteturas de modelo fazendo apenas mudanças mínimas no código. Por exemplo, tf.estimator.DNNClassifier
é uma classe de Estimador pré-criada que treina modelos de classificação baseados em redes neurais densas com alimentação para frente.
Tipicamente, um programa do TensorFlow que use um Estimador pré-criado consiste das quatro etapas abaixo:
1. Escreva funções de entrada
Por exemplo, você poderia criar uma função para importar o conjunto de treinamento e outra para importar o conjunto de teste. Os Estimadores esperam que suas entradas sejam formatadas como um par de objetos:
Um dicionário, em que as chaves são os nomes das características, e os valores são os tensores (SparseTensors) que contêm os dados de características correspondentes
Um Tensor contendo um ou mais rótulos
input_fn
deve retornar um tf.data.Dataset
que gere pares nesse formato.
Por exemplo, o código abaixo cria um tf.data.Dataset
a partir do arquivo train.csv
do dataset Titanic:
input_fn
é executado em um tf.Graph
e também pode retornar tiretamente um par (features_dics, labels)
contendo tensores do grafo, mas isso está propenso a erros, exceto em casos simples, como retornar constantes.
2. Defina as colunas de características
Cada tf.feature_column
identifica um nome de característica, seu tipo e qualquer pré-processamento da entrada.
Por exemplo, o trecho de código abaixo cria três colunas de características:
A primeira usa a característica
age
(idade) diretamente como uma entrada de ponto flutuante.A segunda usa a característica
class
(classe) como uma entrada de categoria.A terceira usa a característica
embark_town
(cidade de embarque) como uma entrada de categoria, mas utilizahashing trick
para evitar a necessidade de enumerar as opções e para definir o número de opções.
Confira mais informações no tutorial sobre colunas de características.
3. Instancie o Estimador pré-criado relevante
Por exemplo, veja a instanciação de uma amostra de um Estimador pré-criado chamado LinearClassifier
:
Confira mais informações no tutorial sobre classificadores lineares.
4. Chame um método de treinamento, avaliação ou inferência
Todos os Estimadores contam com os métodos train
, evaluate
e predict
.
Benefícios dos Estimadores pré-criados
Os Estimadores pré-criados seguem as práticas recomendadas, proporcionando os seguintes benefícios:
Práticas recomendadas para determinar onde as diferentes partes do grafo computacional devem ser executadas, implementando estratégias em uma única máquina ou em um cluster.
Práticas recomendadas para gravação de eventos (resumos) e resumos úteis universalmente.
Se você não utilizar Estimadores pré-criados, precisa implementar os recursos acima por conta própria.
Estimadores personalizados
O núcleo de todo Estimador, seja pré-criado ou personalizado, é sua função do modelo, model_fn
, um método que cria grafos para treinamento, avaliação e previsão. Quando você utiliza um Estimador pré-criado, outra pessoa já implementou a função do modelo. Ao usar um Estimador personalizado, você precisa escrever a função do modelo por conta própria.
Observação: uma
model_fn
personalizada ainda será executada no modo grafo do 1.x. Portanto, não há execução adiantada (eager) e dependências de controle automático. Você deve planejar a migração dotf.estimator
commodel_fn
personalizada. As APIs alternativas sãotf.keras
etf.distribute
. Se você ainda precisar de umEstimator
para alguma parte do treinamento, pode usar o conversortf.keras.estimator.model_to_estimator
para criar umEstimator
usando umkeras.Model
.
Crie um Estimador usando um modelo do Keras
É possível converter modelos existentes do Keras para Estimadores usando tf.keras.estimator.model_to_estimator
, o que é útil se você quiser modernizar o código do seu modelo, mas o seu pipeline de treinamento ainda precisar de Estimadores.
Instancie um modelo do Keras MobileNet V2 e compile-o com o otimizador, a perda e as métricas para o treinamento:
Crie um Estimator
usando o modelo do Keras compilado. O estado inicial do modelo do Keras é preservado no Estimator
criado:
Use o Estimator
derivado da mesma forma que usaria qualquer outro Estimator
.
Para treinar, chame a função train do Estimador:
De maneira similar, para avaliar, chame a função evaluate do Estimador:
Confira mais detalhes na documentação de tf.keras.estimator.model_to_estimator
.
Como salvar checkpoints baseados em objetos com o Estimador
Por padrão, os Estimadores salvam checkpoints com nomes de variáveis em vez do grafo de objetos descrito no guia de checkpoints. tf.train.Checkpoint
lê checkpoints baseados em nomes, mas os nomes das variáveis podem mudar quando partes de um modelo são levados para fora da model_fn
do Estimador. Por questões de compatibilidade futura, salvar checkpoints baseados em objetos facilita o treinamento de um modelo dentro de um Estimador e seu uso fora do Estimador.
Depois, tf.train.Checkpoint
pode carregar os checkpoints a partir de seu diretório model_dir
.
SavedModels de Estimadores
Os Estimadores exportam SavedModels por meio de tf.Estimator.export_saved_model
.
Para salvar um Estimator
, você precisa criar um serving_input_receiver
. Essa função cria uma parte de um tf.Graph
que processa os dados brutos recebidos pelo SavedModel.
O módulo tf.estimator.export
contém funções para ajudar a criar esses receivers
(receptores).
O código abaixo cria um receptor baseado nas feature_columns
(colunas de características) que aceita buffers de protocolo tf.Example
serializados, que costumam ser usados com tf-serving.
Também é possível carregar e executar esse modelo pelo Python:
tf.estimator.export.build_raw_serving_input_receiver_fn
permite criar funções de entrada que recebam tensores brutos em vez de tf.train.Example
s.
Uso de tf.distribute.Strategy
com o Estimador (suporte limitado)
tf.estimator
é uma API do TensorFlow para treinamento distribuído que, originalmente, tinha suporte à estratégia de servidor de parâmetros assíncrono. Agora, tf.estimator
tem suporte a tf.distribute.Strategy
. Se você estiver usando tf.estimator
, pode alterar para treinamento distribuído com pouquíssimas alterações do código. Dessa forma, agora os usuários do Estimador podem fazer treinamento distribuído síncrono em diversas GPUs e diversos workers, além de usar TPUs. Entretanto, esse suporte no Estimador é limitado. Confira mais informações na seção O que tem suporte atualmente abaixo.
Usar tf.distribute.Strategy
com o Estimador é um pouco diferente no caso do Keras. Em vez de usar strategy.scope
, agora você passa o objeto de estratégia para o RunConfig
referente ao Estimador.
Confira mais informações no guia sobre treinamento distribuído.
Veja abaixo um trecho de código que mostra esse caso com um Estimador pré-criado LinearRegressor
e a estratégia MirroredStrategy
:
Aqui, utilizamos um Estimador pré-criado, mas o mesmo código também funciona com um Estimador personalizado. train_distribute
determina como o treinamento será distribuído, e eval_distribute
determina como a avaliação será distribuída. Essa é outra diferença do Keras ao usar a mesma estratégia para treinamento e avaliação.
Agora, você pode treinar e avaliar esse Estimador com uma função de entrada:
Outra diferença que devemos destacar entre o Estimador e o Keras é o tratamento da entrada. No Keras, cada lote do dataset é dividido automaticamente nas diversas réplicas. Entretanto, no Estimador, você não faz a divisão automática em lotes nem fragmenta automaticamente os dados em diferentes workers. Você tem controle total de como deseja que os dados sejam distribuídos nos workers e dispositivos e precisa fornecer uma input_fn
para especificar como os dados devem ser distribuídos.
A input_fn
é chamada uma vez por worker e, portanto, envia um dataset para cada worker. Então, um lote desse dataset é alimentado em uma réplica nesse worker, consumindo N lotes para N réplicas nesse único worker. Em outras palavras, o dataset retornado por input_fn
deve fornecer lotes de tamanho PER_REPLICA_BATCH_SIZE
, e o tamanho global de lote para um passo pode ser obtido por PER_REPLICA_BATCH_SIZE * strategy.num_replicas_in_sync
.
Ao fazer um treinamento multiworker, você precisa dividir os dados entre os workers ou misturar com uma semente aleatória em cada um deles. Confira um exemplo de como fazer isso no tutorial Treinamento multiworker com Estimador.
De maneira similar, você também pode usar as estratégias de multiworker e de servidor de parâmetros. O código permanece o mesmo, mas você precisa usar tf.estimator.train_and_evaluate
e definir as variáveis de ambiente TF_CONFIG
para cada binário sendo executado no seu cluster.
O que tem suporte atualmente?
Há suporte limitado para treinamento com Estimador usando todas as estratégias, exceto TPUStrategy
. Treinamentos e avaliações básicos deverão funcionar, mas diversos recursos avançados, como v1.train.Scaffold
, não deverão funcionar. Também pode haver diversos bugs nessa integração, e não há planos para melhorar o suporte (o foco está no suporte ao Keras e ao loop de treinamento personalizado). Se possível, prefira usar tf.distribute
com essas APIs.
API de treinamento | MirroredStrategy | TPUStrategy | MultiWorkerMirroredStrategy | CentralStorageStrategy | ParameterServerStrategy |
---|---|---|---|---|---|
API do Estimador | Suporte limitado | Sem suporte | Suporte limitado | Suporte limitado | Suporte limitado |
Exemplos e tutoriais
Veja alguns exemplos do começo ao fim que mostram como usar as diversas estratégias com o Estimador:
O tutorial Treinamento multiworker com Estimador mostra como treinar com vários workers usando
MultiWorkerMirroredStrategy
no dataset MNIST.Um exemplo completo de treinamento multiworker com estratégias distribuídas em
tensorflow/ecosystem
usando modelos de Kubernetes. O exemplo começa com um modelo do Keras, que é convertido em um Estimador usando a APItf.keras.estimator.model_to_estimator
O modelo oficial ResNet50, que pode ser treinado usando
MirroredStrategy
ouMultiWorkerMirroredStrategy
.