Exportar um SavedModel

Esta página descreve os detalhes da exportação (salvamento) de um modelo de um programa TensorFlow para o formato SavedModel do TensorFlow 2 . Esse formato é a maneira recomendada de compartilhar modelos pré-treinados e peças de modelo no TensorFlow Hub. Ele substitui o antigo formato TF1 Hub e vem com um novo conjunto de APIs. Você pode encontrar mais informações sobre como exportar os modelos de formato TF1 Hub em TF1 Hub format export . Você pode encontrar detalhes sobre como compactar o SavedModel para compartilhá-lo no TensorFlow Hub aqui .

Alguns kits de ferramentas de construção de modelos já fornecem ferramentas para fazer isso (por exemplo, veja abaixo para TensorFlow Model Garden ).

Visão geral

SavedModel é o formato de serialização padrão do TensorFlow para modelos treinados ou peças de modelo. Ele armazena os pesos treinados do modelo junto com as operações exatas do TensorFlow para realizar sua computação. Ele pode ser usado independentemente do código que o criou. Em particular, ele pode ser reutilizado em diferentes APIs de criação de modelos de alto nível, como Keras, porque as operações do TensorFlow são sua linguagem básica comum.

Salvando de Keras

A partir do TensorFlow 2, tf.keras.Model.save() e tf.keras.models.save_model() assumem como padrão o formato SavedModel (não HDF5). Os SavedModels resultantes que podem ser usados ​​com hub.load() , hub.KerasLayer e adaptadores semelhantes para outras APIs de alto nível à medida que se tornam disponíveis.

Para compartilhar um Modelo Keras completo, basta salvá-lo com include_optimizer=False .

Para compartilhar uma peça de um Modelo Keras, torne a peça um Modelo em si e salve-o. Você pode definir o código assim desde o início ....

piece_to_share = tf.keras.Model(...)
full_model = tf.keras.Sequential([piece_to_share, ...])
full_model.fit(...)
piece_to_share.save(...)

...ou recorte a peça para compartilhar após o fato (se estiver alinhada com as camadas do seu modelo completo):

full_model = tf.keras.Model(...)
sharing_input = full_model.get_layer(...).get_output_at(0)
sharing_output = full_model.get_layer(...).get_output_at(0)
piece_to_share = tf.keras.Model(sharing_input, sharing_output)
piece_to_share.save(..., include_optimizer=False)

Os modelos do TensorFlow no GitHub usam a primeira abordagem para BERT (consulte nlp/tools/export_tfhub_lib.py , observe a divisão entre core_model para exportação e o pretrainer para restaurar o ponto de verificação) e a última abordagem para ResNet (consulte legacy/image_classification/tfhub_export. pi ).

Salvando do TensorFlow de baixo nível

Isso requer boa familiaridade com o Guia SavedModel do TensorFlow.

Se você deseja fornecer mais do que apenas uma assinatura de serviço, deve implementar a interface SavedModel reutilizável . Conceitualmente, isso parece

class MyMulModel(tf.train.Checkpoint):
  def __init__(self, v_init):
    super().__init__()
    self.v = tf.Variable(v_init)
    self.variables = [self.v]
    self.trainable_variables = [self.v]
    self.regularization_losses = [
        tf.function(input_signature=[])(lambda: 0.001 * self.v**2),
    ]

  @tf.function(input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
  def __call__(self, inputs):
    return tf.multiply(inputs, self.v)

tf.saved_model.save(MyMulModel(2.0), "/tmp/my_mul")

layer = hub.KerasLayer("/tmp/my_mul")
print(layer([10., 20.]))  # [20., 40.]
layer.trainable = True
print(layer.trainable_weights)  # [2.]
print(layer.losses)  # 0.004

Conselho para criadores de SavedModel

Ao criar um SavedModel para compartilhamento no TensorFlow Hub, pense com antecedência se e como seus consumidores devem ajustá-lo e forneça orientações na documentação.

Salvar de um modelo Keras deve fazer com que toda a mecânica do trabalho de ajuste fino (economizar perdas de regularização de peso, declarar variáveis ​​treináveis, rastrear __call__ para training=True e training=False , etc.)

Escolha uma interface de modelo que funcione bem com fluxo de gradiente, por exemplo, logits de saída em vez de probabilidades softmax ou previsões top-k.

Se o modelo usar abandono, normalização de lote ou técnicas de treinamento semelhantes que envolvam hiperparâmetros, defina-os com valores que façam sentido em muitos problemas de destino esperados e tamanhos de lote. (Até o momento em que este livro foi escrito, salvar do Keras não torna mais fácil permitir que os consumidores os ajustem.)

Os regularizadores de peso em camadas individuais são salvos (com seus coeficientes de força de regularização), mas a regularização de peso de dentro do otimizador (como tf.keras.optimizers.Ftrl.l1_regularization_strength=...) ) é perdida. Informe os consumidores sobre seu SavedModel de acordo.

Jardim Modelo TensorFlow

O repositório TensorFlow Model Garden contém muitos exemplos de criação de modelos salvos TF2 reutilizáveis ​​para serem carregados em tfhub.dev .

Solicitações da comunidade

A equipe do TensorFlow Hub gera apenas uma pequena fração dos ativos disponíveis em tfhub.dev. Contamos principalmente com pesquisadores do Google e DeepMind, instituições de pesquisa corporativas e acadêmicas e entusiastas de ML para produzir modelos. Como resultado, não podemos garantir que podemos atender às solicitações da comunidade para recursos específicos e não podemos fornecer estimativas de tempo para a disponibilidade de novos recursos.

O marco de Solicitações de modelo de comunidade abaixo contém solicitações da comunidade para recursos específicos -- se você ou alguém que você conhece estiver interessado em produzir o recurso e compartilhá-lo emtfhub.dev, agradecemos o envio!