2016-11-28 6 views
12

Ich benutze Python und Keras (derzeit Theano Backend, aber ich habe keine Bedenken mit dem Wechsel). Ich habe ein neuronales Netzwerk, das mehrere Informationsquellen parallel lädt und verarbeitet. Momentan habe ich jeden in einem separaten Prozess ausgeführt und lädt eine eigene Kopie des Netzwerks aus der Datei. Dies scheint eine Verschwendung von RAM zu sein, daher dachte ich, es wäre effizienter, einen einzigen Multithread-Prozess mit einer Instanz des Netzwerks zu haben, die von allen Threads verwendet wird. Ich frage mich jedoch, ob Keras Thread mit beiden Backend sicher ist. Wenn ich .predict(x) auf zwei verschiedenen Eingängen gleichzeitig in verschiedenen Threads ausführen, werde ich in Race-Bedingungen oder andere Probleme auftreten?Ist Keras Gewinde sicher?

Dank

Antwort

6

Ja, Keras Thread-sicher ist, wenn Sie ein wenig Aufmerksamkeit zu schenken.

In der Tat gibt es in Verstärkung Lernen einen Algorithmus namens Asynchronous Advantage Actor Critics (A3C), wo jeder Agent auf dem gleichen neuronalen Netzwerk angewiesen ist, ihnen zu sagen, was sie in einem bestimmten Zustand tun sollten. Mit anderen Worten, jeder Thread ruft model.predict gleichzeitig wie in Ihrem Problem auf. Eine Beispielimplementierung mit Keras davon ist here.

Sie sollen aber achten Sie besonders auf diese Zeile, wenn Sie in den Code sehen: model._make_predict_function() # have to initialize before threading

Dies wird nie in der Keras docs erwähnt, aber es ist notwendig, um es gleichzeitig zu arbeiten. Kurz gesagt, _make_predict_function ist eine Funktion, die die predict Funktion kompiliert. In der Multi-Thread-Einstellung müssen Sie diese Funktion manuell aufrufen, um predict im Voraus zu kompilieren, andernfalls wird die predict-Funktion nicht kompiliert, bis Sie es das erste Mal ausführen, was problematisch sein wird, wenn viele Threading-Aufrufe es sofort aufrufen. Sie können eine detaillierte Erklärung here sehen.

Ich habe bis jetzt keine anderen Probleme mit Multi Threading in Keras getroffen.