Загрузка и запуск модели Tensorflow из разных потоков - PullRequest
0 голосов
/ 07 апреля 2020

Поддерживается ли правильная загрузка и прогнозирование модели в разных потоках в Tensorflow?

Некоторый фон:

При попытке загрузить модель в потоке A и затем прогнозировать ее в потоке B нам выдается следующее сообщение об ошибке:

ValueError: Tensor SOME_TENSOR is not an element of this graph.

Я нашел этот поток TF GitHub , предлагая решить его путем сохранения графика при загрузке модели и использования его по умолчанию при прогнозировании. Вроде как это:

# thread A
global graph
graph = tf.get_default_graph()

...

# thread B
with graph.as_default():
    preds = model.predict(image)

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

tensorflow.python.framework.errors_impl.FailedPreconditionError:
Failed precondition: Error while reading resource variable lstm_2_3/bias from Container: localhost. This could mean that the variable was uninitialized. Not found: Container localhost does not exist. (Could not find resource: localhost/lstm_2_3/bias)

Я начал с исправления keras.backend.get_session().run(tf.compat.v1.global_variables_initializer()) но это не сработало, выдавая неверные прогнозы. Вместо этого я решил трактовать сессию так же, как график, и перенести ее с момента загрузки модели.

Таким образом, у меня есть следующее решение:

# thread A
global graph
global sess
graph = tf.get_default_graph()
sess = K.get_session()

...

# thread B
with graph.as_default():
    try: 
        preds = model.predict(image)
    except FailedPreconditionError:
        K.set_session(sess)
        preds = model.predict(image)

Не Я собираюсь ie, это кажется хакерским. Это правильный способ обработки загрузки / прогнозирования модели в отдельных потоках? Что-то не так с этим подходом?

1 Ответ

1 голос
/ 07 апреля 2020

Кажется, что keras / tenorflow просто не ориентирован на многопотоковое исполнение, однако в этом случае можно заставить его работать. Это вряд ли правильный способ решить проблему, но мне помогло изменение способа загрузки модели.

def load_threadsafe():
    model = load()  # your usual model loading
    model._make_predict_function()
    return model

Обратите внимание на вызов защищенного метода _make_predict_function, который все еще хакерский. @Fgerard поделился решением этой проблемы . Насколько я могу судить, _make_predict_function вызывается внутренне при первом прогнозировании, и вызов его из неосновного потока вызывает проблемы. Следовательно, решение состоит в том, чтобы вызвать его явно, прежде чем делать какие-либо прогнозы в потоке, который загружает модель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...