2016-11-28 15 views
12

Korzystam z Pythona i Keras (obecnie używam backend Theano, ale nie mam żadnych problemów z przełączaniem). Mam sieć neuronową, którą ładuję i przetwarzam równolegle wiele źródeł informacji. Obecnie pracuję nad każdym z nich w osobnym procesie i ładuję z pliku własną kopię sieci. Wydaje się, że jest to strata pamięci RAM, więc pomyślałem, że bardziej wydajne będzie posiadanie jednego wielowątkowego procesu z jednym wystąpieniem sieci używanym przez wszystkie wątki. Zastanawiam się jednak, czy Keras jest bezpieczny dla wątków z dowolnym zapleczem. Jeśli uruchomię .predict(x) na dwóch różnych wejściach w tym samym czasie w różnych wątkach, czy natknę się na warunki wyścigu lub inne problemy?Czy wątki Keras są bezpieczne?

Dzięki

Odpowiedz

6

Tak, Keras jest bezpieczne wątek, jeśli zapłacisz trochę uwagi.

W uczeniu się wzmacniania istnieje algorytm o nazwie Asynchronous Advantage Actor Critics (A3C), w którym każdy agent opiera się na tej samej sieci neuronowej, aby powiedzieć im, co powinien zrobić w danym stanie. Innymi słowy, każdy wątek wywołuje jednocześnie model.predict, tak jak w twoim problemie. Przykładową implementacją z Kerasami jest here.

Należy jednak zwrócić szczególną uwagę na tej linii, jeśli spojrzał w kodzie: model._make_predict_function() # have to initialize before threading

To nigdy nie jest wymieniona w docs Keras, ale jego konieczne, aby pracować jednocześnie. W skrócie, _make_predict_function jest funkcją, która kompiluje funkcję predict. W ustawieniu wielu wątków musisz ręcznie wywołać tę funkcję, aby kompilować predict z wyprzedzeniem, w przeciwnym razie funkcja predict nie zostanie skompilowana, dopóki nie uruchomisz jej po raz pierwszy, co będzie problematyczne, gdy wiele wątków wywoła ją jednocześnie. Możesz zobaczyć szczegółowe wyjaśnienie here.

Nie spotkałem się z żadnymi innymi problemami z wielowątkowością w Kerasie do tej pory.

Powiązane problemy