Общие проблемы

Если вашей проблемы здесь нет, выполните поиск по проблемам на GitHub , прежде чем создавать новую.

Ошибка типа: объект AutoTrackable не может быть вызван

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

Эта ошибка часто возникает при загрузке моделей в формате TF1 Hub с помощью hub.load() в TF2. Добавление правильной подписи должно решить эту проблему. Дополнительную информацию о переходе на TF2 и использовании моделей в формате TF1 Hub в TF2 см. в руководстве по миграции TF-Hub для TF2.


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

Не могу скачать модуль

В процессе использования модуля из URL-адреса может возникнуть множество ошибок, связанных с сетевым стеком. Часто это проблема, специфичная для машины, на которой выполняется код, а не проблема с библиотекой. Вот список наиболее распространенных:

  • «EOF произошел с нарушением протокола» . Эта проблема может возникнуть, если установленная версия Python не поддерживает требования TLS сервера, на котором размещен модуль. Примечательно, что Python 2.7.5 не может разрешить модули из домена tfhub.dev. ИСПРАВЛЕНИЕ : Пожалуйста, обновите Python до более новой версии.

  • «невозможно проверить сертификат tfhub.dev» . Эта проблема, скорее всего, возникнет, если что-то в сети пытается действовать как gTLD dev. До того, как .dev использовался в качестве gTLD, разработчики и платформы иногда использовали имена .dev для облегчения тестирования кода. ИСПРАВЛЕНИЕ: Определите и перенастройте программное обеспечение, которое перехватывает разрешение имен в домене «.dev».

  • Не удалось выполнить запись в каталог кэша /tmp/tfhub_modules (или аналогичный): что это такое и как изменить его расположение, см. в разделе Кэширование .

Если вышеуказанные ошибки и исправления не работают, можно попытаться загрузить модуль вручную, смоделировав протокол прикрепления ?tf-hub-format=compressed к URL-адресу, чтобы загрузить файл, сжатый в формате tar, который необходимо вручную распаковать в локальный файл. файл. Вместо URL-адреса можно использовать путь к локальному файлу. Вот краткий пример:

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

Выполнение вывода на предварительно инициализированном модуле

Если вы пишете программу на Python, которая многократно применяет модуль к входным данным, вы можете применить следующие рецепты. (Примечание. Для обслуживания запросов в производственных сервисах рассмотрите возможность использования TensorFlow Serving или других масштабируемых решений без Python.)

Предполагая, что ваша модель варианта использования — это инициализация и последующие запросы (например, Django, Flask, собственный HTTP-сервер и т. д.), вы можете настроить обслуживание следующим образом:

Сохраненные модели TF2

  • В части инициализации:
    • Загрузите модель TF2.0.
import tensorflow_hub as hub

embedding_fn = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
  • В части запроса:
    • Используйте функцию внедрения для выполнения вывода.
embedding_fn(["Hello world"])

Этот вызов tf.function оптимизирован для производительности, см. руководство по tf.function .

Модули концентратора TF1

  • В части инициализации:
    • Постройте график с помощью заполнителя — точки входа в график.
    • Инициализируйте сеанс.
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)
  • В части запроса:
    • Используйте сеанс для подачи данных в график через заполнитель.
result = session.run(embedded_text, feed_dict={text_input: ["Hello world"]})

Невозможно изменить тип модели (например, с float32 на bfloat16).

SavedModels TensorFlow (совместно используемые в TF Hub или где-либо еще) содержат операции, которые работают с фиксированными типами данных (часто float32 для весов и промежуточных активаций нейронных сетей). Их нельзя изменить постфактум при загрузке SavedModel (но издатели моделей могут публиковать разные модели с разными типами данных).

Обновить версию модели

Метаданные документации версий модели могут быть обновлены. Однако ресурсы версии (файлы модели) являются неизменяемыми. Если вы хотите изменить активы модели, вы можете опубликовать более новую версию модели. Хорошей практикой является дополнение документации журналом изменений, в котором описывается, что изменилось в разных версиях.