Импорт Keras нарушает многопроцессорность - PullRequest
0 голосов
/ 10 мая 2018

При использовании керасов я обнаружил, что не могу использовать мультипроцессинг. После некоторого устранения неполадок, я думаю, что импорт keras является источником проблемы и создал простой пример этого.

import keras
from multiprocessing import Pool

def foo(q,y):
    print("In foo")
    return q,y
def test(a, b):
    x = []
    if __name__ == '__main__':
        p = Pool(5)
        print("Starting")
        x = p.starmap(foo, [[a,2],[b,4]])
        print("Finished")
        p.close()
        p.join()
    print(x)

if __name__ == '__main__':
    test(1,3)

выход

> Starting

При запуске выдает «Старт», затем зависает. Если я удаляю импорт keras, он работает нормально и выводит [(1, 2), (3, 4)], как и ожидалось. Любая идея, как я могу решить эту проблему или что может быть причиной? Я не до конца понимаю, как многопроцессорная работа с Python. Спасибо!

Я использую анаконду и шпион для своего кода.

1 Ответ

0 голосов
/ 10 мая 2018

Вот возможное решение этой проблемы, которое сработало для меня, поскольку дочерние процессы не требуют импорта керас.

if __name__ != '__mp_main__': #This line solves the problem
    import keras
from multiprocessing import Pool

def foo(q,y):
    print("In foo")
    return q,y
def test(a, b):
    x = []
    if __name__ == '__main__':
        p = Pool(5)
        print("Starting")
        x = p.starmap(foo, [[a,2],[b,4]])
        print("Finished")
        p.close()
        p.join()
    print(x)

if __name__ == '__main__':
    test(1,3)
    print(keras.backend)

Как я нашел это решение, было очень странно. Я запустил оригинальный код, и он завис как обычно. Затем, даже когда он завис, я закомментировал строку импорта и сохранил файл для следующего теста. Как только я это сделал, код как-то завершился. Я проверил это несколько раз, чтобы убедиться, что это не случайность. Как редактирование файла уже запущенной программы может повлиять на ее работу? Затем я подумал, что if __name__ == '__main__' может быть похож на if (fork () == 0) в c, поэтому я включил его во время импорта, чтобы дочерние процессы не запускали его. Так же, как если бы я вручную комментировал это и сохранял во время выполнения. Я проверил это, и оно работает.

Редактировать: Если вы используете if __name__ == __main__, тогда наследование нарушается, так как они не являются основными, как кажется. mp_main - это имя работников пула, и это также работает

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