Problemi comuni

Se il tuo problema non è elencato qui, cerca i problemi di GitHub prima di compilarne uno nuovo.

TypeError: l'oggetto 'AutoTrackable' non è richiamabile

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

Questo errore si verifica spesso quando si caricano modelli in formato TF1 Hub con l'API hub.load() in TF2. L'aggiunta della firma corretta dovrebbe risolvere questo problema. Consulta la guida alla migrazione TF-Hub per TF2 per ulteriori dettagli sul passaggio a TF2 e sull'uso dei modelli in formato TF1 Hub in TF2.


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

Impossibile scaricare un modulo

Nel processo di utilizzo di un modulo da un URL possono verificarsi molti errori a causa dello stack di rete. Spesso si tratta di un problema specifico della macchina che esegue il codice e non di un problema con la libreria. Ecco un elenco di quelli comuni:

  • "EOF si è verificato in violazione del protocollo" - È probabile che questo problema venga generato se la versione Python installata non supporta i requisiti TLS del server che ospita il modulo. In particolare, è noto che Python 2.7.5 non riesce a risolvere i moduli dal dominio tfhub.dev. CORREZIONE : aggiornare a una versione Python più recente.

  • "impossibile verificare il certificato di tfhub.dev" - È probabile che questo problema venga generato se qualcosa sulla rete tenta di agire come dev gTLD. Prima che .dev fosse utilizzato come gTLD, sviluppatori e framework a volte utilizzavano nomi .dev per facilitare il test del codice. CORREZIONE: identificare e riconfigurare il software che intercetta la risoluzione dei nomi nel dominio ".dev".

  • Errori di scrittura nella directory della cache /tmp/tfhub_modules (o simile): vedere Caching per sapere di cosa si tratta e come modificare la sua posizione.

Se gli errori e le correzioni di cui sopra non funzionano, è possibile provare a scaricare manualmente un modulo simulando il protocollo allegando ?tf-hub-format=compressed all'URL per scaricare un file compresso tar che deve essere decompresso manualmente in un file locale file. È quindi possibile utilizzare il percorso del file locale al posto dell'URL. Ecco un rapido esempio:

# 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")

Esecuzione dell'inferenza su un modulo preinizializzato

Se stai scrivendo un programma Python che applica un modulo più volte ai dati di input, puoi applicare le seguenti ricette. (Nota: per soddisfare le richieste nei servizi di produzione, prendi in considerazione TensorFlow Serving o altre soluzioni scalabili e prive di Python.)

Supponendo che il modello del tuo caso d'uso sia l'inizializzazione e le richieste successive (ad esempio Django, Flask, server HTTP personalizzato, ecc.), puoi impostare la fornitura come segue:

TF2 Modelli salvati

  • Nella parte di inizializzazione:
    • Carica il modello TF2.0.
import tensorflow_hub as hub

embedding_fn = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
  • Nella parte richiesta:
    • Utilizzare la funzione di incorporamento per eseguire l'inferenza.
embedding_fn(["Hello world"])

Questa chiamata di una tf.function è ottimizzata per le prestazioni, vedere la guida di tf.function .

Moduli hub TF1

  • Nella parte di inizializzazione:
    • Costruisci il grafico con un segnaposto : punto di ingresso nel grafico.
    • Inizializza la sessione.
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)
  • Nella parte richiesta:
    • Utilizza la sessione per inserire i dati nel grafico tramite il segnaposto.
result = session.run(embedded_text, feed_dict={text_input: ["Hello world"]})

Impossibile modificare il dtype di un modello (ad esempio, da float32 a bfloat16)

I SavedModels di TensorFlow (condivisi su TF Hub o in altro modo) contengono operazioni che funzionano su tipi di dati fissi (spesso float32 per i pesi e le attivazioni intermedie delle reti neurali). Questi non possono essere modificati dopo il caricamento di SavedModel (ma gli editori di modelli possono scegliere di pubblicare modelli diversi con tipi di dati diversi).

Aggiorna una versione del modello

I metadati della documentazione delle versioni del modello possono essere aggiornati. Tuttavia, le risorse della versione (file modello) sono immutabili. Se desideri modificare le risorse del modello, puoi pubblicare una versione più recente del modello. È buona norma estendere la documentazione con un registro delle modifiche che descriva cosa è cambiato tra le versioni.