- , . , .
(, JPEG). , . JSON. HTTP.
- HTTP- ( API):
- /process/[ ] — ( , )
- /result/[ ] — ( , 202 «Not ready», — json, , 404 «Not found»)
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
それだけです!