Стремительная проблема выполнения при распараллеливании предсказаний модели в керах с использованием многопроцессорной обработки для python - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь выполнять предсказания модели параллельно, используя команду model.predict, предоставленную keras в python2. Я использую tenorflow 1.14.0 для python2. У меня есть 5 файлов модели (.h5), и я хотел бы, чтобы команда предсказания выполнялась параллельно для нескольких входов. Прогноз выполняется последовательно каждой моделью для входных данных. Входы подаются параллельно. Файлы моделей загружаются заранее. Код такой, как показано ниже,

import matplotlib as plt
import numpy as np
import cv2
import multiprocessing
import tensorflow as tf
from contextlib import closing
import time

models=['model1.h5','model2.h5','model3.h5','model4.h5','model5.h5']
loaded_models=[]
for model in models:
    loaded_models.append(tf.keras.models.load_model(model))

def prediction(input_tuple):
    inputs,loaded_models=input_tuple
    predops=[]
    for model in loaded_models:
        predops.append(model.predict(inputs).tolist()[0])
    actops=[]
    for predop in predops:
        actops.append(predop.index(max(predop)))
    max_freqq = max(set(actops), key = actops.count) 
    return max_freqq

#....some pre-processing....#

    '''new_all_t is a list which contains tuples and each tuple has inputs from all_t 
    and the list containing loaded models which will be extracted
 in the prediction function.'''

new_all_t=[]
for elem in all_t:
    new_all_t.append((elem,loaded_models))
start_time=time.time()
with closing(multiprocessing.Pool()) as p:
    predops=p.map(prediction,new_all_t)
print('Total time taken: {}'.format(time.time() - start_time))

new_all_t - это список, который содержит кортежи, и каждый кортеж имеет входные данные из all_t и список, содержащий загруженные модели, которые будут извлечены в функции прогнозирования. Однако я получаю следующая ошибка сейчас,

Traceback (most recent call last):
  File "trial_mult-ips.py", line 240, in <module>
    predops=p.map(prediction,new_all_t)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 253, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 572, in get
    raise self._value
NotImplementedError: numpy() is only available when eager execution is enabled.

Что именно это означает? Как мне go решить эту проблему?

ОБНОВЛЕНИЕ: Я включил строки tf.compat.v1.enable_eager_execution () и tf.compat.v1.enable_v2_behavior () на самом начало. Теперь я получаю следующую ошибку:

WARNING:tensorflow:From /home/nick/.local/lib/python2.7/site-packages/tensorflow/python/ops/math_grad.py:1250: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where

Traceback (most recent call last):
  File "the_other_end-mp.py", line 216, in <module>
    predops=p.map(prediction,modelon)
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 253, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/lib/python2.7/multiprocessing/pool.py", line 572, in get
    raise self._value
ValueError: Resource handles are not convertible to numpy.

Я не могу интерпретировать это сообщение об ошибке, и как мне go решить эту проблему? Любой совет очень ценится!

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