Path: blob/master/site/pt-br/tutorials/distribute/save_and_load.ipynb
25118 views
Copyright 2019 The TensorFlow Authors.
Salve e carregue um modelo usando uma estratégia de distribuição
Visão geral
Este tutorial demonstra como você pode salvar e carregar modelos no formato SavedModel com tf.distribute.Strategy
durante ou após o treinamento. Existem dois tipos de API para salvar e carregar um modelo do Keras: um de alto nível (tf.keras.Model.save
e tf.keras.models.load_model
) e outro de baixo nível (tf.saved_model.save
e tf.saved_model.load)
.
Para saber mais sobre SavedModel e serialização de forma geral, leia o guia SavedModel e o guia Serialização do modelo do Keras. Vamos começar com um exemplo simples.
Atenção: os modelos do TensorFlow são códigos, e é importante ter cuidado com código não confiável. Saiba mais em Como usar o TensorFlow com segurança.
Importe as dependências:
Carregue e prepare os dados com os datasets do TensorFlow e tf.data
, e crie o modelo usando tf.distribute.MirroredStrategy
:
Treine o modelo com tf.keras.Model.fit
:
Como salvar e carregar o modelo
Agora que você já tem um modelo simples, vamos conferir as APIs de salvamento/carregamento. Dois tipos de API estão disponíveis:
Alto nível (Keras):
Model.save
etf.keras.models.load_model
(formato de arquivo zip.keras
)Baixo nível:
tf.saved_model.save
etf.saved_model.load
(formato SavedModel do TF)
API do Keras
Veja um exemplo de como salvar e carregar um modelo com a API do Keras:
Restaure o modelo sem tf.distribute.Strategy
:
Após restaurar o modelo, você pode continuar fazendo o treinamento, mesmo sem precisar fazer uma chamada a Model.compile
novamente, pois ele já foi compilado antes do salvamento. O modelo é salvo no formato de arquivo zip do Keras, marcado pela extensão .keras
. Confira mais informações no guia sobre salvamento do Keras.
Agora, restaure o modelo e faça o treinamento usando tf.distribute.Strategy
:
Como a saída de Model.fit
mostra, o carregamento funciona conforme o esperado com tf.distribute.Strategy
. A estratégia usada aqui não precisa ser a mesma usada antes do salvamento.
API tf.saved_model
Salvar o modelo com a API de baixo nível é similar ao salvamento com a API do Keras:
O carregamento pode ser feito com tf.saved_model.load
. Entretanto, como é uma API de baixo nível (e, portanto, tem uma gama maior de casos de uso), ela não retorna um modelo do Keras. Em vez disso, retorna um objeto que contém funções que podem ser usadas para fazer inferência. Por exemplo:
O objeto carregado pode conter diversas funções, cada uma associada a uma chave. A chave "serving_default"
é a chave padrão para a função de inferência com um modelo do Keras salvo. Para fazer inferência com essa função:
Você também pode carregar e fazer inferência de uma forma distribuída:
A chamada à função restaurada é apenas um passo para frente do modelo salvo (tf.keras.Model.predict
). E se você quiser continuar treinando a função carregada? Ou se você precisar embutir uma função carregada em um modelo maior? Uma prática comum para fazer isso é encapsular esse objeto carregado em uma camada do Keras. Felizmente, o TF Hub tem hub.KerasLayer
para essa finalidade. Veja:
No exemplo acima, o hub.KerasLayer
do TensorFlow Hub encapsula o resultado carregado a partir de tf.saved_model.load
em uma camada do Keras, que é usada para criar outro modelo. Isso é muito útil para aprendizado por transferência.
Que API devo usar?
Para salvar, se você estiver trabalhando com um modelo do Keras, use a API Model.save
do Keras, a menos que você precise de controle adicional permitido pela API de nível baixo. Se o que você estiver salvando não for um modelo do Keras, então a API de baixo nível, tf.saved_model.save
, é sua única opção.
Para carregar, a escolha da API depende do que você deseja obter com a API de carregamento do modelo. Se você não puder (ou não quiser) obter um modelo do Keras, use tf.saved_model.load
. Caso contrário, use tf.keras.models.load_model
. Você pode obter um modelo do Keras somente se tiver salvo um.
É possível usar as duas APIs ao mesmo tempo. Você pode salvar um modelo do Keras com Model.save
e carregar um modelo que não é do Keras com a API de baixo nível, tf.saved_model.load
.
Como salvar/carregar usando um dispositivo local
Ao salvar e carregar usando um dispositivos de E/S local ao fazer o treinamento em dispositivos remotos (por exemplo, ao usar TPU em nuvem), você precisa usar a opção experimental_io_device
em tf.saved_model.SaveOptions
e tf.saved_model.LoadOptions
para definir o dispositivo de E/S como localhost
. Por exemplo:
Ressalvas
Um caso especial é quando você cria modelos do Keras de determinadas formas e depois salva-os antes do treinamento. Por exemplo:
SavedModel salva os objetos tf.types.experimental.ConcreteFunction
gerados quando você faz o trace de uma tf.function
(confira Quando uma função está fazendo trace? no guia Introdução a grafos e tf.function para saber mais). Se você obtiver um ValueError
, é porque Model.save
não conseguiu encontrar ou criar uma ConcreteFunction
que sofreu trace.
Atenção: você não deve salvar um modelo sem pelo menos uma ConcreteFunction
, já que, caso o faça, a API de baixo nível gerará um SavedModel sem assinaturas de ConcreteFunction
(saiba mais sobre o formato SavedModel). Por exemplo:
Geralmente, o passo para frente do modelo (o método call
) sofrerá trace automaticamente quando o modelo for chamado pela primeira vez, geralmente pelo método Model.fit
do Keras. Uma ConcreteFunction
também pode ser gerada pelas APIs Sequential e Functional do Keras se você definir o formato da entrada – por exemplo, usando como primeira camada um tf.keras.layers.InputLayer
ou outro tipo de camada – e passando a ela o argumento palavra-chave input_shape
.
Para verificar se seu modelo tem alguma ConcreteFunction
que sofreu trace, confira se Model.save_spec
é igual a None
(nenhuma):
Vamos usar tf.keras.Model.fit
para treinar o modelo. Observe que save_spec
é definido, e o salvamento do modelo funcionará: