Сделай сам веб-сервис с асинхронными очередями и параллельным исполнением

rq . , - caffe. — , , … RQ .


- , . , .





(, JPEG). , . JSON. HTTP.


- HTTP- ( API):



Ubuntu


HTTP- Flask. :


pip:


sudo apt-get install python-pip sudo apt-get install --upgrade pip 

実際、Flaskのインストール:


 pip install flask 

次に、 Redis-データウェアハウスおよびメッセージブローカーをインストールする必要があります。


 wget http://download.redis.io/redis-stable.tar.gz tar xvzf redis-stable.tar.gz cd redis-stable make sudo make install 

RQライブラリ(Redisキュー)をインストールします。


 pip install rq 

すべてのコンポーネントを自動的に起動して構成するには、 Supervisorを使用します。


 sudo apt-get install supervisor 

サービスを書く


Flaskでは簡単です。 deep_service.pyファイルを作成します。


 #  ,      BASEDIR = '/home/sergey/verysecure' #   import argparse import os import json #       from flask import Flask app = Flask(__name__) from redis import Redis from rq import Queue # ,    ,     #classify.py - ,      caffe #,       from classify import main #    Redis q = Queue(connection=Redis(), default_timeout=3600) #    API @app.route('/process/<path:file_path>') def process(file_path): full_path = os.path.join(BASEDIR, file_path) #     BASEDIR argv = {'input_file': full_path, 'gpu': True} args = argparse.Namespace(**argv) r = q.enqueue_call(main, args=(args,), result_ttl=86400) return r.id #   :  4-     , #   JSON   numpy def decimal_default(obj): if isinstance(obj, float32): return round(float(obj), 4) else: raise TypeError() #    API @app.route('/result/<id>') def result(id): try: job = q.fetch_job(id) if job.is_finished: return json.dumps(job.result, ensure_ascii=False, default=decimal_default) else: return 'Not ready', 202 except: return "Not found", 404 if __name__ == '__main__': app.run() #app.run(debug=False, host='0.0.0.0') 

手動開始-動作を確認する


この時点で、Webサービスが機能しているかどうかを確認できます。 Redisを起動します。


 redis-server 

1つのワークフローを開始します(データ処理に必要な場合は、プロセッサコアの数や複数のビデオカードの存在などによって、それらのいくつかを実行できます)。 計算関数が起動されるディレクトリからプロセスを開始することをお勧めします。ここでは、 classif.pyが存在する場所です


 rq worker 

httpサーバーを起動します。


 python deep_service.py 

cat.jpg画像を入力データのディレクトリに書き込み、サービスリクエストを実行します。


 wget 127.0.0.1/process/cat.jpg 

応答として、ジョブIDを取得します。 識別子をコピーして、サービスへの2番目のリクエストを実行します。


 wget 127.0.0.1/result/[] 

応答として、IMAGENETカテゴリに属する​​画像の重みを含むJSON文字列を取得します。
これで、サーバーコンポーネントの自動起動を構成できます。


オートスタート


スーパーバイザーのセットアップは、おそらくこの旅で最も難しい部分です。 ここでスーパーバイザーのセットアップに関する良いチュートリアルです


まず、スーパーバイザーが各プロセスを独自の環境で実行することを理解する必要があります。 複雑な計算のほとんどの場合、それらを実装するプログラムはパスなどの多くの設定に依存します。 これらの設定は通常/home/usersname/.bashrcに保存されます


たとえば、ニューラルネットワークコンピューティングのcaffeライブラリとそれに対応するPythonモジュールでは、このファイルに次の行を追加する必要がありました。


 export PATH=/usr/local/cuda-7.5/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH LD_LIBRARY_PATH=/home/username/caffe/build/lib:$LD_LIBRARY_PATH export PYTHONPATH="${PYTHONPATH}:/home/username/caffe/python" 

これらの行をクリップボードにコピーしてください!


/ usr / local / binディレクトリで、 deep_worker.shファイルを作成します


 #!/bin/bash cd /home/username/caffe/python export PATH=/usr/local/cuda-7.5/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH LD_LIBRARY_PATH=/home/username/caffe/build/lib:$LD_LIBRARY_PATH export PYTHONPATH="${PYTHONPATH}:/home/username/caffe/python" rq worker 

さて、最初の行で作業ディレクトリに移動し、.bashrcからコピーした環境変数を貼り付けてから、プロセスを開始します。


ディレクトリ/ usr / local / binに、ファイルdeep_flask.shを作成します


 #!/bin/bash cd /home/username/caffe/python export PATH=/usr/local/cuda-7.5/bin:$PATH export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH LD_LIBRARY_PATH=/home/username/caffe/build/lib:$LD_LIBRARY_PATH export PYTHONPATH="${PYTHONPATH}:/home/username/caffe/python" python deep_service.py 

再び-最初の行で作業ディレクトリに移動し、.bashrcからコピーした環境変数を貼り付けて、Flaskサーバーを起動します。


少しのシステム管理:


 sudo chmod +x /usr/local/bin/deep_flask.sh sudo chmod +x /usr/local/bin/deep_worker.sh mkdir /var/log/deepservice 

/etc/supervisor/conf.dディレクトリで、 deepservice.confファイルを作成します。


 [program:redis] command=/usr/local/bin/redis-server autostart=true autorestart=true stderr_logfile=/var/log/deepservice/redis.err.log stdout_logfile=/var/log/deepservice/redis.out.log [program:worker1] command=/usr/local/bin/deep_worker.sh autostart=true autorestart=true stderr_logfile=/var/log/deepservice/worker1.err.log stdout_logfile=/var/log/deepservice/worker1.out.log user=username directory=/home/username/caffe/python [program:flask] command=/usr/local/bin/deep_flask.sh autostart=true autorestart=true stderr_logfile=/var/log/deepservice/flask.err.log stdout_logfile=/var/log/deepservice/flask.out.log user=username directory=/home/username/caffe/python 

最後に、この構成全体を実行します。


 sudo supervisorctl reread sudo supervisorctl update 

それだけです!



Source: https://habr.com/ru/post/J307140/


All Articles