Keras + Tensorflow et Multiprocessing en Python

J'utilise des Keras avec Tensorflow comme backend.

j'essaie de sauvegarder un modèle dans mon processus principal puis de charger/exécuter (i.e. appeler model.predict ) dans un autre processus.

je suis en train d'essayer l'approche naïve de la docs pour sauver/charger le modèle: https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model .

Donc en gros:

  1. model.save() dans le procédé principal
  2. model = load_model() de l'enfant dans le processus de
  3. model.predict() de l'enfant dans le processus de

cependant, il s'accroche simplement à l'appel load_model .

en cherchant autour de j'ai découvert cette réponse potentiellement liée suggérant que Keras ne peut être utilisé que dans un seul processus: en utilisant multiprocessing avec theano mais je ne suis pas sûr si c'est vrai (ne peut pas sembler renseignez-vous bien sur ce point).

y a-t-il un moyen d'atteindre mon but? Une description de haut niveau ou un bref exemple est grandement apprécié.

Note: j'ai essayé des approches dans le sens de passer un graphe au processus, mais j'ai échoué car il semble que les graphes tensorflow ne soient pas sélectionnables (lien donc post ici: TensorFlow: passer une session à un multiprocess python ). S'il y a bien un moyen de passer le graphe/modèle tensorflow je suis également ouvert au processus de l'enfant.

Merci!

21
demandé sur Community 2017-02-28 12:20:05

2 réponses

D'après mon expérience - le problème réside dans le chargement de Keras à un processus et ensuite la reproduction d'un nouveau processus lorsque le keras a été chargé à votre environnement principal. Mais pour certaines applications (comme la formation d'un mélange de Keras modèles), il est tout simplement préférable d'avoir toutes ces choses en un seul processus. Donc, ce que je conseille est l'approche suivante (un peu lourde - mais travailler pour moi):

  1. NE PAS CHARGEZ KERAS À VOTRE ENVIRONNEMENT PRINCIPAL . Si vous voulez charger Keras / Theano / TensorFlow, faites-le seulement dans l'environnement de fonction. E. g. ne pas faites ceci:

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

    mais faire ce qui suit:

    def training_function(...):
        import keras
        ...
    
  2. exécuter le travail relié à chaque modèle dans un processus séparé: je crée habituellement des travailleurs qui font le travail (comme par exemple la formation, l'ajustement, la notation) et je les exécute dans des processus séparés. Ce qui est agréable à ce sujet que toute la mémoire utilisée par ce processus est complètement libéré lorsque votre processus est terminé. Cela vous aide avec les charges de problèmes de mémoire que vous rencontrez généralement lorsque vous utilisez multiprocessing ou même l'exécution de plusieurs modèles dans un processus. Cela ressemble par exemple à ceci:

    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()
    

une approche différente consiste simplement à préparer différents scripts pour différentes actions modèles. Mais cela peut causer des erreurs de mémoire, surtout lorsque vos modèles consomment de la mémoire. NOTE que pour cette raison il est préférable de rendre votre exécution strictement séquentielle.

30
répondu Marcin Możejko 2018-01-15 06:40:27

j'ai créé un exemple simple pour montrer comment exécuter Keras modèle dans plusieurs processus avec plusieurs gpu. J'espère que cet échantillon pourra vous aider. https://github.com/yuanyuanli85/Keras-Multiple-Process-Prediction

4
répondu VictorLi 2017-06-01 06:48:39