7

Używam Keras z Tensorflow jako zaplecza.Keras + Tensorflow i Multiprocessing w Pythonie

Próbuję zapisać model w moim głównym procesie, a następnie załadować/uruchomić (to jest wywołanie model.predict) w ramach innego procesu.

Obecnie próbuję tylko naiwnego podejścia z dokumentów, aby zapisać/załadować model: https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model.
Więc zasadniczo:

  1. model.save() w głównym procesie
  2. model = load_model() w procesie potomnym
  3. model.predict() w procesie potomnym

Jednak to po prostu wisi na wezwanie load_model.

Poszukiwanie Odkryłem tę potencjalnie pokrewną odpowiedź sugerującą, że Keras może być wykorzystywany tylko w jednym procesie: using multiprocessing with theano, ale nie jestem pewien, czy to prawda (nie można znaleźć zbyt wiele na ten temat).

Czy istnieje sposób na osiągnięcie mojego celu? Wysoko oceniany jest krótki opis lub krótki przykład.

Uwaga: Podjęto próbę podążania wzdłuż przebiegu wykresu do procesu, ale nie udało mi się, ponieważ wydaje się, że wykresów tensorflow nie można doczepić (powiązany wpis SO dla tego tutaj: Tensorflow: Passing a session to a python multiprocess). Jeśli rzeczywiście istnieje sposób na przekazanie wykresu/modelu tensorflow do procesu potomnego, jestem również otwarty na to.

Dzięki!

Odpowiedz

15

Z mojego doświadczenia wynika, że ​​problem polega na załadowaniu Keras do jednego procesu, a następnie wygenerowaniu nowego procesu, gdy keras został załadowany do głównego środowiska. Ale w przypadku niektórych aplikacji (jak na przykład szkolenie mieszanki modeli Keras) po prostu lepiej mieć wszystkie te rzeczy w jednym procesie. Więc co radzę jest następujący (trochę kłopotliwe - ale pracuje dla mnie) podejście:

  1. nie ładują Keras do głównego ŚRODOWISKA. Jeśli chcesz załadować Keras/Theano/TensorFlow, rób to tylko w środowisku funkcji. Na przykład. nie to zrobić:

    import keras 
    
    def training_function(...): 
        ... 
    

    jednak wykonać następujące czynności:

    def training_function(...): 
        import keras 
        ... 
    
  2. Run pracy związanej z każdego modelu w oddzielnym procesie: Ja zwykle tworząc pracowników, które czynią praca (np. szkolenie, strojenie, ocenianie) i uruchamiam je w oddzielnych procesach. Co jest miłe, że cała pamięć używana przez ten proces jest całkowicie uwolniona po zakończeniu procesu. Pomaga to w wielu problemach z pamięcią, z którymi zwykle spotykamy się podczas korzystania z procesu wieloprocesowego lub nawet uruchamiania wielu modeli w jednym procesie. Tak wygląda to na przykładtak:

    def _training_worker(train_params): 
        import keras 
        model = obtain_model(train_params) 
        model.fit(train_params) 
        send_message_to_main_process(...) 
    
    def train_new_model(train_params): 
        training_process = multiprocessing.Process(target=_training_worker, args = train_params) 
        training_process.start() 
        get_message_from_training_process(...) 
        training_process.join() 
    

inne podejście jest po prostu przygotowuje różne scenariusze dla różnych działań modelowych. Ale może to powodować błędy pamięci, szczególnie gdy twoje modele zużywają dużo pamięci. UWAGA z tego powodu lepiej wykonać sekwencję wykonania ściśle sekwencyjnie.

+0

Marcin, dziękuję bardzo za odpowiedź. Pytanie boczne: powyższe pytanie dotyczące SO jest spowodowane chęcią zrównoleglania prognoz dla jednego modelu w wielu procesach graficznych. Zadałem pytanie SO o tym trochę czasu bez powodzenia: http://stackoverflow.com/questions/42409884/keras-tensorflow-prediction-on-multiple-gpus. Czy mógłbyś coś zrobić? Z góry dziękuję. Daj mi znać, jeśli potrzebujesz więcej szczegółów. –

+0

Muszę rzucić okiem. Jest to również coś, co mnie również interesuje - ale nie wdrożyłem jeszcze takiego rozwiązania. Wdrożyłem proces przypominający, który otrzymuje obraz do przetworzenia przez mieszaninę głębokich CNN-ów i stąd pochodzi mój przykład. –

Powiązane problemy