本Blogで連載の「HPC Cluster構築」の手順に従って作成した、Virtual HPC Cluster USBの使い方を説明します。

USBメモリをノートPC、デスクトップPC、ワークステーション、サーバーなどに差し込んで、Boot Deviceとして選択して立ち上げます。

するとUbuntu 20.04 LTSのデスクトップ画面が立ち上がりUser:hpcで自動ログインされます。パスワードはhpc1234です。sudoでrootになれます。パスワードは独自のものに変更してください。立ち上がったコンピュータを以降はWorkbenchと呼ぶことにします。

すぐにVirtual HPC Clusterを立ち上げることができますが、その前にお使いのCPUとメモリの性能をフルに発揮させるための設定を行います。ここでお断りしておきますが、Intel CPUでの動作確認は行っておりますが、AMD CPUでの動作確認は行なっておりません。AMD EPYC Genoaでは動作しませんでした。その他のAMD CPUでも動作しない可能性があります。その場合は、Intel製CPUでお試しください。初期設定では、4ノードのクラスターが構築されています。

左側のVirtualboxのアイコンをクリックします。

Virtualbox ManagerのWindowが開きます。

hpc01~hpc04の4ノードが作成されています。各ノードはコア数1、メモリ2048MBが初期設定になっています。これをある程度大きな値に変更します。ここでは、コア数は、Workbenchのコア数を4で割った値、メモリはWorkbenchのメモリ量を5で割った値にします。この値は参考値です。お使いのコンピュータでは、別の値でないと動作しないかもしれません。動作しない場合、試行錯誤してみてください。

Workbenchのコア数は、ターミナルでnprocコマンドで、メモリ量はfree -mコマンドで知ることができます。

この例ではWorkbenchのコア数は24、メモリは512GBであることが分かりましたので、各ノードのコア数を6、メモリを100GB=102400MBに設定します。

Virtualbox Managerの歯車のアイコンをクリックし開いた画面の左側のSystemをクリックします。

MotherboardタブのBase Memoryを102400MBに、ProcessorタブでProcessor数を6に設定します。

その後OKをクリックします。

Base MemoryとProcessorsが設定した値になっているのが確認できます。変更はhpc04に対して行いましたが、これをhpc01~hpc03についても行います。

Virtual HPC Clusterを立ち上げる方法は3つあります。

1. Virtualbox Managerからhpc01を立ち上げて

その後hpc02~hpc04も同様に立ち上げます。下の画面のようになり、各ノードにWorkbench上でログインできますが、画面がたくさん出て来て操作がしづらいという欠点があります。クラスターなので、hpc01にログインすれば全ての操作ができますので。

2. hpc01のみGUIで立ち上げて、hpc02~hpc03はhpc01からsshやジョブスケジューラでコントロールする。方法:Workbenchのターミナルからcstart-guiを入力。cstart-cuiはBash Scriptで下記のようになっています。

hpc@workbench:~$ cat `which cstart-gui`
#!/bin/bash
echo hpc01 booting
VBoxManage startvm "hpc01" --type gui
echo wait for a while
sleep 10
echo hpc02 booting
VBoxManage startvm "hpc02" --type headless
echo hpc03 booting
VBoxManage startvm "hpc03" --type headless
echo hpc04 booting
VBoxManage startvm "hpc04" --type headless

3. Virtual HPC Clusterの全ノードを画面なしで立ち上げ、コントロールはWorkbenchからsshでhpc01にログインすることで行います。

方法:Workbenchのターミナルから、cstart-cuiを入力。

cstart-cuiは以下の内容です。

hpc@workbench:~$ cat `which cstart-cui`
#!/bin/bash
echo hpc01 booting
VBoxManage startvm "hpc01" --type headless
echo wait for a while
sleep 10
echo hpc02 booting
VBoxManage startvm "hpc02" --type headless
echo hpc03 booting
VBoxManage startvm "hpc03" --type headless
echo hpc04 booting
VBoxManage startvm "hpc04" --type headless

hpc01にログインするにはWorkbenchのターミナルで、

ssh -p 2221 localhost

を実行します。

hpc01にログイン後bhostsコマンドで、クラスターの状態を見てみました。hpc01~hpc06に各6コアあり今は使われていない状態(当然ですが)であることが分かります。

それではいきなりですが、MPIのジョブをジョブスケジューラで流してみましょう。姫野ベンチのMPI版が/home/hpc/himenoにダウンロードしてあります。

