Я создал класс предиктора (Python), который использует тензор потока для прогнозирования классов
class IndustryPredictor:
def __init__(self):
self.predictor = self.load_predictor()
def load_predictor(self):
import tensorflow as tf
confi_obj = ConfigParser()
classifier_dir = confi_obj.classifier_directory
predictor_model_dir_name = confi_obj.predictor_directory
model_path = os.path.join(classifier_dir, predictor_model_dir_name)
return tf.contrib.predictor.from_saved_model(model_path)
def _create_float(v):
return tf.train.Feature(float_list=tf.train.FloatList(value=[v]))
def _create_str(v):
return tf.train.Feature(bytes_list=tf.train.BytesList(value=[bytes(v, 'utf-8')]))
def predict(description):
doc_text = preprocess(description)
text = _create_str(doc_text)
dlen = _create_float(len(doc_text.split()))
predicate = {'clean_text': text, 'len': dlen}
example = tf.train.Example(features=tf.train.Features(feature=predicate))
inputs = example.SerializeToString()
preds = self.predictor({"inputs": [inputs]})
return preds
Это прекрасно работает в среде с одним процессом.Я пытаюсь использовать модуль multiprocessing
для ускорения обработки.Я могу создать этот объект в дочерних процессах, и он работает нормально, но так как моя модель сама по себе имеет размер 1 ГБ, я могу запускать дочерние процессы только до определенного предела.
Я думал о том, чтобы загрузить сохраненную модель в родительский процесс и каким-то образом передать ее дочернему процессу, поэтому мне нужно загрузить модель только один раз.Я пытался сделать это, но процесс зависает.
def main():
workers = 8
predictor = load_predictor()
pool = Pool(processes=workers)
for i in range(0, workers):
pool.apply_async(consume, args=(predictor,), error_callback=handle_error)
# Stay alive
try:
while True:
continue
except KeyboardInterrupt:
logger.error(' [*] Exiting...')
pool.terminate()
pool.join()
Есть ли способ поделиться объектом tf.contrib.predictor
тензорного потока в дочерних процессах.Поможет ли мне написать обертку keras
для этого предиктора?