Problèmes courants

Si votre problème n'est pas répertorié ici, veuillez rechercher les problèmes github avant d'en remplir un nouveau.

TypeError : l'objet 'AutoTrackable' n'est pas appelable

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

Cette erreur survient fréquemment lors du chargement de modèles au format TF1 Hub avec l'API hub.load() dans TF2. L'ajout de la signature correcte devrait résoudre ce problème. Consultez le guide de migration TF-Hub pour TF2 pour plus de détails sur le passage vers TF2 et l'utilisation des modèles au format TF1 Hub dans TF2.


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

Impossible de télécharger un module

Lors du processus d'utilisation d'un module à partir d'une URL, de nombreuses erreurs peuvent apparaître en raison de la pile réseau. Il s'agit souvent d'un problème spécifique à la machine exécutant le code et non d'un problème lié à la bibliothèque. Voici une liste des plus courants :

  • "EOF s'est produit en violation du protocole" - Ce problème est susceptible d'être généré si la version Python installée ne prend pas en charge les exigences TLS du serveur hébergeant le module. Notamment, python 2.7.5 est connu pour échouer dans la résolution des modules du domaine tfhub.dev. CORRECTIF : Veuillez mettre à jour vers une version plus récente de Python.

  • "Impossible de vérifier le certificat de tfhub.dev" - Ce problème est susceptible d'être généré si quelque chose sur le réseau tente d'agir en tant que gTLD de développement. Avant que .dev ne soit utilisé comme gTLD, les développeurs et les frameworks utilisaient parfois des noms .dev pour faciliter les tests de code. CORRECTIF : identifiez et reconfigurez le logiciel qui intercepte la résolution de nom dans le domaine ".dev".

  • Échecs d'écriture dans le répertoire de cache /tmp/tfhub_modules (ou similaire) : voir Mise en cache pour savoir de quoi il s'agit et comment modifier son emplacement.

Si les erreurs et correctifs ci-dessus ne fonctionnent pas, vous pouvez essayer de télécharger manuellement un module en simulant le protocole consistant à attacher ?tf-hub-format=compressed à l'URL pour télécharger un fichier compressé tar qui doit être décompressé manuellement dans un fichier local. déposer. Le chemin d'accès au fichier local peut alors être utilisé à la place de l'URL. Voici un exemple rapide :

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

Exécuter l'inférence sur un module pré-initialisé

Si vous écrivez un programme Python qui applique un module plusieurs fois sur les données d'entrée, vous pouvez appliquer les recettes suivantes. (Remarque : pour répondre aux demandes dans les services de production, envisagez TensorFlow Serving ou d'autres solutions évolutives et sans Python.)

En supposant que votre modèle de cas d'utilisation est l'initialisation et les requêtes ultérieures (par exemple Django, Flask, serveur HTTP personnalisé, etc.), vous pouvez configurer le service comme suit :

Modèles enregistrés TF2

  • Dans la partie initialisation :
    • Chargez le modèle TF2.0.
import tensorflow_hub as hub

embedding_fn = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
  • Dans la partie requête :
    • Utilisez la fonction d'intégration pour exécuter l'inférence.
embedding_fn(["Hello world"])

Cet appel d'un tf.function est optimisé pour les performances, voir le guide tf.function .

Modules du Hub TF1

  • Dans la partie initialisation :
    • Construisez le graphique avec un espace réservé - point d'entrée dans le graphique.
    • Initialisez la session.
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)
  • Dans la partie requête :
    • Utilisez la session pour introduire des données dans le graphique via l'espace réservé.
result = session.run(embedded_text, feed_dict={text_input: ["Hello world"]})

Impossible de changer le type d'un modèle (par exemple, float32 en bfloat16)

Les SavedModels de TensorFlow (partagés sur TF Hub ou autre) contiennent des opérations qui fonctionnent sur des types de données fixes (souvent, float32 pour les pondérations et les activations intermédiaires des réseaux de neurones). Ceux-ci ne peuvent pas être modifiés après coup lors du chargement du SavedModel (mais les éditeurs de modèles peuvent choisir de publier différents modèles avec différents types de données).

Mettre à jour une version de modèle

Les métadonnées de documentation des versions du modèle peuvent être mises à jour. Cependant, les actifs de la version (fichiers modèles) sont immuables. Si vous souhaitez modifier les actifs du modèle, vous pouvez publier une version plus récente du modèle. C'est une bonne pratique d'étendre la documentation avec un journal des modifications décrivant ce qui a changé entre les versions.