hpc@hpc01:~$ cd himeno
hpc@hpc01:~/himeno$ ls
bound.mod hello himenobmtxpr.f90 mpihosts pres.mod work.mod
bsub_himeno hello.f90 himenop mtrx.mod run_himeno
comm.mod himeno logdir others.mod ts

この中の、himenobmtxpr.f90が姫野ベンチMPI版のソースコードです。

コンパイルします。

hpc@hpc01:~/himeno$ mpif90 -Ofast himenobmtxpr.f90 -o himeno
2コアで実行してみましょう(MPI版のため2コア以上でないと実行できません)。

hpc@hpc01:~/himeno$ mpirun -np 2 ./himeno

実行すると、グリッドサイズをどれにするか聞かれますので、一番大きいxlを入力します。

続いてグリッドをどのように分割するか聞かれますので
1 コア数 1、今回は1 2 1を入力します。

すると3サイクルのリハーサルシミュレーションを行い、1サイクルあたりの時間を計測します。その時間をもとに、1分間のサイクル数を計算し、その数だけ本番のシミュレーションを行います。従って、CPUの性能やコア数に関わらず、常に約1分で実行が終了します。

姫野ベンチをジョブスケジューラに投入するscriptはbsub_himenoで内容は

hpc@hpc01:~/himeno$ cat bsub_himeno
#!/bin/bash
bsub -n $1 -o logdir openmpi-mpirun ./himenop $1

で、./bsub_himeno コア数 のように使います。中で、Lavaのジョブ投入コマンド、bsubが使われています。bsubの使い方は、man bsubでご覧ください。mpirunを直接呼び出すのでなく、wrapperのopenmpi-mpirunを呼び出しています。これもbash scriptなので、興味のある方はless `which oprnmpi-mpirun`などでみてください。

下請けのscript=himenopは

hpc@hpc01:~/himeno$ cat himenop
#!/bin/bash
./himeno <<.
xl
1 $1 1
.

です。

これを使い、2、4、8、16、24コアで姫野ベンチのジョブを投入してみましょう。

for n in 2 4 8 16 24;do ./bsub_himeno $n;done

で投入できます。投入後bhostsコマンドで、各ノードのコアの占有状態を表示できます。bjobsコマンドで、どのジョブがどのノードの何コアを占有しているか表示できます。931が2コアのジョブ、932が4コアのジョブ、933が8コアのジョブ、934が16コアのジョブ、935が24コアのジョブです。2コア、4コア、8コアのジョブの実行で、全ノードの24コアのうち14コアを占有してしまい、残りが10コアしかないため、ペンディングの16コアのジョブ(934)と24コア(935)のジョブを投入できません。

もし、途中で特定のジョブをkillしたければ、bkill ジョブ番号 で可能です。全てのジョブをkillしたい場合は、bkill 0 で可能です。

その後、8コアの933が終了して、18コアの空きができたので、16コアの934が実行を始めました。効率的にリソースが使われていることが分かります。

 

最後に全てのコアが空くのを待って24コアの935が実行を始めて、やがて終わります。

実行結果はbsub_himenoで指定したlogdirの下にジョブ番号.outというファイルで記録されます。20コア実行の結果は以下のとおりです。

2、4、8、16、20コアでの結果は次のようになりました。

以上で、HPC Clusterでジョブスケジューラを使って、MPIジョブを流す説明が終了しました。

続いて、新規ユーザの登録について説明します。クラスターですので、新規ユーザはhpc01で登録すれば、全ノードで有効になります。MPIジョブを流すために必要なパスワードなしのsshログインのための設定、各ノードにあるローカルなホームディレクトリ、/home2~/home4へのユーザディレクトリの作成も行います。

そのコマンドはcadduserです。cadduser 新ユーザ名 のように使います。内容は下記の通りです。

root@hpc01:~# cat `which cadduser`
#!/bin/bash
adduser $1
if [ $? == 1 ]
then
exit
fi
pushd /var/yp
make
popd
su -c "yes '' | ssh-keygen -N '' > /dev/null" - $1
su -c "cd .ssh; cp id_rsa.pub authorized_keys" - $1
mkdir /home2/$1
mkdir /home3/$1
mkdir /home4/$1
chown $1:$1 /home2/$1
chown $1:$1 /home3/$1
chown $1:$1 /home4/$1

今登録したtestuserになって、hpc02にsshログインしてみます。パスワードなしでログインできます。/home /home2 /home3 /home4にもtestuserのディレクトリができています。

Virtual ClusterからReal Clusterにクローンすることも簡単にできます。その方法についてはこちらをご覧ください。