Совместное использование сохраненной модели тензорного потока среди дочерних процессов - PullRequest
0 голосов
/ 22 февраля 2019

Я создал класс предиктора (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 для этого предиктора?

1 Ответ

0 голосов
/ 22 февраля 2019

Многопроцессорность разветвляет ваш процесс, поэтому у вас есть копия.Совместное использование памяти возможно, например, через joblib .По сути, ваш объект становится отображенным в памяти объектом на диске.Отличное решение, если у вас есть приличный SSD (или лучше).

Диспетчер из многопроцессорная обработка может быть вариантом, но я бы не стал на это ставить.

...