Veja no TensorFlow.org | Executar no Google Colab | Ver fonte no GitHub | Baixar caderno |
Depois de migrar seu modelo dos gráficos e sessões do TensorFlow 1 para as 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 salvar e carregar no formato SavedModel no TensorFlow 1 e no TensorFlow 2. Aqui está uma visão geral rápida 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 pode ser usado para executar o | Gerado usando os *.signature_def (por exemplo tf.compat.v1.saved_model.predict_signature_def ) | Escreva um tf.function e exporte-o usando o argumento signatures em tf.saved_model.save . |
Classificação e regressão : tipos especiais de assinaturas | Gerado comtf.compat.v1.saved_model.classification_signature_def ,tf.compat.v1.saved_model.regression_signature_def ,e certas 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 obter uma explicação mais detalhada do mapeamento, consulte a seção Alterações do TensorFlow 1 para o TensorFlow 2 abaixo.
Configurar
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 funções de importação e utilitário:
import tensorflow as tf
import tensorflow.compat.v1 as tf1
import shutil
def remove_dir(path):
try:
shutil.rmtree(path)
except:
pass
def add_two(input):
return input + 2
TensorFlow 1: salvar e exportar um SavedModel
No TensorFlow 1, você usa as 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 gráfico e a sessão do TensorFlow:
1. Salve o gráfico como um SavedModel com SavedModelBuilder
remove_dir("saved-model-builder")
with tf.Graph().as_default() as g:
with tf1.Session() as sess:
input = tf1.placeholder(tf.float32, shape=[])
output = add_two(input)
print("add two output: ", sess.run(output, {input: 3.}))
# Save with SavedModelBuilder
builder = tf1.saved_model.Builder('saved-model-builder')
sig_def = tf1.saved_model.predict_signature_def(
inputs={'input': input},
outputs={'output': output})
builder.add_meta_graph_and_variables(
sess, tags=["serve"], signature_def_map={
tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: sig_def
})
builder.save()
add two output: 5.0 WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/saved_model/signature_def_utils_impl.py:208: build_tensor_info (from tensorflow.python.saved_model.utils_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.utils.build_tensor_info or tf.compat.v1.saved_model.build_tensor_info. INFO:tensorflow:No assets to save. INFO:tensorflow:No assets to write. INFO:tensorflow:SavedModel written to: saved-model-builder/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
--signature_def serving_default --input_exprs input=10
Traceback (most recent call last): File "/tmpfs/src/tf_docs_env/bin/saved_model_cli", line 8, in <module> sys.exit(main()) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 1211, in main args.func(args) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 769, in run init_tpu=args.init_tpu, tf_debug=args.tf_debug) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py", line 417, in run_saved_model_with_feed_dict tag_set) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 117, in get_meta_graph_def saved_model = read_saved_model(saved_model_dir) File "/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_utils.py", line 55, in read_saved_model raise IOError("SavedModel file does not exist at: %s" % saved_model_dir) OSError: SavedModel file does not exist at: simple-save
2. Crie um SavedModel para veiculação
remove_dir("simple-save")
with tf.Graph().as_default() as g:
with tf1.Session() as sess:
input = tf1.placeholder(tf.float32, shape=[])
output = add_two(input)
print("add_two output: ", sess.run(output, {input: 3.}))
tf1.saved_model.simple_save(
sess, 'simple-save',
inputs={'input': input},
outputs={'output': output})
add_two output: 5.0 WARNING:tensorflow:From /tmp/ipykernel_26511/250978412.py:12: simple_save (from tensorflow.python.saved_model.simple_save) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.simple_save. INFO:tensorflow:Assets added to graph. INFO:tensorflow:No assets to write. INFO:tensorflow:SavedModel written to: simple-save/saved_model.pb
!saved_model_cli run --dir simple-save --tag_set serve \
--signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Saver not created because there are no variables in the graph to restore INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored. Result for output key output: 12.0
3. Exporte o gráfico de inferência do Estimator como um SavedModel
Na definição do Estimator model_fn
(definido abaixo), você pode definir assinaturas em seu modelo retornando export_outputs
no tf.estimator.EstimatorSpec
. Existem diferentes tipos de saídas:
-
tf.estimator.export.ClassificationOutput
-
tf.estimator.export.RegressionOutput
-
tf.estimator.export.PredictOutput
Isso produzirá tipos de assinatura de 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.
def model_fn(features, labels, mode):
output = add_two(features['input'])
step = tf1.train.get_global_step()
return tf.estimator.EstimatorSpec(
mode,
predictions=output,
train_op=step.assign_add(1),
loss=tf.constant(0.),
export_outputs={
tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: \
tf.estimator.export.PredictOutput({'output': output})})
est = tf.estimator.Estimator(model_fn, 'estimator-checkpoints')
# Train for one step to create a checkpoint.
def train_fn():
return tf.data.Dataset.from_tensors({'input': 3.})
est.train(train_fn, steps=1)
# This utility function `build_raw_serving_input_receiver_fn` takes in raw
# tensor features and builds an "input serving receiver function", which
# creates placeholder inputs to the model.
serving_input_fn = tf.estimator.export.build_raw_serving_input_receiver_fn(
{'input': tf.constant(3.)}) # Pass in a dummy input batch.
estimator_path = est.export_saved_model('exported-estimator', serving_input_fn)
# Estimator's export_saved_model creates a time stamped directory. Move this
# to a set path so it can be inspected with `saved_model_cli` in the cell below.
!rm -rf estimator-model
import shutil
shutil.move(estimator_path, 'estimator-model')
INFO:tensorflow:Using default config. INFO:tensorflow:Using config: {'_model_dir': 'estimator-checkpoints', '_tf_random_seed': None, '_save_summary_steps': 100, '_save_checkpoints_steps': None, '_save_checkpoints_secs': 600, '_session_config': allow_soft_placement: true graph_options { rewrite_options { meta_optimizer_iterations: ONE } } , '_keep_checkpoint_max': 5, '_keep_checkpoint_every_n_hours': 10000, '_log_step_count_steps': 100, '_train_distribute': None, '_device_fn': None, '_protocol': None, '_eval_distribute': None, '_experimental_distribute': None, '_experimental_max_worker_delay_secs': None, '_session_creation_timeout_secs': 7200, '_checkpoint_save_graph_def': True, '_service': None, '_cluster_spec': ClusterSpec({}), '_task_type': 'worker', '_task_id': 0, '_global_id_in_cluster': 0, '_master': '', '_evaluation_master': '', '_is_chief': True, '_num_ps_replicas': 0, '_num_worker_replicas': 1} WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/training/training_util.py:401: Variable.initialized_value (from tensorflow.python.ops.variables) is deprecated and will be removed in a future version. Instructions for updating: Use Variable.read_value. Variables in 2.X are initialized automatically both in eager and graph (inside tf.defun) contexts. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Create CheckpointSaverHook. INFO:tensorflow:Graph was finalized. INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0... INFO:tensorflow:Saving checkpoints for 0 into estimator-checkpoints/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0... INFO:tensorflow:loss = 0.0, step = 1 INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 1... INFO:tensorflow:Saving checkpoints for 1 into estimator-checkpoints/model.ckpt. INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 1... INFO:tensorflow:Loss for final step: 0.0. INFO:tensorflow:Calling model_fn. INFO:tensorflow:Done calling model_fn. INFO:tensorflow:Signatures INCLUDED in export for Classify: None INFO:tensorflow:Signatures INCLUDED in export for Regress: None INFO:tensorflow:Signatures INCLUDED in export for Predict: ['serving_default'] INFO:tensorflow:Signatures INCLUDED in export for Train: None INFO:tensorflow:Signatures INCLUDED in export for Eval: None INFO:tensorflow:Restoring parameters from estimator-checkpoints/model.ckpt-1 INFO:tensorflow:Assets added to graph. INFO:tensorflow:No assets to write. INFO:tensorflow:SavedModel written to: exported-estimator/temp-1636162129/saved_model.pb 'estimator-model'
!saved_model_cli run --dir estimator-model --tag_set serve \
--signature_def serving_default --input_exprs input=[10]
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Restoring parameters from estimator-model/variables/variables Result for output key output: [12.]
TensorFlow 2: salvar e exportar 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. Em seguida, você pode chamar tf.saved_model.save
para criar um SavedModel. Consulte Salvando um modelo personalizado no guia de formato Using the SavedModel para saber mais.
class MyModel(tf.Module):
@tf.function
def __call__(self, input):
return add_two(input)
model = MyModel()
@tf.function
def serving_default(input):
return {'output': model(input)}
signature_function = serving_default.get_concrete_function(
tf.TensorSpec(shape=[], dtype=tf.float32))
tf.saved_model.save(
model, 'tf2-save', signatures={
tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: signature_function})
INFO:tensorflow:Assets written to: tf2-save/assets 2021-11-06 01:28:53.105391: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
!saved_model_cli run --dir tf2-save --tag_set serve \
--signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Restoring parameters from tf2-save/variables/variables Result for output key output: 12.0
Salve e exporte um SavedModel definido com Keras
As APIs do Keras para salvar e exportar — Mode.save
ou tf.keras.models.save_model
— podem exportar um SavedModel de um tf.keras.Model
. Confira os modelos Salvar e carregar Keras para obter mais detalhes.
inp = tf.keras.Input(3)
out = add_two(inp)
model = tf.keras.Model(inputs=inp, outputs=out)
@tf.function(input_signature=[tf.TensorSpec(shape=[], dtype=tf.float32)])
def serving_default(input):
return {'output': model(input)}
model.save('keras-model', save_format='tf', signatures={
tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY: serving_default})
WARNING:tensorflow:Compiled the loaded model, but the compiled metrics have yet to be built. `model.compile_metrics` will be empty until you train or evaluate the model. WARNING:tensorflow:Model was constructed with shape (None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape (). INFO:tensorflow:Assets written to: keras-model/assets
!saved_model_cli run --dir keras-model --tag_set serve \
--signature_def serving_default --input_exprs input=10
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/tools/saved_model_cli.py:453: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Restoring parameters from keras-model/variables/variables Result for output key output: 12.0
Carregando um SavedModel
Um SavedModel salvo com qualquer uma das APIs acima pode ser carregado usando as APIs TensorFlow 1 ou TensorFlow.
Geralmente, um SavedModel do TensorFlow 1 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 recursos . 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: carregue um SavedModel com tf.saved_model.load
No TensorFlow 1, você pode importar um SavedModel diretamente para o gráfico e a sessão atuais usando tf.saved_model.load
. Você pode chamar Session.run
nos nomes de entrada e saída do tensor:
def load_tf1(path, input):
print('Loading from', path)
with tf.Graph().as_default() as g:
with tf1.Session() as sess:
meta_graph = tf1.saved_model.load(sess, ["serve"], path)
sig_def = meta_graph.signature_def[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY]
input_name = sig_def.inputs['input'].name
output_name = sig_def.outputs['output'].name
print(' Output with input', input, ': ',
sess.run(output_name, feed_dict={input_name: input}))
load_tf1('saved-model-builder', 5.)
load_tf1('simple-save', 5.)
load_tf1('estimator-model', [5.]) # Estimator's input must be batched.
load_tf1('tf2-save', 5.)
load_tf1('keras-model', 5.)
Loading from saved-model-builder WARNING:tensorflow:From /tmp/ipykernel_26511/1548963983.py:5: load (from tensorflow.python.saved_model.loader_impl) is deprecated and will be removed in a future version. Instructions for updating: This function will only be available through the v1 compatibility library as tf.compat.v1.saved_model.loader.load or tf.compat.v1.saved_model.load. There will be a new function for importing SavedModels in Tensorflow 2.0. INFO:tensorflow:Saver not created because there are no variables in the graph to restore INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored. Output with input 5.0 : 7.0 Loading from simple-save INFO:tensorflow:Saver not created because there are no variables in the graph to restore INFO:tensorflow:The specified SavedModel has no variables; no checkpoints were restored. Output with input 5.0 : 7.0 Loading from estimator-model INFO:tensorflow:Restoring parameters from estimator-model/variables/variables Output with input [5.0] : [7.] Loading from tf2-save INFO:tensorflow:Restoring parameters from tf2-save/variables/variables Output with input 5.0 : 7.0 Loading from keras-model INFO:tensorflow:Restoring parameters from keras-model/variables/variables Output with input 5.0 : 7.0
TensorFlow 2: carregue 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 do TensorFlow 1.
Confira os documentos da API tf.saved_model.load
e a seção Carregando e usando um modelo personalizado do guia de formato Using the SavedModel para obter detalhes.
def load_tf2(path, input):
print('Loading from', path)
loaded = tf.saved_model.load(path)
out = loaded.signatures[tf.saved_model.DEFAULT_SERVING_SIGNATURE_DEF_KEY](
tf.constant(input))['output']
print(' Output with input', input, ': ', out)
load_tf2('saved-model-builder', 5.)
load_tf2('simple-save', 5.)
load_tf2('estimator-model', [5.]) # Estimator's input must be batched.
load_tf2('tf2-save', 5.)
load_tf2('keras-model', 5.)
Loading from saved-model-builder INFO:tensorflow:Saver not created because there are no variables in the graph to restore Output with input 5.0 : tf.Tensor(7.0, shape=(), dtype=float32) Loading from simple-save INFO:tensorflow:Saver not created because there are no variables in the graph to restore Output with input 5.0 : tf.Tensor(7.0, shape=(), dtype=float32) Loading from estimator-model Output with input [5.0] : tf.Tensor([7.], shape=(1,), dtype=float32) Loading from tf2-save Output with input 5.0 : tf.Tensor(7.0, shape=(), dtype=float32) Loading from keras-model Output with input 5.0 : tf.Tensor(7.0, shape=(), dtype=float32)
Os modelos salvos com a API do TensorFlow 2 também podem acessar tf.function
se variáveis anexadas ao modelo (em vez daquelas exportadas como assinaturas). Por exemplo:
loaded = tf.saved_model.load('tf2-save')
print('restored __call__:', loaded.__call__)
print('output with input 5.', loaded(5))
restored __call__: <tensorflow.python.saved_model.function_deserialization.RestoredFunction object at 0x7f30cc940990> output with input 5. tf.Tensor(7.0, shape=(), dtype=float32)
TensorFlow 2: carregue um modelo salvo com Keras
A API de carregamento Keras — tf.keras.models.load_model
— permite recarregar um modelo salvo de volta em um objeto Keras Model. Observe que isso só permite carregar SavedModels salvos com Keras ( Model.save
ou tf.keras.models.save_model
).
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 gráfico TensorFlow. Consulte os documentos da API tf.keras.models.load_model
e o guia Salvar e carregar modelos Keras para obter detalhes.
loaded_model = tf.keras.models.load_model('keras-model')
loaded_model.predict_on_batch(tf.constant([1, 3, 4]))
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually. WARNING:tensorflow:Model was constructed with shape (None, 3) for input KerasTensor(type_spec=TensorSpec(shape=(None, 3), dtype=tf.float32, name='input_1'), name='input_1', description="created by layer 'input_1'"), but it was called on an input with incompatible shape (3,). array([3., 5., 6.], dtype=float32)
GraphDef e MetaGraphDef
Não há uma maneira direta de carregar um GraphDef
ou MetaGraphDef
para o TF2. No entanto, você pode converter o código TF1 que importa o gráfico em uma v1.wrap_function
concrete_function
Primeiro, salve um MetaGraphDef:
# Save a simple multiplication computation:
with tf.Graph().as_default() as g:
x = tf1.placeholder(tf.float32, shape=[], name='x')
v = tf.Variable(3.0, name='v')
y = tf.multiply(x, v, name='y')
with tf1.Session() as sess:
sess.run(v.initializer)
print(sess.run(y, feed_dict={x: 5}))
s = tf1.train.Saver()
s.export_meta_graph('multiply.pb', as_text=True)
s.save(sess, 'multiply_values.ckpt')
15.0
Usando APIs do TF1, você pode usar tf1.train.import_meta_graph
para importar o gráfico e restaurar os valores:
with tf.Graph().as_default() as g:
meta = tf1.train.import_meta_graph('multiply.pb')
x = g.get_tensor_by_name('x:0')
y = g.get_tensor_by_name('y:0')
with tf1.Session() as sess:
meta.restore(sess, 'multiply_values.ckpt')
print(sess.run(y, feed_dict={x: 5}))
INFO:tensorflow:Restoring parameters from multiply_values.ckpt 15.0
Não há APIs do TF2 para carregar o gráfico, mas você ainda pode importá-lo para uma função concreta que pode ser executada no modo ansioso:
def import_multiply():
# Any graph-building code is allowed here.
tf1.train.import_meta_graph('multiply.pb')
# Creates a tf.function with all the imported elements in the function graph.
wrapped_import = tf1.wrap_function(import_multiply, [])
import_graph = wrapped_import.graph
x = import_graph.get_tensor_by_name('x:0')
y = import_graph.get_tensor_by_name('y:0')
# Restore the variable values.
tf1.train.Saver(wrapped_import.variables).restore(
sess=None, save_path='multiply_values.ckpt')
# Create a concrete function by pruning the wrap_function (similar to sess.run).
multiply_fn = wrapped_import.prune(feeds=x, fetches=y)
# Run this function
multiply_fn(tf.constant(5.)) # inputs to concrete functions must be Tensors.
WARNING:tensorflow:Saver is deprecated, please switch to tf.train.Checkpoint or tf.keras.Model.save_weights for training checkpoints. When executing eagerly variables do not necessarily have unique names, and so the variable.name-based lookups Saver performs are error-prone. INFO:tensorflow:Restoring parameters from multiply_values.ckpt <tf.Tensor: shape=(), dtype=float32, numpy=15.0>
Alterações do TensorFlow 1 para o TensorFlow 2
Esta seção lista os principais termos de salvamento e carregamento do TensorFlow 1, seus equivalentes do TensorFlow 2 e o que mudou.
Modelo salvo
SavedModel é um formato que armazena um programa TensorFlow completo com parâmetros e computação. Ele contém assinaturas usadas por plataformas de serviço para executar o modelo.
O formato do arquivo em si não mudou significativamente, portanto, os SavedModels podem ser carregados e veiculados usando as APIs do TensorFlow 1 ou do TensorFlow 2.
Diferenças entre o TensorFlow 1 e o TensorFlow 2
Os casos de uso de veiculação e inferência não foram atualizados no TensorFlow 2, além das alterações da API — a melhoria foi introduzida na capacidade de reutilizar e compor modelos carregados do 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 em uma sessão, e o gráfico agora existe em diferentes tf.function
s. Consequentemente, durante uma exportação de modelo, SavedModel salva cada componente e gráficos de função separadamente.
Ao escrever um programa do TensorFlow com as APIs do TensorFlow Python, 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 ou subclassificando tf.Module
.
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
Assinaturas são os pontos de extremidade 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 passando funções concretas . (Leia mais sobre as funções do TensorFlow no guia Introdução aos gráficos e tf.function .) Resumindo, uma função concreta é gerada a partir de um tf.function
:
# Option 1: Specify an input signature.
@tf.function(input_signature=[...])
def fn(...):
...
return outputs
tf.saved_model.save(model, path, signatures={
'name': fn
})
# Option 2: Call `get_concrete_function`
@tf.function
def fn(...):
...
return outputs
tf.saved_model.save(model, path, signatures={
'name': fn.get_concrete_function(...)
})
Session.run
No TensorFlow 1, você pode chamar Session.run
com o gráfico importado, desde que já conheça os nomes dos tensores. Isso permite que você recupere os valores de variáveis restaurados ou execute partes do modelo que não foram exportadas nas assinaturas.
No TensorFlow 2, você pode acessar diretamente uma variável, como uma matriz de pesos ( kernel
):
model = tf.Module()
model.dense_layer = tf.keras.layers.Dense(...)
tf.saved_model.save('my_saved_model')
loaded = tf.saved_model.load('my_saved_model')
loaded.dense_layer.kernel
ou chame tf.function
s anexado ao objeto de modelo: por exemplo, loaded.__call__
.
Ao contrário do TF1, não há como extrair partes de uma função e acessar valores intermediários. Você deve exportar toda a funcionalidade necessária no objeto salvo.
Notas de migração do TensorFlow Servindo
SavedModel foi originalmente criado para funcionar com o TensorFlow Serving . Essa plataforma oferece diferentes tipos de solicitações de previsão: classificar, regredir e prever.
A API do TensorFlow 1 permite que você crie esses tipos de assinaturas com os utilitários:
-
tf.compat.v1.saved_model.classification_signature_def
-
tf.compat.v1.saved_model.regression_signature_def
-
tf.compat.v1.saved_model.predict_signature_def
Classificação ( classification_signature_def
) e regressão ( regression_signature_def
) restringem as entradas e saídas, portanto, as entradas devem ser um 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.
Os SavedModels exportados com a API do TensorFlow 2 são compatíveis com o TensorFlow Serving, mas conterão apenas assinaturas de previsão. As assinaturas de classificação e regressão foram removidas.
Se você precisar usar as assinaturas de classificação e regressão, 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:
Se você estiver usando o TensorFlow Hub, esses guias podem ser úteis: