万人のためのハイパフォーマンスコンピューティング

HPC Do It Yourself Club

      HOMEE5-2600v3製品情報お役立ち情報購入案内お問い合わせ会社案内
      ムービーダウンロードドキュメント最新トピックスおもしろLinkHPCノウハウ

4 Node FDR Infiniband Cluster性能評価
OpenMPIとOpenMPのHybrid実行でのMustオプション
OpenMPIで別ノードの環境変数をセットするには

Lavaとmpirunとのインターフェース、

openmpi-mpirunについて少し掘り下げる

 少し前にMPIジョブをLavaを使って実行するという記事を書きました。それに対して、読者の方からコメントをいただきました。「一点質問ですが、openmpi-mpirunで使われるmpirunは、lavaをインストールした際にパスが通されていたmpirunのみでしょうか。 例えば、lavaのインストール後にopenmpiの新しいバージョンを入れてパスを通した場合、そちらが使われることになるのでしょうか。」というものです。ご質問、どうもありがとうございます。この質問にお答えするために、openmpi-mpirunについて調べてみましょう。
 openmpi-mpirunはどこにあるのでしょうか? それは、which openmpi-mpirunを実行するとわかります。
[hpc@hpc01 lavatest]$ which openmpi-mpirun
/usr/bin/openmpi-mpirun
これはどういうファイルでしょうか? file `which openmpi-mpirun`で見てみると、
[hpc@hpc01 lavatest]$ file `which openmpi-mpirun`
/usr/bin/openmpi-mpirun: POSIX shell script text executable
となり、shell scriptであることがわかります。内容は、less `which openmpi-mpirun`などでわかります。この記事には、内容は載せません。御覧になりたい方は、ご自分でコマンドを入力してください。内容を見ていくと、中で使われるmpirunは`which mpirun`で得られるmpirun、つまりPATHの中にある mpirunであることがわかります。従って、冒頭のご質問に対するお答えは、openmpiの新しいバージョンのmpirunが使われます、になります。
 openmpi-mpirunの内容をさらに見ていくと、bsubコマンドがopenmpi-mpirunに対して、環境変数LSB_JOBFILENAMEとLSB_HOSTSを使って、情報を渡していることがわかります。このメカニズムを理解するために、2つの環境変数の内容を表示するlsb_varsというshell scriptを作って、いくつか試してみましょう。shell scriptの内容は、
[hpc@hpc01 lavatest]$ cat lsb_vars
#!/bin/bash
echo LSB_JOBFILENAME=$LSB_JOBFILENAME
echo LSB_HOSTS=$LSB_HOSTS
です。
クラスターの状態は、bhostsで見ることができ、
[hpc@hpc01 lavatest]$ bhosts
HOST_NAME STATUS JL/U MAX NJOBS RUN SSUSP USUSP RSV 
hpc01 ok - 16 0 0 0 0 0
hpc02 ok - 16 1 1 0 0 0
hpc03 ok - 16 0 0 0 0 0
hpc04 ok - 16 0 0 0 0 0
hpc05 ok - 16 0 0 0 0 0
hpc06 ok - 16 0 0 0 0 0
hpc07 ok - 16 0 0 0 0 0
hpc08 ok - 16 0 0 0 0 0
の様になっています。hpc01〜hpc08が使用可能です。
lsb_varsをbsubを使わないで実行しした場合、環境変数には何も設定されていないことがわかります。
[hpc@hpc01 lavatest]$ ./lsb_vars 
LSB_JOBFILENAME=
LSB_HOSTS=
次にbsubを使ってlsb_varsを実行してみましょう。
[hpc@hpc01 lavatest]$ bsub -o logdir ./lsb_vars
Job <1449> is submitted to default queue .
[hpc@hpc01 lavatest]$ bjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME
SUBMIT_TIME
1449 hpc PEND normal hpc01 ./lsb_vars Dec 20
10:19
[hpc@hpc01 lavatest]$ bjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME
SUBMIT_TIME
1449 hpc RUN normal hpc01 hpc03 ./lsb_vars Dec 20
10:19
[hpc@hpc01 lavatest]$ bjobs
No unfinished job found
出力結果を見てみると、
[hpc@hpc01 lavatest]$ cat logdir/1449.out 
Sender: LSF System [lavaadmin@hpc03]
Subject: Job 1449: [./lsb_vars] Done

Job [./lsb_vars] was submitted from host [hpc01] by user [hpc].
Job was executed on host(s) [hpc03], in queue [normal], as user [hpc].
[/home/hpc] was used as the home directory.
[/home/hpc/lavatest] was used as the working directory.
Started at Thu Dec 20 10:19:35 2012
Results reported at Thu Dec 20 10:19:44 2012

Your job looked like:

------------------------------------------------------------
# LSBATCH: User input
./lsb_vars
------------------------------------------------------------

Successfully completed.

Resource usage summary:

CPU time : 0.04 sec.

The output (if any) follows:

