Wizard In The Market
システムトレードの魔術師

*

Python の超お手軽のネットワーク分散コンピューティングライブラリSCOOP

公開日: : 最終更新日:2017/02/13 Python , ,

logo

SCOOPとは

  • ssh とPython の設定を適切にするだけで、簡単にネットワーク間での分散処理が実行できる。
    • ネットワーク分散に対応していないライブラリに便利。
    • 関数の処理を分散して行い、返り値をまとめて返してくれる。
  • Core 数に応じた Worker 数の設定が可能
  • Docker との相性が抜群

基本動作

python 標準の map 関数の使い方で ssh で繋いだ先(ノード)でも分散処理してくれる。multiprocessing.Pool.map のネットワーク処理に対応した版。

map 関数に配列を渡すと配列の各要素を引数に関数を実行する。その際の各処理を各ノードでマルチプロセスで実行して、ホストPCに変数を返す。

通信には pickle 化された情報を送信している。

ssh で接続先の通信用ポートを開けて、ポートの情報をホストに送って通信。--tunnelオプションを使えば、localhost 上に port fowarding する。この際のホストIPの解決には、ssh 上の host name が使われる。

サンプルコード

scoop.futures.map という関数で並列したい関数と、並列したい引数を配列で渡す。

実行スクリプト

実行結果

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. 実行時

  • --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 以外の言語の並列化にも使える。システムトレードのバックテストの並列化にはおすすめ。

にほんブログ村 為替ブログへ 
Fx-Kirin

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年に帰国。零細株式会社経営中。

References   [ + ]

1. os.getpid(

Adsense

  • このエントリーをはてなブックマークに追加
  • Pocket
  • 51 follow us in feedly

関連記事

Python での ポートフォリオの計算

Python でのポートフォリオの計算 ポートフォリオの計算について色々調べてみた。とりあえず使いたいって人はpo

記事を読む

Call Python/Numpy Function within Metatrader 4

Github Link [bm url="https://github.com/fx-kirin/mt4-nump

記事を読む

Quantopian の pyfolio を単利運用に対応させる。

pyfolio は どんなデータを入れても複利運用として計算してしまうので、人によっては望まない検証方法だったりし

記事を読む

CPP extension vs Cython vs CPython on calculating the mean of numpy array

I'd like to get any feedback to make cython faster like

記事を読む

ipdb だけではなく IPython.embed も使おう

ipdb だと複数行の挿入ができなかったりするが、その問題が解消される。明らかにこちらのほうが使い勝手がいい。行のデ

記事を読む

PythonでsleepしているThreadを呼び起こすプラクティス

Pythonのsleep中のThreadをWake up PythonのThreadにて、RubyのThr

記事を読む

Pythonのsocketでプロセス間通信をして価格データ等を送信する

どうも、お久しぶりです。キリンです。 取り敢えず1ヶ月ほど、連続でブログの更新を続けてみたのですが、そ

記事を読む

まだ Python の datetime で消耗しているの? maya 使おうぜ

この記事は Python Advent Calendar 2016 の 24日目の記事です。 当初は SCOOP

記事を読む

VimでPythonのIDE 環境を一から構築する

追記 これ見ておいたほうがいいかも。 Vimを最強のPython開発環境にする2 - Λlisue's blog

記事を読む

Derivatives analytics with Python の学習ノート 1,2章

洋書を読んでいると、いつも読んだ気になってちゃんと理解出来てるか自信がないことが多いので、チャプターごとに要点をまとめ

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Adsense

システムトレードを始める前に知っておきたかったこと

今日の勉強会で発表してきました。nbviewer に共有しておきます。 システムトレードを始め

chmod で やらかしてしまったときの対処法

メモ書きです。 find | xargs とかを普通にやってしまうと、すぐに argument

AMD Ryzen & Nvidia GTX 1080 BTO PC 構成・組立と Ubuntu インストール

まだググっても、構成例とか出てないので参考になるんじゃないかなと。機械学習用ですが、全然ゲーム用

Windows のデスクトップアプリをSSHクライアントから再起動する

シェルスプリクト一発で、システムトレードの設定を一括で更新して、MT4を再起動したいとかそういう

UX21A のディスプレイが壊れたので修理

UX21A のディスプレイがぶっ壊れた。 画面にラインが入ったり、ディスプレイが揺れたりするよ

→もっと見る

PAGE TOP ↑