IPythonデータサイエンスクックブック オンライン読書会#14 参加失敗報告
#osaka_prml_reading というグループでオンライン (Skype) 開催されている「IPythonデータサイエンスクックブック オンライン読書会」に参加しようとしたのですが, Skype チャットに行ってみても誰もいなくて参加に失敗したみたいのなので,一人で勉強会を開催してみました。この勉強会は
IPythonデータサイエンスクックブック ―対話型コンピューティングと可視化のためのレシピ集
posted with amazlet at 16.07.03
Cyrille Rossant
オライリージャパン
売り上げランキング: 12,399
を読み進めていく勉強会となっています。この本自体は,題名通り IPython の便利技集となっており,IPython を使っているなら読んでおいても損ではないのですが,最新の IPython 4 ではそのまま使えない技もいくつかあって,一人で読んでいると罠にはまることがあります。今回私が参加しようとした「IPythonデータサイエンスクックブック オンライン読書会」の範囲も,本のサンプルが IPython 4 で動かないので,本記事でメモしておきます。ただし私が読んでいる本は,上に示した翻訳版ではなく,原著版を英語で読んでいます。このため,本記事の内容は翻訳版と違うところがあるかもしれないことをご承知おきください。
IPython Interactive Computing and Visualization Cookbook
posted with amazlet at 16.07.03
Packt Publishing (2014-09-25)
レシピ 5.11 MPIを使ったIPythonの並列実行
今回の勉強会は,「5.11 MPIを使ったIPythonの並列実行」から始まる予定でした。
まず,IPython で MPI を使えるようにパッケージをインストールする必要があるのですが,本の内容そのままでは標準の Conda パッケージがインストールされています。この標準のパッケージはパッケージングに問題があるようで MPI がどうも正常に動かないので,次のようにしてインストールします。
conda install --channel mpi4py mpich mpi4py
IPython 4.0 では ipyparallel は別パッケージとなっているので,追加でインストールする必要があります。
conda install ipyparallel
c.IPClusterEngines.engine_launcher_class は MPIEngineSetLauncher とします。
--- /Users/tnoda/.ipython/profile_mpi/ipcluster_config.py.orig 2016-07-02 22:05:35.000000000 +0900 +++ /Users/tnoda/.ipython/profile_mpi/ipcluster_config.py 2016-07-02 22:07:51.000000000 +0900 @@ -147,7 +147,7 @@ # or: # # ipcluster start --engines=MPI -# c.IPClusterEngines.engine_launcher_class = 'LocalEngineSetLauncher' +c.IPClusterEngines.engine_launcher_class = 'MPIEngineSetLauncher' # The number of engines to start. The default is to use one for each CPU on your # machine
修正が必要がなのはここまでです。これ以降の手順は,本の記載に従って実行すれば動きます。
!ipython profile create --parallel --profile=mpi
Create Client in the notebook
import numpy as np from ipyparallel import Client c = Client(profile = 'mpi') view = c[:] view.scatter('a', np.arange(16., dtype='float'))
%%px from mpi4py import MPI import numpy as np print(MPI.COMM_WORLD.allreduce(np.sum(a), op=MPI.SUM))
[stdout:0] 120.0 [stdout:1] 120.0 [stdout:2] 120.0 [stdout:3] 120.0