Python の超お手軽のネットワーク分散コンピューティングライブラリSCOOP
公開日:
:
最終更新日:2017/02/13
Python multiprocessing, python, scoop
目次
SCOOPとは
- ssh とPython の設定を適切にするだけで、簡単にネットワーク間での分散処理が実行できる。
- ネットワーク分散に対応していないライブラリに便利。
- 関数の処理を分散して行い、返り値をまとめて返してくれる。
- Core 数に応じた Worker 数の設定が可能
- Docker との相性が抜群
基本動作
python 標準の map 関数の使い方で ssh で繋いだ先(ノード)でも分散処理してくれる。multiprocessing.Pool.map のネットワーク処理に対応した版。
map 関数に配列を渡すと配列の各要素を引数に関数を実行する。その際の各処理を各ノードでマルチプロセスで実行して、ホストPCに変数を返す。
通信には pickle 化された情報を送信している。
ssh で接続先の通信用ポートを開けて、ポートの情報をホストに送って通信。--tunnel
オプションを使えば、localhost 上に port fowarding する。この際のホストIPの解決には、ssh 上の host name が使われる。
サンプルコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import random import time import scoop import os from uuid import getnode as get_mac data = [random.randint(-1000, 1000) for r in range(1000)] class MyClass(object): def __init__(self): pass def my_method(self, data): time.sleep(0.01) return((os.getpid())) if __name__ == '__main__': # SCOOP's parallel function t = MyClass() process_list = list(scoop.futures.map(t.my_method, data)) unique_process = set(process_list) p_nums = {} for pid in unique_process: p_nums[pid] = len([tmp_pid for tmp_pid in process_list if tmp_pid == pid]) scoop.logger.info("last_value : %s"%(p_nums)) |
scoop.futures.map
という関数で並列したい関数と、並列したい引数を配列で渡す。
実行スクリプト
1 2 |
python -m scoop --host docker-host1 docker-host2 docker-host3 -n 16 --tunnel scoop_test.py |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[2017-02-12 14:27:32,585] launcher INFO SCOOP 0.7 1.1 on linux2 using Python 2.7.12 (default, Feb 7 2017, 14:01:56) [GCC 5.4.0 20160609], API: 1013 [2017-02-12 14:27:32,585] launcher INFO Deploying 16 worker(s) over 3 host(s). [2017-02-12 14:27:32,585] launcher INFO Worker distribution: [2017-02-12 14:27:32,585] launcher INFO docker-host1: 5 + origin [2017-02-12 14:27:32,586] launcher INFO docker-host2: 5 [2017-02-12 14:27:32,586] launcher INFO docker-host3: 5 [2017-02-12 14:27:34,415] __main__ INFO Worker(s) launched using /bin/bash [2017-02-12 14:27:35,551] scoop_test (127.0.0.1:58127) INFO last_value : {18305: 77, 3842: 45, 18307: 77, 3835: 47, 18309: 77, 18311: 78, 18313: 78, 18314: 51, 3837: 47, 10199: 65, 10201: 66, 10203: 66, 3841: 48, 10205: 65, 10206: 67, 3839: 46} [2017-02-12 14:27:35,879] launcher (127.0.0.1:41977) INFO Root process is done. [2017-02-12 14:27:33,542] __main__ INFO Worker(s) launched using /bin/bash [2017-02-12 14:27:34,092] __main__ INFO Worker(s) launched using /bin/bash [2017-02-12 14:27:36,533] launcher (127.0.0.1:41977) INFO Finished cleaning spawned subprocesses. |
last_value: の出力で、16個の pid
上で処理されているのが確認できる。
使い方
説明はウェブサイト上にもあるが、動かないサンプルコードも多くはまるので注意。
1. 分散処理をしたいPCでPythonの実行環境を揃える。
標準ではホストPC での Python の実行環境が接続先に渡されて分散処理されることになる。そのため、pyenv 等で /home/user
ディレクトリ下に実行環境があると user 名が一致しないためちゃんと動かない。/usr/local/bin/python に統一しておく等の処置が必要になる。
処理に必要なファイル等があれば、それも同一のパスとして各ノードに配置。
Docker との相性が良いのもこのあたり。Docker であれば、容易に同一環境を構築できる。
2. ssh サーバーの設定
パスワードなしの認証キー認証にする。パスワードありには対応していない。
3. ホストPCと各ノードでの ssh config の設定
ssh config での host name が ノードの PC の名前かIPでないと、エラーが出る。このあたりの説明がまったくなくて、ソースコードを追っかけるはめになった。
Docker上で実行したければ、--tunnel
オプションをつければ大丈夫。--tunnel
オプションを付けていれば、host name の問題は気にしなくていい。--tunnel
オプションに関する説明もドキュメントにはないので注意。
4. 実行時
1 2 |
python -m scoop --host docker-host1 docker-host2 docker-host3 -n 16 --tunnel scoop_test.py |
--host
ssh config 上での host name-n
合計のワーカー数--tunnel
ssh tunnel を使う
他にもホストごとにワーカー数を設定したりできるが、そのあたりは公式ドキュメントを参照してください。
導入の上での注意
- python の実行環境をすべて一致させておく必要がある。
- ここでの実行環境とは、フルパスでの実行パス。
- 各ライブラリ、実行ファイルともに同一パスに保存していること。
- Docker を使おう。
- 読み込むファイル等があれば、そのファイルはすべてのノード上に置く
- 使用するポートは予め開けておくか、
--tunnel
オプションを使う。 - ssh の設定名とホストPC の名前を一致、もしくはIPアドレスにしておく。
- 一致しない場合は
--external-hostname
オプションを使うが、一致させた専用のconfigファイルを作って置くほうが良い - IP の取得を PC の名前から取得しようとする。ローカルネットワーク内のみ、この方法が使える。
/etc/host
を編集して、ssh config の host name に IP を割り当ててもいけるはず。
- 一致しない場合は
雑感
分散処理したいメソッド内でshell command を叩いて、返り値を得たり等をすれば、Python 以外の言語の並列化にも使える。システムトレードのバックテストの並列化にはおすすめ。



