Path: blob/master/site/pt-br/guide/migrate/saved_model.ipynb
25118 views
Copyright 2021 The TensorFlow Authors.
Migração do fluxo de trabalho SavedModel
Depois de migrar seu modelo dos grafos e sessões do TensorFlow 1 para APIs do TensorFlow 2, como tf.function
, tf.Module
e tf.keras.Model
, você poderá migrar o código de salvamento e carregamento do modelo. Este notebook fornece exemplos de como você pode salvar e carregar o formato SavedModel no TensorFlow 1 e TensorFlow 2. Aqui está uma rápida visão geral das alterações de API relacionadas para migração do TensorFlow 1 para o TensorFlow 2:
| TensorFlow 1 | Migração para o TensorFlow 2 --- | --- | --- Salvando | tf.compat.v1.saved_model.Builder
tf.compat.v1.saved_model.simple_save
| tf.saved_model.save
Keras: tf.keras.models.save_model
Carregando | tf.compat.v1.saved_model.load
| tf.saved_model.load
Keras: tf.keras.models.load_model
Assinaturas: um conjunto de entradas
e tensores de saída que
podem ser usados para executar o
| Gerado usando os utilitários *.signature_def
(por exemplo, tf.compat.v1.saved_model.predict_signature_def
) | Escreva uma tf.function
e exporte-a usando o argumento signatures
em tf.saved_model.save
. Classificação
e regressão:
tipos especiais de assinaturas | Gerado com
tf.compat.v1.saved_model.classification_signature_def
,
tf.compat.v1.saved_model.regression_signature_def
,
e determinadas exportações do Estimator. | Esses dois tipos de assinatura foram removidos do TensorFlow 2.
Se a biblioteca de serviço exigir esses nomes de métodos,
tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater
.
Para uma explicação mais detalhada do mapeamento, consulte a seção Mudanças do TensorFlow 1 para o TensorFlow 2 abaixo.
Configuração
Os exemplos abaixo mostram como exportar e carregar o mesmo modelo fictício do TensorFlow (definido como add_two
abaixo) para um formato SavedModel usando as APIs TensorFlow 1 e TensorFlow 2. Comece configurando as importações e funções utilitárias:
TensorFlow 1: salve e exporte um SavedModel
No TensorFlow 1, você usa as APIs tf.compat.v1.saved_model.Builder
, tf.compat.v1.saved_model.simple_save
e tf.estimator.Estimator.export_saved_model
para criar, salvar e exportar o grafo e a sessão do TensorFlow:
1. Salve o gráfico como SavedModel com SavedModelBuilder
2. Crie um SavedModel para servir
3. Exporte o grafo de inferência do Estimador como um SavedModel
Na definição do Estimador model_fn
(definido abaixo), você pode definir assinaturas em seu modelo retornando export_outputs
em tf.estimator.EstimatorSpec
. Existem diferentes tipos de saídas:
tf.estimator.export.ClassificationOutput
tf.estimator.export.RegressionOutput
tf.estimator.export.PredictOutput
Eles produzirão tipos de assinatura para classificação, regressão e previsão, respectivamente.
Quando o estimador for exportado com tf.estimator.Estimator.export_saved_model
, essas assinaturas serão salvas com o modelo.
TensorFlow 2: salve e exporte um SavedModel
Salve e exporte um SavedModel definido com tf.Module
Para exportar seu modelo no TensorFlow 2, você deve definir um tf.Module
ou um tf.keras.Model
para armazenar todas as variáveis e funções do seu modelo. Então, você pode chamar tf.saved_model.save
para criar um SavedModel. Consulte a seção Salvando um modelo personalizado no guia Usando o formato SavedModel para saber mais.
Salve e exporte um SavedModel definido com Keras
Obsoleto: para objetos do Keras, recomenda-se usar o novo formato de alto nível .keras
e tf.keras.Model.export
, conforme demonstrado neste guia. O formato de baixo nível SavedModel continua com suporte para códigos existentes.
As APIs Keras para salvar e exportar — Model.save
ou tf.keras.models.save_model
— podem exportar um SavedModel de um tf.keras.Model
. Confira Salvando e carregando modelos Keras para obter mais detalhes.
Carregando um SavedModel
Um SavedModel salvo com qualquer uma das APIs acima pode ser carregado usando as APIs TensorFlow 1 ou TensorFlow 2.
Um SavedModel do TensorFlow 1 geralmente pode ser usado para inferência quando carregado no TensorFlow 2, mas o treinamento (geração de gradientes) só é possível se o SavedModel contiver variáveis de características. Você pode verificar o dtype das variáveis - se a variável dtype contiver "_ref", então é uma variável de referência.
Um SavedModel do TensorFlow 2 pode ser carregado e executado a partir do TensorFlow 1, desde que o SavedModel seja salvo com assinaturas.
As seções abaixo contêm exemplos de código que mostram como carregar os SavedModels salvos nas seções anteriores e chamar a assinatura exportada.
TensorFlow 1: Carregando um SavedModel com tf.saved_model.load
No TensorFlow 1, você pode importar um SavedModel diretamente para o grafo e sessão atuais usando tf.saved_model.load
. Você pode chamar Session.run
nos nomes de entrada e saída do tensor:
TensorFlow 2: Carregando um modelo salvo com tf.saved_model
No TensorFlow 2, os objetos são carregados em um objeto Python que armazena as variáveis e funções. Isso é compatível com modelos salvos no TensorFlow 1.
Confira os documentos da API tf.saved_model.load
e a seção Carregando e usando um modelo personalizado no guia Usando o formato SavedModel para mais detalhes.
Os modelos salvos com a API do TensorFlow 2 também podem acessar objetos tf.function
e variáveis anexadas ao modelo (em vez daquelas exportadas como assinaturas). Por exemplo:
TensorFlow 2: Carregando um modelo salvo com Keras
Obsoleto: para objetos do Keras, recomenda-se usar o novo formato de alto nível .keras
e tf.keras.Model.export
, conforme demonstrado neste guia. O formato de baixo nível SavedModel continua com suporte para códigos existentes.
A API de carregamento do Keras tf.keras.models.load_model
- permite recarregar um modelo salvo de volta num objeto Keras Model. Observe que isto só permite carregar SavedModels salvos com Keras (Model.save
ou tf.keras.models.save_model
).
Os modelos salvos com tf.saved_model.save
devem ser carregados com tf.saved_model.load
. Você pode carregar um modelo Keras salvo com Model.save
usando tf.saved_model.load
, mas obterá apenas o grafo do TensorFlow. Consulte a documentação da API tf.keras.models.load_model
e o guia Salvando e carregando modelos Keras para mais detalhes.
GraphDef e MetaGraphDef
<a name="graphdef_and_metagraphdef">
Não existe uma maneira simples de carregar um GraphDef
ou MetaGraphDef
bruto no TF2. No entanto, você pode converter o código TF1 que importa o grafo numa concrete_function
do TF2 usandov1.wrap_function
.
Primeiro, salve um MetaGraphDef:
Usando APIs do TF1, você pode usar tf1.train.import_meta_graph
para importar o grafo e restaurar os valores:
Não há APIs do TF2 para carregar o grafo, mas você ainda pode importá-lo para uma função concreta que pode ser executada no modo eager:
Mudanças do TensorFlow 1 para o TensorFlow 2
<a id="changes_from_tf1_to_tf2">
Esta seção lista os principais termos de salvamento e carregamento do TensorFlow 1, seus equivalentes do TensorFlow 2 e o que mudou.
SavedModel
SavedModel é um formato que armazena um programa TensorFlow completo com seus parâmetros e computação. Ele contém assinaturas usadas pelas plataformas de serviço para executar o modelo.
O formato do arquivo em si não mudou significativamente, portanto, SavedModels podem ser carregados e servidos usando APIs TensorFlow 1 ou TensorFlow 2.
Diferenças entre TensorFlow 1 e TensorFlow 2
Os casos de uso serviço (serving) e inferência (inference) não foram atualizados no TensorFlow 2, além das alterações na API – a melhoria foi introduzida na capacidade de reutilizar e compor modelos carregados de SavedModel.
No TensorFlow 2, o programa é representado por objetos como tf.Variable
, tf.Module
ou modelos Keras de nível superior (tf.keras.Model
) e camadas (tf.keras.layers
). Não há mais variáveis globais que tenham valores armazenados numa sessão, e o grafo agora existe em diferentes objetos tf.function
. Conseqüentemente, durante uma exportação de modelo, SavedModel salva cada componente e grafo de função separadamente.
Ao escrever um programa do TensorFlow com as APIs Python do TensorFlow, você deve criar um objeto para gerenciar as variáveis, funções e outros recursos. Geralmente, isso é feito usando as APIs Keras, mas você também pode construir o objeto criando um tf.Module
ou uma subclasse dele.
Os modelos Keras (tf.keras.Model
) e tf.Module
rastreiam automaticamente variáveis e funções anexadas a eles. SavedModel salva essas conexões entre módulos, variáveis e funções, para que possam ser restauradas durante o carregamento.
Assinaturas
As assinaturas são os endpoints de um SavedModel – elas informam ao usuário como executar o modelo e quais entradas são necessárias.
No TensorFlow 1, as assinaturas são criadas listando os tensores de entrada e saída. No TensorFlow 2, as assinaturas são geradas pela passagem de funções concretas. (Leia mais sobre as funções do TensorFlow no guia Introdução a grafos e tf.function, particularmente na seção Polimorfismo: uma função, muitos grafos.) Resumindo, uma função concreta é gerada a partir de um tf.function
:
Session.run
No TensorFlow 1, você poderia chamar Session.run
com o grafo importado, desde que já conhecesse os nomes dos tensores. Isto permite recuperar os valores de variáveis restaurados ou executar partes do modelo que não foram exportadas nas assinaturas.
No TensorFlow 2, você pode acessar uma variável diretamente, como uma matriz de pesos (kernel
):
ou chamar tf.functions
anexadas ao objeto de modelo: por exemplo, loaded.__call__
.
Diferentemente do TF1, não há como extrair partes de uma função e acessar valores intermediários. Você precisa exportar todas as funcionalidades necessárias no objeto salvo.
Notas de migração do TensorFlow Serving
O SavedModel foi originalmente criado para funcionar com o TensorFlow Serving. Esta plataforma oferece diferentes tipos de solicitações de previsão: classificar (classify), regredir (regress) e prever (predict).
A API TensorFlow 1 permite criar estes tipos de assinaturas com os utilitários a seguir:
tf.compat.v1.saved_model.classification_signature_def
tf.compat.v1.saved_model.regression_signature_def
tf.compat.v1.saved_model.predict_signature_def
A classificação (classification_signature_def
) e a regressão (regression_signature_def
) restringem as entradas e saídas, portanto as entradas devem ser tf.Example
e as saídas devem ser classes
, scores
ou prediction
. Enquanto isso, a assinatura de previsão (predict_signature_def
) não tem restrições.
SavedModels exportados com a API TensorFlow 2 são compatíveis com TensorFlow Serving, mas conterão apenas assinaturas de previsão. As assinaturas de classificação e regressão foram removidas.
Se precisar do uso das assinaturas de classificação e regressão, você poderá modificar o SavedModel exportado usando tf.compat.v1.saved_model.signature_def_utils.MethodNameUpdater
.
Próximos passos
Para saber mais sobre SavedModels no TensorFlow 2, confira os seguintes guias:
Salvamento e carga de modelos Keras
Se você estiver usando o TensorFlow Hub, estes guias poderão ser úteis: