※私が構築した時点ではPython2.7を使用して構築しましたが、一部のパッケージが3.x前提になり、現在はこの記事の通りにやってもエラーが出ます。参考になる部分があれば参考にしてください。
作った理由と概要
研究室にPCが余ってたから並列計算機作った。分からないことだらけだったので、なるべく楽な方法を選んだ。IPythonで簡単に並列計算機が作れるようなので、ipcluster、ipyparallelとSSHで並列計算を行う。
下記リストのごみのようなCPUなんか使わなくてもいいGPU使えば簡単に高性能な計算機が作れちゃうけど、せっかく余っててもったいないのでこれらを使う。
なお鍵交換とかルーターとかの知識はかなり怪しいので、この記事をあまり信用しないでください。
全体の流れ
- 計算ノードとするPCのIPを設定する.
- インターネットへの接続が可能になったので,計算ノードに必要なパッケージをインストールした.
- 次に鍵交換を行って,コントローラーから各計算ノードへパスワード無しでSSH接続できるようにする。
- 最後に ipythonのipclusterを設定し、コントローラーから各計算ノードを使って並列計算できるように設定する。
- 動作確認
使用する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
(以下計画)
- Xeon 2.8Ghz(0 or 2000番台のCore i7相当、詳細不明)×2(なんか教授がもらってきた
1. 各ノードの設定
必要なパッケージのインストール
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を作成したほうがいいと思う。
※2020年追記
ansibleとか使うのが正しいです。
2. 鍵交換
- コントローラーで鍵生成
- 計算ノードに公開鍵をコピー
コントローラーでssh-keygen -t rsaを実行してで~/.ssh以下に秘密鍵、公開鍵(.pub)を作る。公開鍵はUSBメモリに入れて計算ノードに挿し、、USBメモリの公開鍵のあるところで端末を開き、
mkdir ~/.ssh (.sshディレクトリがない場合)
touch ~/.ssh/authorized_keys (ファイルがない場合)
で、公開鍵情報を登録するファイルをホームフォルダ以下に作成し(Linuxの種類によっては最初からあるかも)
cat id_rsa.pub >> ~/.ssh/authorized_keys
で公開鍵をコピーすれば完了。
3. IPclusterの設定
- IPtyhonの新しいプロファイルを自動生成
- コンフィグを書き換え
- 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が使われているだけ。設定が間違えてるかも。
4. 並列実行エンジン始動と動作確認
なお、ここではコントローラーノードにSSHでログインして、コントローラーから並列計算用プログラムを動かす前提で書いている。
まず上の動作確認と同じくipcluster start –config=(コンフィグ名)でエンジンを始動し、プログラムは別のターミナルから
ipython –profile=プロファイル名 実行プログラム名
で実行すれば動くはず。
私の書いたサンプルプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# -*- coding:utf-8 -*- from ipyparallel import Client #与えられた変数とこの処理を実行しているホスト名を返す関数 def smp(g): import os return g,os.uname()[1] #よくわかんないけどこうするらしい rc=Client() dview=rc[:] #スレッド数を表示してるだけ print "スレッド数:%s" %(rc.ids) #関数と引数のリスト(辞書も可能?)を与えると返り値のリストまたはタプルが帰ってくる result_list=dview.map_sync(smp,range(100)) #結果を表示してるだけ for p,q in result_list: print "job number:",p,"ホスト名:",q |
これで計算ノードのホスト名が表示されればしっかり動いている。
余談
コントローラー自体のパワーも使うなら、計算ノードと同じくlocalhostにsshでログインできるようにし、コンフィグに書けば使えるはず。
コメント