About Fx-Kirin
2009年10月にFXを開始、翌年2010年5月から脱サラをしてFX業界に専念。 2012年10月頃から本格的に勝ち始め、一月で資産を倍にする、2年半月間負けなし等、安定した収支で2013年11月に生涯FX収支が1億を超える。 投資スタイルはシステムトレード。プログラミングの知識がほぼない状態から、独学で自分がしたいと思うことであればほぼ実現することが可能なレベルまで成長。好きな言語はRuby, Python。必要となればC++からVBA、Pascal等なんでも行う。MT4/MT5のプログラミングも得意。 2011年にはFXで稼いだ資金をもとにシンガポールに移住し、留学も兼ねて起業をチャレンジするほど、ビジネスを興すことに熱意がある。国内の業者を主に使い始めたことから、2012年に帰国。零細株式会社経営中。
- Web |
- More Posts (401)
Adsense
関連記事
-
-
Call Python/Numpy Function within Metatrader 4
Github Link [bm url="https://github.com/fx-kirin/mt4-nump
-
-
PythonのThreadを待機させるか、必要の度に作成するのかのベンチマーク比較
QueueとThreadのベンチマーク比較 2つのケースについて比較検証してみました。 実際に処理する内
-
-
ipdb だけではなく IPython.embed も使おう
ipdb だと複数行の挿入ができなかったりするが、その問題が解消される。明らかにこちらのほうが使い勝手がいい。行のデ
-
-
Python での ポートフォリオの計算
Python でのポートフォリオの計算 ポートフォリオの計算について色々調べてみた。とりあえず使いたいって人はpo
-
-
vim-slime を使って VIM の内容をコンソールに送信
この記事はVim Advent Calendar 2016の20日目の記事です。 選択行の内容をコンソールに送信
-
-
Interactive Brokers 証券の Python API を利用する
Interactive Brokers 証券とは 日本には珍しく自動売買プラットフォームが提供されいてる証券会社です。
-
-
vim-ipythonをWindows 7 x64で使うとR6034 が出る件
個人的なただの忘備録。 Visual Studioのコマンドプロンプトから実行すること。 http://st
-
-
Python Mock で オリジナルのインスタンメソッドのを呼びたい時
autospec と sideeffect を組み合わせるのが解決策だった。
-
-
Pythonのsocketでプロセス間通信をして価格データ等を送信する
どうも、お久しぶりです。キリンです。 取り敢えず1ヶ月ほど、連続でブログの更新を続けてみたのですが、そ
-
-
Derivatives analytics with Python の学習ノート 1,2章
洋書を読んでいると、いつも読んだ気になってちゃんと理解出来てるか自信がないことが多いので、チャプターごとに要点をまとめ
Adsense
NEW ENTRY
-
- Avoiding the problem of connect to outside of LAN with L2TP/IPSec on Ubuntu 18.04.
とても困って、原因の特定に2日かかった。疲れた。確定申告したいのに。 The IPSEC tu
-
- Wine 上の MT4から ZeroMQ を使って Linux の pyzmq の通信をさせる
こんにちは。キリンです。 最近、年に数度のMQLを書くときがきたのですが、Pythonに慣れま
-
- numpy の2つ行列で片方にあるものだけを抽出する。
numpy で2つの時間のインデックスをarrayデータとして持っていて、x にはない時間のイン
-
- Synology DS216j の MySQL に外部からつなぐ
Synology DS216j をNAS(RAID1 12TB)として使っています。もっぱらデー
-
- VMWare Player をヘッドレスモードで使う。
[bm url="http://www.ryanchapin.com/fv-b-4-713/Ru
Twitter
RSS
カテゴリー
-
人気記事一覧
任意のインジケータのシグナルでアラートやメール機能を追加する 1,405ビュー
Pythonで簡単自動化!PyAutoGuiが便利すぎて感動したのでご紹介 353ビュー
Add Alert and SendMailの改造 315ビュー
Pythonで簡単に画像検出でLinux GUI操作自動化ライブラリを作ったよ 182ビュー
Interactive Brokers 証券の Python API を利用する 160ビュー
Python の超お手軽のネットワーク分散コンピューティングライブラリSCOOP 130ビュー
取引履歴を元にトレードの結果をチャート表示するインジケータのご紹介 127ビュー