LSB_JOBFILENAME=/home/hpc/.lsbatch/1355966364.1449
LSB_HOSTS=hpc03
bsubが実行するプログラムに、環境変数LSB_HOSTSを使って、実行するコンピュータのホスト名を知らせているのがわかります。シングルコア用プログラムや、OpenMPプログラムの場合、どのコンピュータで実行するかを知る必要は通常ありません。しかし、mpirunでは-npで指定する数だけ、そのコアがどのコンピュータ上にあるのかを、 (-machinefileオプションに続くファイル中で)明示的に指定しなければなりません。
 lsb_varsはシングルコア用のshell scriptですが、bsubに-nオプションを付け、複数コアで実行してみます。
[hpc@hpc01 lavatest]$ bsub -o logdir -n 4 ./lsb_vars 
Job <1450> is submitted to default queue .
[hpc@hpc01 lavatest]$ bjobs
JOBID USER STAT QUEUE FROM_HOST EXEC_HOST JOB_NAME
SUBMIT_TIME
1450 hpc RUN normal hpc01 hpc03 ./lsb_vars Dec 20
12:19
hpc03
hpc03
hpc03
[hpc@hpc01 lavatest]$ bjobs
No unfinished job found
結果は、
[hpc@hpc01 lavatest]$ cat logdir/1450.out 
Sender: LSF System [lavaadmin@hpc03]
Subject: Job 1450: [./lsb_vars] Done

Job [./lsb_vars] was submitted from host [hpc01] by user [hpc].
Job was executed on host(s) [4*hpc03], in queue [normal], as user [hpc].
[/home/hpc] was used as the home directory.
[/home/hpc/lavatest] was used as the working directory.
Started at Thu Dec 20 12:19:36 2012
Results reported at Thu Dec 20 12:19:45 2012

Your job looked like:

------------------------------------------------------------
# LSBATCH: User input
./lsb_vars
------------------------------------------------------------

Successfully completed.

Resource usage summary:

CPU time : 0.04 sec.

The output (if any) follows:

LSB_JOBFILENAME=/home/hpc/.lsbatch/1355973568.1450
LSB_HOSTS=hpc03 hpc03 hpc03 hpc03
bsubは4コア確保してlsb_varsを実行します。環境変数LSB_HOSTSにはhpc03が4つ書かれています。しかし、lsb_varsは1コアだけしか使いません。bsubはコアを-nで指定された数確保して、プログラムをその内の1つで実行するだけです。そこから先、確保されたコアをどう使うかはプログラムの責任になるわけです。
 さらに、openmpi-mpirunでlsb_varsを実行してみると、
[hpc@hpc01 lavatest]$ bsub -o logdir -n 4 openmpi-mpirun ./lsb_vars 
Job <1452> is submitted to default queue .
[hpc@hpc01 lavatest]$ bjobs
No unfinished job found
結果は、
[hpc@hpc01 lavatest]$ cat logdir/1452.out 
Sender: LSF System [lavaadmin@hpc03]
Subject: Job 1452: [openmpi-mpirun ./lsb_vars] Done

Job [openmpi-mpirun ./lsb_vars] was submitted from host [hpc01] by user [hpc].
Job was executed on host(s) [4*hpc03], in queue [normal], as user [hpc].
[/home/hpc] was used as the home directory.
[/home/hpc/lavatest] was used as the working directory.
Started at Thu Dec 20 12:58:56 2012
Results reported at Thu Dec 20 12:59:09 2012

Your job looked like:

------------------------------------------------------------
# LSBATCH: User input
openmpi-mpirun ./lsb_vars
------------------------------------------------------------

Successfully completed.

Resource usage summary:

CPU time : 0.12 sec.

The output (if any) follows:

LSB_JOBFILENAME=/home/hpc/.lsbatch/1355975927.1452
LSB_HOSTS=hpc03 hpc03 hpc03 hpc03
LSB_JOBFILENAME=/home/hpc/.lsbatch/1355975927.1452
LSB_HOSTS=hpc03 hpc03 hpc03 hpc03
LSB_JOBFILENAME=/home/hpc/.lsbatch/1355975927.1452
LSB_HOSTS=hpc03 hpc03 hpc03 hpc03
LSB_JOBFILENAME=/home/hpc/.lsbatch/1355975927.1452
LSB_HOSTS=hpc03 hpc03 hpc03 hpc03
となり、lsb_varsが4つ実行されています。mpirunが4つ実行させました。しかし、lsb_varsは並列プログラムではないので、4つ実行しても何のメリットも得られません。ここから先、並列の効果を出すのは、実行されるプログラムの責任になります。
 openmpi-mpirunの内容をさらに見ていくと、環境変数LSB_HOSTSからmpi_machinesファイルを作り、それをmpirunに渡していることがわかります。mpi_machinesファイルが書き込まれる場所は、環境変数LSB_JOBFILENAMEで示されるファイルがあるディレクトリになります。それは各ユーザーのホームディレクトリ下の.lsbatchになります。見てみると、その中に先ほどopenmpi-mpirunからmpirunに渡された、mpi_machinesファイルがあり、内容も確認できます。
[hpc@hpc01 lavatest]$ ls /home/hpc/.lsbatch/
mpi_args mpi_machines mpi_machines.lst
[hpc@hpc01 lavatest]$ cat /home/hpc/.lsbatch/mpi_machines
hpc03
hpc03
hpc03
hpc03
以上、openmpi-mpirunの役割とメカニズムが明らかになったのではないでしょうか。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Copyright (C) HPCシステムズ株式会社. All Rights Reserved.