Exportar um SavedModel

Esta página descreve os detalhes de como exportar (salvar) 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 formato antigo do 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 exportação de formato TF1 Hub . 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 o 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 seu cálculo. Ele pode ser usado independentemente do código que o criou. Em particular, ele pode ser reutilizado em diferentes APIs de construção de modelos de alto nível, como Keras, porque as operações do TensorFlow são sua linguagem básica comum.

Economizando de Keras

A partir do TensorFlow 2, tf.keras.Model.save() e tf.keras.models.save_model() 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, faça da peça um modelo em si e salve-o. Você pode colocar 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 abordagem anterior para BERT (consulte nlp/tools/export_tfhub_lib.py , observe a divisão entre core_model para exportação e o pré- 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 uma boa familiaridade com o SavedModel Guide do TensorFlow.

Se você deseja fornecer mais do que apenas uma assinatura de serviço, deve implementar a interface Reusable SavedModel . 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

Conselhos para criadores de SavedModel

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

Salvar de um modelo Keras deve fazer toda a mecânica de ajuste fino funcionar (economizar perdas de regularização de peso, declarar variáveis ​​treináveis, rastrear __call__ tanto para training=True quanto 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 dropout, normalização de lote ou técnicas de treinamento semelhantes que envolvem hiperparâmetros, defina-os para valores que façam sentido em muitos problemas de destino esperados e tamanhos de lote. (No momento em que este artigo foi escrito, salvar do Keras não facilita permitir que os consumidores os ajustem.)

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

Jardim Modelo TensorFlow

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

Solicitações da comunidade

A equipe do TensorFlow Hub gera apenas uma pequena fração dos recursos 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 possamos atender às solicitações da comunidade para ativos específicos e não podemos fornecer estimativas de tempo para a disponibilidade de novos ativos.

O marco Solicitações de modelo da 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 a submissão!