lxcficon.jpg スーパーコンピューティングのOpenMPIサーバー

元のページに戻る

スーパーコンピューティングのOpenMPIサーバー

1. 今回構築するサーバの構成

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を止めるため、セキュリティ上問題とならないようにインターネットには直接接続しないほうがよい。

2. インストール

今回はopenmpiを使います。

# yum install openmpi openmpi-devel

3. usr作成

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

4. システム設定

並列実行するコンテナを登録しておきましょう。 まだコンテナの作成は行っていないのですが、事前に登録しておくことは可能です。 ここに登録されたシステムに対して並列実行プログラムが配送されて実行されます。
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

5. firewalldとSELinuxの停止

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

リブートする。

6. コンテナ作成

コンテナを作成します。前に示した通りa0001からa0016まで作ります。
LXCFでは複数のコンテナを作成するのは、コマンド1発で簡単ですよ。

# lxcf  sysgen-n  a 16
OS起動時にコンテナも、自動的に起動するように設定しておきましょう。
# 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

7. コンテナリソース割り当て

次のようなスクリプトを書いて実行しましょう。-i の引数がcpu番号になります。

  1. #!/bin/sh
  2. lxcf set -i 0 a0001
  3. lxcf set -i 1 a0002
  4. lxcf set -i 2 a0003
  5. lxcf set -i 3 a0004
  6. lxcf set -i 4 a0005
  7. lxcf set -i 5 a0006
  8. lxcf set -i 6 a0007
  9. lxcf set -i 7 a0008
  10. lxcf set -i 8 a0009
  11. lxcf set -i 9 a0010
  12. lxcf set -i 10 a0011
  13. lxcf set -i 11 a0012
  14. lxcf set -i 12 a0013
  15. lxcf set -i 13 a0014
  16. lxcf set -i 14 a0015
  17. lxcf set -i 15 a0016

10番以降をa00010とaの後に0を3つ付けてしまいやすいので注意してください。ただしくは0は2つでa0010です。

8. mpiusrユーザのssh環境とbash環境のデプロイ

作成したすべてのコンテナa0001からa0016に最初に設定したsshの設定とbashの設定をデプロイします。

# cd /home/mpiusr
# lxcf  deploy  .ssh
# lxcf  deploy  .bash*

9. known_hostsの設定

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

10. ベンチマーク

姫野ベンチマークを実行してみます。 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コアを持つマシンによる並列クラスタを簡単に構築できます。

元のページに戻る