2017-09-29 9 views
1

私はこれを理解できないようです。私はscikit-learnで訓練されたモデルを.pklファイルに保存しました。それに基づいて予測を行うAPIを作成したいと思います。スクールモデルが公開されていないGunicorn/flask API

私は既に予測を行うコードを持っており、コンソール/ユニットテストからうまく動作します。予測を高速化するために、データ(何千もの画像パッチ)を分割し、joblib/multiprocessingを使用して負荷を分散しています。

multiprocessingプロセス内で使用すると、scikit-learnがハングするので、JOBLIB_START_METHOD=forkserverと設定しています。

私はflaskでこのコードを使ったAPIを手に入れました。フラスコのデベロッパーサーバーで実行するとうまくいきます。現在、flaskアプリをgunicorn以内にホストしようとしていますが、まったく機能しません。

デフォルトのワーカーを使用すると、予測するときにエラーなしでハングするだけです。フォークサーバーのマルチプロセッシングを設定していない場合と同じです。私はこのようなgunicornを実行している:

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

私もgeventバックエンドを使用してみました。これは、実際に作業を行いますが、それは非常に遅いです、そしてそれは、これを出力します。

だから、

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

、これが実行されている複数のWeb労働者がありますような方法で動作するようになって上の任意のアイデアを、私はそれはケースだとは思いません(フラスコのデベロッパーサーバーで)joblib/multiprocessingをリクエストできるようになりましたか?ありがとう

答えて

0

geventは、リクエストを同時に処理するためにスレッドを生成します(これはdiscussionを参照してください)。これは実際の警告です。第2に、joblibが並列呼び出しを順次呼び出しに変換して実行するため、非常に遅いです(discussion参照)。

私は、joblibを使用して並列処理を実行しているときに同じ問題に直面しました。私はsklearnを使用しませんでしたが、私は、次のコマンドは、同様にあなたのために働くべきだと思う:あなたは完全なソースコードを見てしたい場合は

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

は、あなたがそれを hereに従うことができます。

関連する問題