研究室に余ってた複数のPCでPython専用並列計算機を作った(ipcluster, ipyparallel)

※私が構築した時点ではPython2.7を使用して構築しましたが、一部のパッケージが3.x前提になり、現在はこの記事の通りにやってもエラーが出ます。参考になる部分があれば参考にしてください。

作った理由と概要

 研究室にPCが余ってたから並列計算機作った。分からないことだらけだったので、なるべく楽な方法を選んだ。IPythonで簡単に並列計算機が作れるようなので、ipcluster、ipyparallelとSSHで並列計算を行う。

 下記リストのごみのようなCPUなんか使わなくてもいいGPU使えば簡単に高性能な計算機が作れちゃうけど、せっかく余っててもったいないのでこれらを使う。

なお鍵交換とかルーターとかの知識はかなり怪しいので、この記事をあまり信用しないでください。

全体の流れ

計算ノードが問題なくネットにつながるなら1,2は不要。

  1. どういうわけか研究室内のこれらPCの多くが上手くネットに繋がらない(DHCPでIPを取得してくれてるらしいが、ネットにはなぜか繋がらない)状態なので、コントローラー兼共用サーバーをルーターにしてローカルネットワークを構築し、そこに計算ノードにする各PCをつないで,外部と通信できるように設定した。
  2. 計算ノードとするPCのIPを設定して,ルーターを介して通信可能にする.
  3. インターネットへの接続が可能になったので,計算ノードに必要なパッケージをインストールした.
  4. 次に鍵交換を行って,コントローラーから各計算ノードへパスワード無しでSSH接続できるようにする。
  5. 最後に ipythonのipclusterを設定し、コントローラーから各計算ノードを使って並列計算できるように設定する。
  6. 動作確認

使用するPCのリスト

コントローラー兼ルーター兼共用サーバー

Linux Mint17(Mate)/Core i7 2600K/メモリ16GB

以下コントローラーもルーターもこのPCを指す

計算ノード (OS書いてないものはBasix 3.1)

  • Core i3 650/4GB×3台
  • Core i7 3770K/16GB×1
  • Core i5 2400/8GB

(以下計画)

  • Pentium4 3.0Ghz/512MB(研究室創立時のPC。記念品として保存)
  • PentiumD 550/1GB(うちの研究室にマルチコアPCを捨てる余裕はない)
  • Xeon 2.8Ghz(0 or 2000番台のCore i7相当、詳細不明)×2(なんか教授がもらってきた

1. ルーターの構築、設定

 すべてのPCがネットにつながるならルーターが不要なので、この手順は不要。

  1. ルーターとするPCはLANポートを二つ用意
  2. ルーターのIPアドレスを手動設定
  3. ルーターのip_forwardとマスカレードを設定

 まずはルーターのPC(A)にLANポートが2つ必要。なお、研究室内ネットワークにつながっている側のNICには、接続すると自動的にIPアドレスが割り当てられる状況だ(このサーバーは自動的に繋がる)。もう一方のNICをローカルネットワークのゲートウェイにする。

 まず/etc/network/interfaceファイルを編集してコントローラーのIPなどを手動で適切に設定する。

 私はルーターとなるコントローラーを以下のように設定した。

  • auto enp2s0
  • iface enp2s0 inet static
  • address 192.168.111.11
  • network 192.168.111.0
  • netmask 255.255.255.0

 次に、ルーターとなるコントローラーのPCのip forward設定、IPマスカレード設定をする.

以下のサイトを参考にした

https://qiita.com/koshilife/items/2fa1436248f1d4938861

IPテーブルの設定の変更方法はややこしいので、こちらのサイトを参考にした

http://maruchan-shiro123.hatenablog.com/entry/2015/04/05/181854

もうしわけない、この作業をやったのがだいぶ前で、しかも散々苦労したためにどのサイトを見たか正確に覚えていない。

 セキュリティに関しては大学内ネットワークなのでファイアウォールの中であり、追加でファイアウォールは構築していない。

2. 各ノードの設定

IPアドレスの設定

こちらも全てのPCがネットに問題なくつながるなら不要.

/etc/network/interfaceファイルを編集するだけ.上の設定例に加えて,

  • gateway 192.168.111.11
  • dns-servers 8.8.8.8

などを設定すれば動くはず.

必要なパッケージのインストール

sshでipclusterを使うので、以下のパッケージが必要となる。

IPython python-zmq python-pip openssh-server

また、pipでipyparallelのインストールも必要。うまくいかない場合は、バージョンが古い可能性があるのでpip自体も含めて関連するパッケージをアップグレードしていくといいかも。

正確にメモしたりしてないので、他にもいるかもしれない。

私は研究室でよく使うsklearn、gensim(関連のnumpy, scipy)、chainer, tensorflow, glove, などもインストールした。

 なお一台一台セットアップするのはめんどくさいので、以上のセットアップ後にBasix3.1に初期から入っているbodhibuilder(bodhibuilder-gdk)でカスタムISOを作成して、カスタムOSのディスクを作り、インストールするだけで環境が整うようにした。(ただし上のinterfaceの設定と、下の鍵交換は必要)。インストールしてからパッケージが足りないと一台一台インストールする羽目になるので、1台を設定し終わって計算ノードとして動くのを確認してからISOを作成したほうがいいと思う。

3. 鍵交換

  1. コントローラーで鍵生成
  2. 計算ノードに公開鍵をコピー

コントローラーでssh-keygen -t rsaを実行してで~/.ssh以下に秘密鍵、公開鍵(.pub)を作る。公開鍵はUSBメモリに入れて計算ノードに挿し、、USBメモリの公開鍵のあるところで端末を開き、

mkdir ~/.ssh (.sshディレクトリがない場合)

touch ~/.ssh/authorized_keys (ファイルがない場合)

で、公開鍵情報を登録するファイルをホームフォルダ以下に作成し(Linuxの種類によっては最初からあるかも)

cat id_rsa.pub >>  ~/.ssh/authorized_keys

で公開鍵をコピーすれば完了。

4. IPclusterの設定

  1. IPtyhonの新しいプロファイルを自動生成
  2. コンフィグを書き換え
  3. ipcluster start –config=プロファイル名 で動けば成功

http://fitnessprograming.blogspot.jp/2015/12/ipython.html

https://qiita.com/ma2saka/items/d4f5d7342a0e8c383418

 IPClusterの設定は上の2つを参考にした。configファイルはかなり行数があり、ほかにもいろいろな設定項目があるが、3行ほど書けば動いた。

https://qiita.com/chokkan/items/750cc12fb19314636eb7

この記事の大雑把な流れは↑を参考にした。日本語情報が最初に出たのは多分↑の記事で、この記事のおかげでこの方法を知りました。

 なお、私の環境でうまく動かないときはパッケージが古い、パッケージが足りない、設定ファイルのスペルミスが原因だった。Local Enginなどと表示される場合はコントローラーのCPUが使われているだけ。設定が間違えてるかも。

5. 並列実行エンジン始動と動作確認

 なお、ここではコントローラーノードにSSHでログインして、コントローラーから並列計算用プログラムを動かす前提で書いている。

まず上の動作確認と同じくipcluster start –config=(コンフィグ名)でエンジンを始動し、プログラムは別のターミナルから

ipython –profile=プロファイル名 実行プログラム名

で実行すれば動くはず。

私の書いたサンプルプログラム

 

これで計算ノードのホスト名が表示されればしっかり動いている。

余談

コントローラー自体のパワーも使うなら、計算ノードと同じくlocalhostにsshでログインできるようにし、コンフィグに書けば使えるはず。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)