Я пытаюсь обслужить универсальный кодировщик предложений с Джанго.
Код инициализируется вначале как фоновый процесс (с помощью таких программ, как супервизор), затем он связывается с Django с помощью сокетов TCP и в конечном итоге возвращает закодированное предложение.
import socket
from threading import Thread
import tensorflow as tf
import tensorflow_hub as hub
import atexit
# Pre-loading the variables:
embed = hub.Module("https://tfhub.dev/google/universal-sentence-encoder/2")
session = tf.Session()
session.run(tf.global_variables_initializer())
session.run(tf.tables_initializer())
atexit.register(session.close) # session closes if the script is halted
...
# Converts string to vector embedding:
def initiate_connection(conn):
data = conn.recv(1024)
conn.send(session.run(embed([data])))
conn.close()
# Process in background, waiting for TCP message from views.py
while True:
conn, addr = _socket.accept()
_thread = Thread(target=initiate_connection, args=(conn,)) # new thread for each request (could be limited to n threads later)
_thread.demon = True
_thread.start()
conn.close()
НоЯ получаю следующую ошибку при выполнении conn.send(session.run(embed([data])))
:
RuntimeError: Модуль должен быть применен к графу, для которого он был создан.
Я в основномпытается предварительно загрузить таблицу в tenorflow (потому что это занимает довольно много времени), но тензор потока не позволяет мне использовать заранее определенный сеанс.
Как я могу это исправить?Есть ли способ предварительно загрузить эти переменные?
PS Я считаю, эта страница проблемы Github может иметь решение для моей проблемы, но я не уверен, как это можно реализовать.