Virtual HPC Cluster USBの使い方
本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にクローンすることも簡単にできます。その方法についてはこちらをご覧ください。