Problemas comuns

Se o seu problema não estiver listado aqui, pesquise os problemas do github antes de preencher um novo.

TypeError: o objeto 'AutoTrackable' não pode ser chamado

# BAD: Raises error
embed = hub.load('https://tfhub.dev/google/nnlm-en-dim128/1')
embed(['my text', 'batch'])

Este erro surge frequentemente ao carregar modelos no formato TF1 Hub com a API hub.load() no TF2. Adicionar a assinatura correta deve resolver esse problema. Consulte o guia de migração do TF-Hub para TF2 para obter mais detalhes sobre a mudança para o TF2 e o uso de modelos no formato TF1 Hub no TF2.


embed = hub.load('https://tfhub.dev/google/nnlm-en-dim128/1')
embed.signatures['default'](['my text', 'batch'])

Não é possível baixar um módulo

No processo de utilização de um módulo de uma URL, existem muitos erros que podem aparecer devido à pilha da rede. Freqüentemente, esse é um problema específico da máquina que executa o código e não da biblioteca. Aqui está uma lista dos mais comuns:

  • "EOF ocorreu em violação do protocolo" - Este problema provavelmente será gerado se a versão python instalada não suportar os requisitos TLS do servidor que hospeda o módulo. Notavelmente, o python 2.7.5 é conhecido por falhar na resolução de módulos do domínio tfhub.dev. CORREÇÃO : atualize para uma versão mais recente do python.

  • "não é possível verificar o certificado tfhub.dev" - Este problema provavelmente será gerado se algo na rede estiver tentando atuar como o gTLD dev. Antes de .dev ser usado como gTLD, os desenvolvedores e estruturas às vezes usavam nomes .dev para ajudar a testar o código. CORREÇÃO: Identifique e reconfigure o software que intercepta a resolução de nomes no domínio “.dev”.

  • Falhas ao gravar no diretório de cache /tmp/tfhub_modules (ou similar): consulte Cache para saber o que é isso e como alterar sua localização.

Se os erros e correções acima não funcionarem, pode-se tentar baixar manualmente um módulo simulando o protocolo de anexar ?tf-hub-format=compressed à URL para baixar um arquivo compactado tar que deve ser descompactado manualmente em um local arquivo. O caminho para o arquivo local pode então ser usado em vez da URL. Aqui está um exemplo rápido:

# Create a folder for the TF hub module.
$ mkdir /tmp/moduleA
# Download the module, and uncompress it to the destination folder. You might want to do this manually.
$ curl -L "https://tfhub.dev/google/universal-sentence-encoder/2?tf-hub-format=compressed" | tar -zxvC /tmp/moduleA
# Test to make sure it works.
$ python
> import tensorflow_hub as hub
> hub.Module("/tmp/moduleA")

Executando inferência em um módulo pré-inicializado

Se você estiver escrevendo um programa Python que aplica um módulo muitas vezes aos dados de entrada, poderá aplicar as seguintes receitas. (Observação: para atender solicitações em serviços de produção, considere o TensorFlow Serving ou outras soluções escalonáveis ​​e sem Python.)

Supondo que seu modelo de caso de uso seja inicialização e solicitações subsequentes (por exemplo Django, Flask, servidor HTTP personalizado, etc.), você pode configurar o serviço da seguinte maneira:

Modelos salvos TF2

  • Na parte de inicialização:
    • Carregue o modelo TF2.0.
import tensorflow_hub as hub

embedding_fn = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
  • Na parte da solicitação:
    • Use a função de incorporação para executar inferência.
embedding_fn(["Hello world"])

Esta chamada de tf.function é otimizada para desempenho, consulte tf.function guide .

Módulos de hub TF1

  • Na parte de inicialização:
    • Construa o gráfico com um espaço reservado – ponto de entrada no gráfico.
    • Inicialize a sessão.
import tensorflow as tf
import tensorflow_hub as hub

# Create graph and finalize (finalizing optional but recommended).
g = tf.Graph()
with g.as_default():
  # We will be feeding 1D tensors of text into the graph.
  text_input = tf.placeholder(dtype=tf.string, shape=[None])
  embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")
  embedded_text = embed(text_input)
  init_op = tf.group([tf.global_variables_initializer(), tf.tables_initializer()])
g.finalize()

# Create session and initialize.
session = tf.Session(graph=g)
session.run(init_op)
  • Na parte da solicitação:
    • Use a sessão para alimentar dados no gráfico por meio do espaço reservado.
result = session.run(embedded_text, feed_dict={text_input: ["Hello world"]})

Não é possível alterar o dtype de um modelo (por exemplo, float32 para bfloat16)

Os SavedModels do TensorFlow (compartilhados no TF Hub ou não) contêm operações que funcionam em tipos de dados fixos (geralmente, float32 para os pesos e ativações intermediárias de redes neurais). Eles não podem ser alterados após o carregamento do SavedModel (mas os editores de modelos podem optar por publicar modelos diferentes com tipos de dados diferentes).

Atualizar uma versão do modelo

Os metadados da documentação das versões do modelo podem ser atualizados. No entanto, os ativos da versão (arquivos de modelo) são imutáveis. Se quiser alterar os ativos do modelo, você poderá publicar uma versão mais recente do modelo. É uma boa prática estender a documentação com um log de alterações que descreva o que mudou entre as versões.