LXCF ソース (lxcf-0.11.tar.gz) | 2014-11-14 12:01 |
LXCF DEB パッケージ (lxcf_0.11_amd64.deb) | 2014-11-14 11:52 |
LXCF RPM パッケージ (lxcf-0.11-1.x86_64.rpm ) | 2014-11-14 11:58 |
specfiles (lxcf.spec-0.11-1) | 2014-11-14 12:03 |
CPU : AMD Opteron 2.3GHz x 16 Processor Memory : 32GB OS: RHEL7 openmpi-1.6.4-3.el7.x86_64, openmpi-devel-1.6.4-3.el7.x86_64 (RHEL7 のパッケージに入っているもの)
LXCFのコンテナを16個つくり、1コンテナに1CPUずつ専用に割り当てる。
firewalldとSELinuxを止めるため、セキュリティ上問題とならないようにインターネットには直接接続しないほうがよい。
今回はopenmpiを使います。
# yum install openmpi openmpi-devel
openmpiを使うには、sshのパスワード無し設定(loginできるホストは限定)など行わなければならないため、専用の実行用ユーザ"mpiusr"を登録して使うことにします。
# useradd -m mpiusr # su - mpiusr
.bashrcファイルに、openmpiのパスを設定します。次の設定を.bashrcに追加してください。
export PATH=/usr/lib64/openmpi/bin:${PATH} export LD_LIBRARY_PATH=/usr/lib64/openmpi/lib:${LD_LIBRARY_PATH} export MANPATH=/usr/share/man/openmpi-x86_64:$MANPATH
ssh のパスワードも設定してしまいましょう。
公開キーが登録されたシステムからは、パスワード不要にします。(公開キーがないシステムからは当然ログインできません)
ssh-keygenの実行では、なにも入れずにそのままEnterキーを押せばよいです。
# su - mpiusr $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/mpiusr/.ssh/id_rsa): 【そのままEnter】 Created directory '/home/mpiusr/.ssh'. Enter passphrase (empty for no passphrase): 【そのままEnter】 Enter same passphrase again: 【そのままEnter】 Your identification has been saved in /home/mpiusr/.ssh/id_rsa. Your public key has been saved in /home/mpiusr/.ssh/id_rsa.pub. The key fingerprint is: 1c:af:63:39:a6:8a:8c:88:17:81c:25:cb:3a:79:ad:87 mpiusr@lxcf-srv The key's randomart image is: +--[ RSA 2048]----+ | | | | | . | |. . . . . | |.* S . | |o.o . . | |.+ o * . | |* E .o = o | |.o.+. +.. | +-----------------+
authorized_keysに公開キーを登録しておきます。これは後でコンテナに同じ環境をデプロイするのに利用します。
$ cat .ssh/id_rsa.pub > .ssh/authorized_keys $ chmod 400 .ssh/authorized_keys
並列実行するコンテナを登録しておきましょう。
まだコンテナの作成は行っていないのですが、事前に登録しておくことは可能です。
ここに登録されたシステムに対して並列実行プログラムが配送されて実行されます。
16個のコンテナを作成する予定ですが、それにa0001からa0016と名付けることにします。
また、それぞれのコンテナにはcpuを1個割り当てる予定です。今回は16並列のmpiプログラムが可能になります。
/etc/openmpi-x86_64/openmpi-default-hostfileに、次の設定を追加してください。
a0001 cpu=1 a0002 cpu=1 a0003 cpu=1 a0004 cpu=1 a0005 cpu=1 a0006 cpu=1 a0007 cpu=1 a0008 cpu=1 a0009 cpu=1 a0010 cpu=1 a0011 cpu=1 a0012 cpu=1 a0013 cpu=1 a0014 cpu=1 a0015 cpu=1 a0016 cpu=1
firewalldを停止します。
# systemctl stop firewalld # systemctl disable firewalld
SELinuxも止めます。/etc/selinux/configをSELINUX=disabledと修正してrebootしてください。
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=disabled ここを修正 # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # minimum - Modification of targeted policy. Only selected processes are pr$ # mls - Multi Level Security protection. SELINUXTYPE=targeted
リブートする。
コンテナを作成します。前に示した通りa0001からa0016まで作ります。
LXCFでは複数のコンテナを作成するのは、コマンド1発で簡単ですよ。
# lxcf sysgen-n a 16OS起動時にコンテナも、自動的に起動するように設定しておきましょう。
# lxcf autostart-n a 16 # lxcf list Name Mode State Autostart Path ------------------------------------------------------------------------- a0001 joint running y /opt/lxcf/a0001 a0002 joint running y /opt/lxcf/a0002 a0003 joint running y /opt/lxcf/a0003 a0004 joint running y /opt/lxcf/a0004 a0005 joint running y /opt/lxcf/a0005 a0006 joint running y /opt/lxcf/a0006 a0007 joint running y /opt/lxcf/a0007 a0008 joint running y /opt/lxcf/a0008 a0009 joint running y /opt/lxcf/a0009 a0010 joint running y /opt/lxcf/a0010 a0011 joint running y /opt/lxcf/a0011 a0012 joint running y /opt/lxcf/a0012 a0013 joint running y /opt/lxcf/a0013 a0014 joint running y /opt/lxcf/a0014 a0015 joint running y /opt/lxcf/a0015 a0016 joint running y /opt/lxcf/a0016
次のようなスクリプトを書いて実行しましょう。-i の引数がcpu番号になります。
- #!/bin/sh
- lxcf set -i 0 a0001
- lxcf set -i 1 a0002
- lxcf set -i 2 a0003
- lxcf set -i 3 a0004
- lxcf set -i 4 a0005
- lxcf set -i 5 a0006
- lxcf set -i 6 a0007
- lxcf set -i 7 a0008
- lxcf set -i 8 a0009
- lxcf set -i 9 a0010
- lxcf set -i 10 a0011
- lxcf set -i 11 a0012
- lxcf set -i 12 a0013
- lxcf set -i 13 a0014
- lxcf set -i 14 a0015
- lxcf set -i 15 a0016
10番以降をa00010とaの後に0を3つ付けてしまいやすいので注意してください。ただしくは0は2つでa0010です。
作成したすべてのコンテナa0001からa0016に最初に設定したsshの設定とbashの設定をデプロイします。
# cd /home/mpiusr # lxcf deploy .ssh # lxcf deploy .bash*
openmpiでは、known_hostsに実行するシステムが登録されなければならないようです。
ホスト上で作って、コンテナにデプロイします。
まず1回a0001にログインして、すぐにexitします。
# su - mpiusr $ ssh a0001 The authenticity of host 'a0001 (192.168.125.2)' can't be established. ECDSA key fingerprint is ef:21:e4:30:01:99:f5:af:58:9b:2c:9f:77f:8a:6b:31. Are you sure you want to continue connecting (yes/no)? yes と入力 [mpiusr2@a0001 ~]$ exit
このログインとexitをa0016まで繰り返してください。
.sshの下にknown_hostsというファイルが出来て、中にa0001からa0016まで登録されています。このファイルをコンテナにもデプロイします。
# cd /home/mpiusr/.ssh # lxcf deploy known_hosts
姫野ベンチマークを実行してみます。
Himeno benchmark http://accc.riken.jp/2444.htm
姫野ベンチマークは情報基盤センター・センター長の姫野龍太郎氏が非圧縮流体解析コードの性能評価のために考えたものでポアッソン方程式解法をヤコビの反復法で解く場合に主要なループの処理速度を計るものです。
Source code(Fortran90 + MPI) http://accc.riken.jp/secure/4562/f90_xp_mpi.lzh
lzh形式ですが、GUIのツールでfile-rollerで展開できます。
$ cd /home/mpiusr $ file-roller f90_xp_mpi.lzh
展開すると、himenoBMTxpr.f90というソースファイルが得られます。
これをコンパイルしてデプロイします。
$ mpif90 himenoBMTxpr.f90 -o himenoBMTxpr $ su mpiusr # lxcf deploy himenoBMTxpr # exit $
では実行してみましょう。
まず、並列でなく単一プロセスで実行します。
$ ./himenoBMTxpr For example: Grid-size= XS (64x32x32) S (128x64x64) M (256x128x128) L (512x256x256) XL (1024x512x512) Grid-size = L For example: DDM pattern= 1 1 2 i-direction partitioning : 1 j-direction partitioning : 1 k-direction partitioning : 2 DDM pattern = 1 1 1 Sequential version array size mimax= 513 mjmax= 257 mkmax= 257 Parallel version array size mimax= 513 mjmax= 257 mkmax= 257 imax= 512 jmax= 256 kmax= 256 I-decomp= 1 J-decomp= 1 K-decomp= 1 Start rehearsal measurement process. Measure the performance in 3 times. MFLOPS: 149.74321524898934 time(s): 22.412517070770264 4.88281250E-04 Now, start the actual measurement process. The loop will be excuted in 8 times. This will take about one minute. Wait for a while. Loop executed for 8 times Gosa : 4.88281250E-04 MFLOPS: 149.88961008631279 time(s): 59.708338975906372 Score based on Pentium III 600MHz : 1.80938697
結果は150MFlopsでした。
次に16並列のLXCFのコンテナで実行します。
$ mpirun -np 16 himenoBMTxpr For example: Grid-size= XS (64x32x32) S (128x64x64) M (256x128x128) L (512x256x256) XL (1024x512x512) Grid-size = L For example: DDM pattern= 1 1 2 i-direction partitioning : 1 j-direction partitioning : 1 k-direction partitioning : 2 DDM pattern = 2 2 4 Sequential version array size mimax= 513 mjmax= 257 mkmax= 257 Parallel version array size mimax= 258 mjmax= 130 mkmax= 66 imax= 257 jmax= 129 kmax= 65 I-decomp= 2 J-decomp= 2 K-decomp= 4 Start rehearsal measurement process. Measure the performance in 3 times. MFLOPS: 2561.5325802873126 time(s): 1.3102009296417236 8.44401540E-04 Now, start the actual measurement process. The loop will be excuted in 137 times. This will take about one minute. Wait for a while. Loop executed for 137 times Gosa : 7.51504384E-04 MFLOPS: 2537.1674758698832 time(s): 60.407096862792969 Score based on Pentium III 600MHz : 30.6273251
結果は2.5GFlops(2537MFlops)でした。
16並列の結果 / 1並列の結果 = 16.9
16並列で使用したLXCFコンテナ数と同じ、ほぼ16倍の性能向上をさせることができました。
並列計算による理想的な高速化が実現できています。
これは、LXCFによるオーバーヘッドのないコンテナ環境の並列化が実現できている証拠と言えるでしょう。
イーサーネットのケーブルで複数のPCをつないで電源やネットワークケーブルでごちゃごちゃになって、電気の使用料も多くなるPCクラスタを使わなくても、LXCFを使えば、複数CPUコアを持つマシンによる並列クラスタを簡単に構築できます。
[PageInfo]
LastUpdate: 2014-08-07 12:05:02, ModifiedBy: niwa-hideyuki
[Permissions]
view:all, edit:members, delete/config:members