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ファイルの説明の記述もかなり変わっている。