Python の超お手軽のネットワーク分散コンピューティングライブラリSCOOP
公開日:
:
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. |
使い方
説明はウェブサイト上にもあるが、動かないサンプルコードも多くはまるので注意。
1. 分散処理をしたいPCでPythonの実行環境を揃える。
標準ではホストPC での Python の実行環境が接続先に渡されて分散処理されることになる。そのため、pyenv 等で /home/user ディレクトリ下に実行環境があると user 名が一致しないためちゃんと動かない。/usr/local/python に統一しておく等の処置が必要になる。
処理に必要なファイル等があれば、それも同一のパスとして各ノードに配置。
Docker との相性が良いのもこのあたり。Docker であれば、容易に同一環境を構築できる。
2. ssh サーバーの設定
パスワードなしの認証キー認証にする。パスワードありには対応していない。
3. ホストPCと各ノードでの ssh config の設定
ssh config での host name が ノードの PC の名前かIPでないと、エラーが出る。このあたりの説明がまったくなくて、ソースコードを追っかけるはめになった。
Docker上で実行したければ、--tunnel オプションをつければ大丈夫。--tunnelオプションを付けていれば、host name の問題は気にしなくていい。--tunnel オプションに関する説明もドキュメントにはないので注意。
4. 実行時
導入の上での注意
- 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 (371)
References
| 1. | ↑ | os.getpid( |
Adsense
関連記事
-
-
まだ Python の datetime で消耗しているの? maya 使おうぜ
この記事は Python Advent Calendar 2016 の 24日目の記事です。 当初は SCOOP
-
-
VimでPythonのIDE 環境を一から構築する
追記 これ見ておいたほうがいいかも。 Vimを最強のPython開発環境にする2 - Λlisue's blog
-
-
Quantopian の pyfolio を単利運用に対応させる。
pyfolio は どんなデータを入れても複利運用として計算してしまうので、人によっては望まない検証方法だったりし
-
-
Python x64 & MinGW64 環境の構築
流石に詰まりまくったのでまとめることにする。 MSYS2 をインストール 個人的にこれからメインで使
-
-
Pythonで簡単に画像検出でLinux GUI操作自動化ライブラリを作ったよ
[2015/02/07 追記] [bm url="http://fx-kirin.com/python
-
-
Pythonのsocketでプロセス間通信をして価格データ等を送信する
どうも、お久しぶりです。キリンです。 取り敢えず1ヶ月ほど、連続でブログの更新を続けてみたのですが、そ
-
-
PythonでsleepしているThreadを呼び起こすプラクティス
Pythonのsleep中のThreadをWake up PythonのThreadにて、RubyのThr
-
-
vim-ipythonをWindows 7 x64で使うとR6034 が出る件
個人的なただの忘備録。 Visual Studioのコマンドプロンプトから実行すること。 http://st
-
-
Derivatives analytics with Python の学習ノート 1,2章
洋書を読んでいると、いつも読んだ気になってちゃんと理解出来てるか自信がないことが多いので、チャプターごとに要点をまとめ
-
-
絶対ダメ! マルチスレッドでの共通変数のインクリメント演算
デバッグ中の発見 とあるマルチスレッドプログラムをPythonで書いていた際に遭遇した誤使用です。C/C++等
Adsense
サイト内検索
NEW ENTRY
-
- Python の超お手軽のネットワーク分散コンピューティングライブラリSCOOP
SCOOPとは ssh とPython の設定を適切にするだけで、簡単にネットワーク間での分
-
- Quantopian の pyfolio を単利運用に対応させる。
pyfolio は どんなデータを入れても複利運用として計算してしまうので、人によっては望まな
-
- Call Python/Numpy Function within Metatrader 4
Github Link [bm url="https://github.com/fx-kiri
-
- Python での ポートフォリオの計算
Python でのポートフォリオの計算 ポートフォリオの計算について色々調べてみた。とりあえず
-
- まだ Python の datetime で消耗しているの? maya 使おうぜ
この記事は Python Advent Calendar 2016 の 24日目の記事です。
Twitter
RSS
カテゴリー
-
人気記事一覧
任意のインジケータのシグナルでアラートやメール機能を追加する 462 views
Pythonで簡単自動化!PyAutoGuiが便利すぎて感動したのでご紹介 195 views
Python での ポートフォリオの計算 171 views
Call Python/Numpy Function within Metatrader 4 143 views
Quantopian の pyfolio を単利運用に対応させる。 93 views
Python の超お手軽のネットワーク分散コンピューティングライブラリSCOOP 77 views
Pythonで簡単に画像検出でLinux GUI操作自動化ライブラリを作ったよ 76 views
