Я пытаюсь выполнить прогнозирование модели параллельно, используя команду model.predict, предоставленную keras в python2. Я использую тензор потока 1.14.0 для python2. У меня есть 5 файлов модели (.h5), и я хотел бы, чтобы команда предсказания выполнялась параллельно. Это выполняется в python 2.7. Я использую многопроцессорный пул для сопоставления имен файлов модели с помощью функции прогнозирования для нескольких процессов, как показано ниже,
import matplotlib as plt
import numpy as np
import cv2
from multiprocessing import Pool
pool=Pool()
def prediction(model_name):
global input
from tensorflow.keras.models import load_model
model=load_model(model_name)
ret_val=model.predict(input).tolist()[0]
return ret_val
models=['model1.h5','model2.h5','model3.h5','model4.h5','model5.h5']
start_time=time.time()
res=pool.map(prediction,models)
print('Total time taken: {}'.format(time.time() - start_time))
print(res)
Входные данные - это массив изображений numpy, полученный из другой части кода. Но при выполнении этого я получаю следующее:
Traceback (most recent call last):
Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 267, in _bootstrap
File "/usr/lib/python2.7/multiprocessing/process.py", line 267, in _bootstrap
self.run()
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
File "/usr/lib/python2.7/multiprocessing/pool.py", line 102, in worker
self._target(*self._args, **self._kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 102, in worker
task = get()
File "/usr/lib/python2.7/multiprocessing/queues.py", line 376, in get
task = get()
File "/usr/lib/python2.7/multiprocessing/queues.py", line 376, in get
return recv()
return recv()
AttributeError: 'module' object has no attribute 'prediction'
AttributeError: 'module' object has no attribute 'prediction'
Я не могу интерпретировать это сообщение об ошибке, и как мне go решить эту проблему? Любой совет очень ценится!
ОБНОВЛЕНИЕ 2: Спасибо за все ссылки и полный пример @sokato. Я выполнил точный код, отправленный @sokato, однако я получил следующую ошибку (я тоже внес изменения в свой код и получил ту же ошибку, показанную ниже),
Traceback (most recent call last):
File "stackoverflow.py", line 47, in <module>
with multiprocessing.Pool() as p:
AttributeError: __exit__
ОБНОВЛЕНИЕ3: * 1015 Спасибо за поддержку. Я думаю, что проблема в UPDATE2 была вызвана использованием python2 вместо python3. Я смог решить ошибку, указанную в UPDATE2 для python2, используя with closing(multiprocessing.Pool()) as p:
вместо просто with multiprocessing.Pool() as p:
в коде @ sokato. Импортируйте функцию закрытия следующим образом: from contextlib import closing
НОВЫЙ ПРОБЛЕМА С ИСПОЛЬЗОВАНИЕМ ПОДХОДА, ПОКАЗАННОГО НИЖЕ,
У меня фактически есть несколько входных данных. Вместо загрузки каждой модели Время для каждого ввода Я хочу загрузить все модели заранее и сохранить его в списке. Я сделал это, как показано ниже,
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 решить эту проблему?
UPDATE4: Я включил строки 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 решить эту проблему? Любой совет очень ценится!