heyheytower

日々のメモです。誰かのお役に立てれば幸いです。

並列プログラミングのための、 linux クラスタ環境の構築。その2(SGEの導入)

PCを2台購入し、新たな環境を作りましたので報告します。

2core PC を4台並列化し、ジョブ管理ソフト“sun grid engine”(以下 SGE)*1を用いて、
ジョブコントロールを自動で行わせます。

自分の生活上の利点としては以下です。

  • 並列化プログラムを空いているリソース(CPU)に自動で割り振ってくれることが便利であること。(OpenMPI 利用時)
  • 並列化されていないプログラムに複数の異なった引数で実行させる際に、引数指定それぞれを自動で空いたリソースに割り振ってくれること。(並列化されてない普通のプログラムを並行させて走らせることができる!)
IP roll hostname
172.16.0.2 管理ホスト master-ubuntu
172.16.0.3, 4, 5 計算ノード calc1, 2, 3

作業内容

  1. PXEブートを利用し3台の PC に Ubuntu10.04-server をインストール
  2. 計算用PC 3台の設定(OpenMPI+SGEなど必要なソフトをインストール)
  3. 管理用PC において SGE の設定

1.PXEブート

技術的な説明は他サイトを参照ください。*2 *3
以下の要件を満たしたい時に利用します。

  • ネットワークブート対応PCへインストールを行う。
  • 複数台へのインストールを行う。
  • 複数台へのインストールを一台のサーバで管理する。

以下のスクリプトを管理サーバで実行します。

#!/bin/sh

apt-get install -y dhcp3-server
apt-get install -y tftp-hpa
apt-get install -y nfs-kernel-server

cat <<_EOT_ >> /etc/dhcp3/dhcpd.conf

# for PXE boot
allow unknown-clients;

subnet 172.16.0.0 netmask 255.255.255.0 {
range 172.16.0.2 172.16.0.8;
option broadcast-address 172.16.0.255;
option domain-name-servers x.x.x.x;
# option domain-name "calcdomain" ; # Domain name
option routers 172.16.0.1;
}

host calc1 {
hardware ethernet ff:ff:ff:ff:ff:ff; # Ethernet MAC address
fixed-address 172.16.0.3; # Hostname or IP address
next-server 172.16.0.2; # should be IP address
filename "pxelinux.0" ;
allow bootp;
}

_EOT_

/etc/init.d/dhcp3-server restart

#/etc/init.d/tftp-hpa restart
#ln -s /n/e/t/b/o/o/t/pxelinux.0 /var/lib/tftpboot
#ln -s /n/e/t/b/o/o/t/pxelinux.cfg /var/lib/tftpboot

echo "/var/lib/tftpboot/ *(ro,all_squash,no_subtree_check,crossmnt)" >> /etc/exports

/etc/init.d/nfs-kernel-server restart

やっていることは以下です。

  1. ネットワークブートPC に DHCP サーバから “172.16.0.2 参照”と伝える。
  2. tftpを利用し、172.16.0.2 の“/var/lib/tftpboot/pxelinux.0を参照”と伝える。
  3. pxelinux.0 の記述に従ってインストーラが起動する。

tftpboot 以下には pxelinux.0 を配置するのですが、
むしろ Ubutu10.04イメージをマウントしてしまい、netboot 中身の
pxelinux.0 を dhcpd.conf で参照するようにする方が良いです。
そうしますとインストール対象PC毎に
インストールイメージを変えることが簡単に可能になります。

ネットワークブートで Ubuntu10.04 の SSH サーバをインストールします。

2.計算用PC 3台の設定

インストールした3台に下記スクリプトを実行します。

# install
sudo apt-get update
sudo apt-get upgrade
sudo apt-get -y install nfs-common
sudo apt-get -y install gcc
sudo apt-get -y install g++
sudo apt-get -y install make
sudo apt-get -y install gridengine-exec
sudo apt-get -y install gridengine-common
sudo apt-get -y install gridengine-client
sudo apt-get -y install maxima
sudo apt-get -y install octave3.2

#nfs
mkdir -p /home/beowulf
sudo echo "172.16.0.2:/home/beowulf /home/beowulf nfs rw,soft 0 0" >> /etc/fstab
sudo mount -a

#openmpi
mkdir /opt/ompi
cd /opt/ompi
wget http://www.open-mpi.org/software/ompi/v1.6/downloads/openmpi-1.6.tar.gz
tar zxvf openmpi-1.6.tar.gz
cd /opt/ompi/openmpi-1.6
./configure --with-sge --enable-mpi-thread-multiple
make all install
echo "export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH" > ~/.bashrc
source ~/.bashrc

# ssh no pass login
cd
cat /home/beowulf/id_rsa.pub >> ./.ssh/authorized_keys

管理用PC 172.16.0.2 の /home/beowulf を、共有ディレクトリとして
利用することが前提です。

SGEではCell名はデフォルト、管理ホストは自分の環境にあわせて
設定してください。(今回は master-ubuntu)
また、名前解決できるよう /etc/hosts は各PCで記載してください。

OpenMPI は sun grid engine 利用のため configure では --with-sge
オプションが必要であり、make 後の mpirun はライブラリの PATH を
通さないと実行できないので注意が必要です。
※ldconfig -v などで確認のこと。*4 *5 *6 *7

ssh でパス無しでログインするため 共有鍵を登録します。
※SGE や OpenMPI でいちいち入力する手間を省くためです。


3.管理用PC において SGE の設定

SGE の情報は日本語では少ないため、
ここでかなり迷い挫折しそうになりました。
自分はこのサイトに救われましたので、ご参考を。 *8

sudo -u sgeadmin qconf -am rwhexit
qconf -au rwh users
qconf -as master-ubuntu
qconf -ahgrp @allhosts
qconf -aattr hostgroup hostlist master-ubuntu @allhosts
qconf -aq main.q
qconf -aattr queue hostlist @allhosts main.q
qconf -aattr queue slots "2, [master-ubuntu=3]" main.q
qconf -ap mpi

qconf -as calc1
qconf -ae
qconf -aattr hostgroup hostlist master-ubuntu @allhosts

/etc/init.d/gridengine-exec start
/etc/init.d/gridengine-master restart

上部で、gridengine-master の設定を行い、(qconf -help 参照)
中部で、実行ノードを追加(実際は台数分入力)
下部で、SGE 実行プロセス起動と、管理プロセスの再起動
って感じです。
ちょっと簡潔に過ぎますが、自分も勉強の途中ですので悪しからず。

実際に管理できているかは、以下で確認してみてください。
qstat -f #管理ノード一覧表示
qrsh -pe mpi 8 mpirun hostname #ジョブが割り振られているか

※いろいろなサイトで-pe (parallel environment )オプションを
  orte で指定しているのを見かけました。
 これは OpenMPI の FAQ で例として作成するときに指定して
 いることから、多用されているのかなと考えられました。
 自分は何も考えず orte を指定し、実行されないなーと頭を
 かかえていたことがありました…。


最後に

駆け足で書いたので、抜けもあるかと思います。
思い出しつつ補完していきますが、何か気づいた点ありましたら
ご指摘いただけますでしょうか、お願いします。


以上。