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

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
      
      





それだけです!








All Articles