2017-09-29 1 views
1

Ich kann nicht scheinen, dies herauszufinden. Ich habe ein Modell, das mit scikit-learn trainiert wurde, in einer .pkl-Datei gespeichert wurde, und ich möchte eine API erstellen, die darauf basierende Vorhersagen macht.Gunicorn/flask API, um ein sklearn-Modell nicht verfügbar zu machen

Ich habe bereits den Code, der Vorhersagen macht und es läuft gut aus Konsolen/Unit-Tests. Um Vorhersagen zu beschleunigen, teile ich die Daten (Tausende von Bildflecken) und spreize die Last unter Verwendung joblib/multiprocessing.

Ich setze JOBLIB_START_METHOD=forkserver seit scikit-lernen hängt, wenn aus einem multiprocessing Prozess verwendet.

Ich habe eine API mit flask, die diesen Code verwendet, und wenn mit dem DevServer von Flasch läuft es funktioniert gut. Jetzt versuche ich die flask App innerhalb gunicorn zu hosten und es funktioniert überhaupt nicht.

Wenn ich die Standard-Worker verwende, dann hängt es einfach ohne Fehler bei der Vorhersage, ähnlich wie wenn ich nicht den 'Forkserver' Multiprocessing gesetzt hätte. Ich bin mit gunicorn wie folgt aus:

JOBLIB_START_METHOD=forkserver gunicorn -w 2 -b 0.0.0.0:$PORT --timeout 3600 web.app:app

Ich habe auch versucht die gevent Backend verwenden. Dies macht eigentlich Arbeit, aber es ist sehr langsam, und es druckt diese:

Multiprocessing backed parallel loops cannot be nested below threads, setting n_jobs=1

Also, alle Ideen auf, diese immer in einer Art und Weise zu arbeiten, dass es läuft mehrere Web-Arbeiter (ich glaube nicht, dass der Fall ist mit dem dev-Server von flask) und mit einer Anfrage, die in der Lage ist, joblib/multiprocessing zu nutzen? Danke

Antwort

0

Gevent wird nicht mit joblib arbeiten, da es Threads hervorbringt, um Anträge gleichzeitig zu behandeln (Beziehen Sie dieses discussion) und das ist, was Ihre Warnung wirklich sagt. Zweitens ist es sehr langsam, weil joblib Ihre parallelen Aufrufe in sequenzielle Aufrufe umwandelt und ausführt (siehe discussion).

Ich tat das Gesicht das gleiche Problem bei der Durchführung von Parallelität mit joblib. Obwohl ich nicht sklearn verwendet haben, denke ich, die folgenden Befehl sollte auch für Sie arbeiten:

gunicorn -b 0.0.0.0:$SERVICE_PORT --workers=2 -t $SERVICE_TIMEOUT rest_api:app 

Wenn Sie einen Blick auf das komplette Quellcode haben wollen, können Sie es here folgen.

Verwandte Themen