2015年12月1日火曜日

IPythonのクラスターについて

IPython.Parallel(ipyparallel)で、ハマったので(ハマりまくった)ので、ここに備忘録としてメモしておきます。

手元にあるPCから、リモートにあるPCでipengineを起動して使用したい場合、以下の手順で可能である。

ipython profile create --profile=parallel --parallel

~/.ipython/profile_parallel/ipcluster_config.pyを編集し以下を追記する。
c.IPClusterEngine.engine_launcher_class = "SSH"
c.SSHEngineSetLaucher.engines = {
   "hostname1" : 10,
   "hostname2" : 10,
   "hostname3" : 10,
}

~/.ipython/profile_parallel/ipengine_config.pyを編集し以下を追記する。
c.HubFactory.ip = "*"
もしくは、
c.RegistrationFactory.ip = "*"

これで準備完了で、ssh-agentなどでパスワードなしでリモートにログインできるようにしておいて、以下のコマンドで各ホストのエンジンを起動する。

ipcluster start --profile=parallel

これで、リモートホストにprofileを自動で転送され、エンジンが自動で起動する。

別のシェルで、プロファイルを指定してipythonを起動する。

ipython --profile=prallel

from ipyprallel import Client

c = Clinets()

c[:].ids

を実行し、指定エンジンの数だけ表示されればOKである。

これだけである。

==

しかし、これだけをするのにハマりまくった。

まず、ハマった原因として起動コマンドを実行した時に
engines appear to have started successfully と表示されても、実際にはリモートでEngineが起動していな事があった。この原因としては、リモートにおけるipengineの実行環境が整っていなことが原因だった。これは、リモートに個別にログインしてipengineを実行し、起動できるか確認すればわかる。

また、ipengine_config.pyに、c.RegistrationFactory.ip = "*"を書いておかないと、リモートからエンジンをcontroller?に登録しようとしても出来ないようなので、うまくエンジンが起動出来ないようだ。
 
最近?IPython.Parallelが4.xにバーションアップし、ipyparallelモジュールとして独立?したようだ。ハマっている時には、環境中に4.x系と3.x系が混在していた。これ原因かは分からないが、一度確認してみると良いかもしれない。 confingファイルの説明の記述もかなり変わっている。

0 件のコメント:

コメントを投稿

登録 コメントの投稿 [Atom]

<< ホーム