Jupyter Notebook における並列計算

2016年7月31日

はじめに

Jupyter Notebook における並列計算について。

環境

  • Red Hat Enterprise Linux Workstation release 7.2
  • Windows 7 64 bit
  • Anaconda3 4.1.1

Jupyter Notebook における並列計算

Jupyter Notebook で並列計算を行うには、ipyparallel が必要。つぎのようにインストールする。

$ pip install ipyparallel

サーバーの起動。

$ ipcluster start

Jupyter Notebook で以下を実行。

import os
import ipyparallel as ipp

rc = ipp.Client(profile='default')
ar = rc[:].apply_async(os.getpid)
pid_map = ar.get_dict()
print(pid_map)

以下のような出力が得られたら OK (以下は 4 並列の場合)。

{0: 1832, 1: 5516, 2: 3664, 3: 3800}

ipcluster を止めたい場合は、Ctrl+C する。それで止まらない場合は、以下のようにする。

$ ipcluster stop

並列数を指定することもできる。

$ ipcluster start -n 2

この場合、上記スクリプトを実行すると、以下のような結果が得られる。

{0: 6056, 1: 6696}

いちいちコマンドでサーバーを起動するのはめんどうである。Jupyter Notebook のほうから起動することもできる。設定のため、以下のように実行する。

$ jupyter serverextension enable --py ipyparallel
$ jupyter nbextension install --py ipyparallel
$ jupyter nbextension enable --py ipyparallel

こうすることで、Jupyter Notebook で "IPython Cluster" というタブが使えるようになり、そこでサーバーを起動/停止することができる。"# of engines" で並列数を指定する。

MPI の使用

Python で MPI を使用するには、mpi4py を使う。インストールは次の通り。

$ pip install mpi4py

テスト。

$ mpiexec -n 4 python -m mpi4py helloworld
Hello, World! I am process 0 of 4 on localhost.
Hello, World! I am process 1 of 4 on localhost.
Hello, World! I am process 2 of 4 on localhost.
Hello, World! I am process 3 of 4 on localhost.

Jupyter Notebook で使うには、ipcluster を MPI 用に起動する。

$ ipcluster start --engines=MPI

まず、以下を実行。

import ipyparallel as ipp
rc = ipp.Client(profile='default')

続いて、次のように実行。

%%px
from mpi4py import MPI
import sys

size = MPI.COMM_WORLD.Get_size()
rank = MPI.COMM_WORLD.Get_rank()
name = MPI.Get_processor_name()

sys.stdout.write(
    "Hello, World! I am process %d of %d on %s.\n"
% (rank, size, name))

上の helloworld と同じ結果が得られれば OK。ここで、%%px は並列計算を行うためのマジックコマンドである。

Jupyter Notebook から ipcluster を起動したい場合は、MPI 用にプロファイルを作る。

$ ipython profile create --parallel --profile=mpi

~/.ipython/profile_mpi/ipcluster_config.py で以下のように設定。

c.IPClusterEngines.engine_launcher_class = 'MPI'

試しに起動。

$ ipcluster start --profile=mpi

Jupyter Notebook で、前準備を以下のように変える。

import ipyparallel as ipp
rc = ipp.Client(profile='mpi')

続いて MPI のコードを実行、問題なければ OK。"IPython Cluster" タブで mpi 用サーバーをできるはずである。

Windows の場合

Windows の場合は上の手順ではうまく行かない。以下のようにすればうまく行くようである。

ipcluster を使うとエラーで止まるので、ipcontroller と ipengine を用いる。まず、ipcontroller を起動する。

$ ipcontroller

別窓で、ipengine を実行する。

$ mpiexec -n 4 ipengine --mpi='mpi4py'

これで Jupyter Notebook で並列コードを実行できる。ipcluster も上と同じことをしているはずなのだが、ipcluster だとなぜかうまくいかない。