7. DEXCS-OFの拡張例
DEXCS-OFでは、OpenFOAMを実践的に活用できるべく、OpenFOAM以外にも様々なCAEツールを同梱し、isoイメージファイルとして公開している。
しかしながらisoイメージを作成するに際して、イメージの最大サイズが4GBを超えることが出来ないという規格上の制限があって、あれもこれもと同梱できないという事情がある。
ここでは、isoイメージを使って構築した計算環境(実計算機、仮想計算機を問わない)の上に、同梱できなかった有用なアプリケーションを追加インストールした拡張例について、これまで著者が公開してきた事例をいくつか紹介する。
なお、構築した計算環境がインターネット上の公開情報に直接アクセス出来るという前提での構築方法を記しているが、特に企業の職場で使用する場合に、インターネットにそもそもアクセス出来なかったり、出来たとしてもプロキシ経由でのパッケージインストールが出来ないなどの事も多い。かような場合の対処法についても記しておく。
7-1. SLURM
SLURMというのは、SchedMDにて開発されているオープンソースのリソースマネージャ(計算機管理システム)で、ジョブ管理システムとも呼ばれるソフトウェアの代表的なものの一つである。
一般的には、PCクラスタなど大規模な計算機システムを複数のユーザーで利用する場合に、複数のジョブの起動や終了を管理したり、ジョブの実行や終了を監視・報告するのに使われるもので、これにより計算機のリソースを効率良く使うことができるようになる。
DEXCS-OFは主に個人で使うパソコンにインストールして使用することを想定しているが、複数のユーザーで利用する事も可能であるという点と、仮に個人だけで使用する場合でも、複数のジョブをまとめて一括処理したい場合(注記1)などにはこの種のソフトがあると重宝するので、DEXCS2014〜2017までは同梱していた。
DEXS2018以降では同梱していないが、計算環境に応じた個別の設定が必要であるので、同梱したからといって初心者向けにはすぐに使えるという代物ではない。一方インストール方法も簡単になってきているので、使いたいという意欲のある人であれば、計算環境を構築した後で追加インストールして使ってもらえば良いという考え方に至った。
インストール方法
インストール方法は簡単で、パッケージインストールが可能であり、以下のコマンドを入力するだけである。
$ sudo apt install munge slurm-wlm
ここでインストールしているのが、SLURM本体であるslurm-wlm とそれ以外に、munge をインストールしている点に留意されたい。これはユーザー認証を司るもので、DEXCS2017まではこれを使用しないで秘密鍵方式で実施していたのを、このmungeを使うことで、インストールも以下の設定も簡単になったという事である。
設定方法
インストールが正しく実施出来ると、/etc/slurm-llnl/というフォルダが出来ているはずであり、中味は空である。ここに、slurm.confというファイルを以下の内容で収納しておく(要管理者権限)。
# slurm.conf file generated by configurator easy.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ControlMachine=localhost
#ControlAddr=
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-
ProctrackType=proctrack/pgid
ReturnToService=1
SlurmctldPidFile=/var/run/slurm-llnl/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/var/run/slurm-llnl/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/lib/slurm-llnl/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/lib/slurm-llnl/slurmctld
SwitchType=switch/none
TaskPlugin=task/none
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
#SchedulerPort=7321
SelectType=select/cons_res
SelectTypeParameters=CR_CPU
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=localhost
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
#SlurmctldDebug=3
SlurmctldLogFile=/var/log/slurm-llnl/slurmctld.log
#SlurmdDebug=3
SlurmdLogFile=/var/log/slurm-llnl/slurmd.log
#
#
# COMPUTE NODES
NodeName=localhost CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 State=UNKNOWN
PartitionName=debug Nodes=localhost Default=YES MaxTime=INFINITE State=UP
ここで注意を要するのが、計算環境に応じてカスタマイズが必要な箇所があるという点である。具体的には朱字で記した部分で、この数字部分がマシンのスペックに合致していないと、エラーとなって起動できない場合がある。自分が使っているマシンのスペックが判らない場合には注記2を参考に調べていただきたい。
SLURMの起動
$ sudo systemctl enable slurmctld
$ sudo systemctl start slurmctld
$ sudo systemctl enable slurmd
$ sudo systemctl start slurmd
動作確認
うまく動かない時
/var/log/slurm-llnl/ の下に、ログファイルが出力されているので、これを読めば何とか対処できるんでないかと思います。
自分の経験では、slurm.confの記述間違いに起因するエラーが大半でした。
また、sinfo コマンドでSTATEが drain と表示されていると、ジョブを投入してもペンディング状態のまま、いつまでたってもジョブは実行されません。
この場合、ペンディングされたジョブをキャンセル(scancel)して、
$ scancel <job-id>
$ sudo scontrol update nodename=localhost state=idle
DEXCS-OFにおける推奨活用法
SLURMでジョブを実行管理する為には、ジョブを実行するスクリプトが必要になる。DEXCSの標準チュートリアルを題材に作成したスクリプトを以下に示す。
1 #!/bin/bash 2 #SBATCH -n 2 3 #SBATCH -J OpenFOAM 4 #SBATCH -e submit.sh.e%J 5 #SBATCH -o solve.log 6 . /opt/OpenFOAM/OpenFOAM-v1906/etc/bashrc 7 . $WM_PROJECT_DIR/bin/tools/RunFunctions 8 rm -rf ./processor* 9 cartesianMesh 10 checkMesh 11 pyFoamDecompose.py . ${SLURM_NPROCS} 12 mpirun $(getApplication) -parallel 13 reconstructPar -latestTime
2〜5行目で、行頭に#SBATCH とあるのが、いわゆるSLURMコマンドとなって、ハイフォン(-)に続く文字がコマンド、その後にパラメタが記されている。
- 2行目(-n)は、使用するプロセッサの数であり、上例では2つ使用するという意味
- 3行目(-J)は、ジョブの名前で、何でも良いが日本語は不可。
- 4行目(-e)エラーログの出力ファイル名を指定しており、%Jの部分にはジョブ番号が割り当てられる。
- 5行目(-o) 実行時の標準出力名をしている。一般的にはエラーファイル名と同様、%Jを含む形で指定する事が多いが、本例のようにsolve.log という名前にしておくと、後述するTreeFoam上で計算状況の監視が可能になる。
- 6行目 OpenFOAMの環境設定
- 7行目 OpenFOAMの組み込み関数を使用できるようにする(本例では12行目で使用している$(getApplication))
- 8行目 領域分割データがあったら削除
- 9行目 メッシュ作成(既存メッシュを使う場合には不要)
- 10行目 メッシュチェック
- 11行目 領域分割をpyFoamコマンドで実施。これを使うと、領域分割数を指定するだけで良いので、この場合は${SLURM_NPROCS}とすることで、2行目で指定したプロセス数をそのまま引き継げる事になる。
- 12行目 $(getApplication)で取得したアプリケーション(本例ではsimpleFoam)を、並列計算で実行
- 13行目 計算結果を領域結合
上記スクリプト(submit.sh としておくが、名前は何でも良い)を解析フォルダ(dexcsTutorials)中に収納しておこう。
以下に、TreeFoamを使って、このdexcsTutorialsケースのパラメタを各種変更したケースを作り、バッチジョブとして実行する手順を以下に説明する。
ケースのコピーは、コピーしたいケース(dexcsTutorials)を選択して、①右クリックメニューから、②「コピー」、コピー先の親フォルダ(DEXCS)を選択して③マウス右クリックメニューから、④「case貼付け」を使うことで、計算結果を除いたデータがコピーされ、名前は元ケースの名前に、_copy0 が自動付加される。
ケースのコピーが出来たら、これを①「解析caseに設定」し、必要なパラメタを変更した後、メニューの「十徳ナイフ」より、②「バッチジョブをサブミット」を選択。
そうすると、サブミットファイルの選択画面が現れるので、事前に用意したsubmit.sh を選択、④「Open」ボタンを押し、実行確認画面で⑤「OK」ボタンを押せば、サブミットが実行される。
同様なやり方で、パラメタ変更したいケースの数ケースフォルダを準備しておき、それぞれのケース毎に計算パラメタを変更し、サブミットを実行する。
上図の例では、3つのケースフォルダを作成・編集して、サブミットした後、メニューの「十徳ナイフ」より、「バッチジョブの確認」を選択したものである。ここで最初に投入したジョブ(JOBID=11)のST(ステータス)がR(=実行中)であり、残りのジョブ(12,13)のSTがPD(=ペンディング、待ち状態)であることがわかる。
以後は、最初のジョブの計算が終了すれば次のジョブが実行されることになり、終了したジョブは上記リストから削除されていくので、適宜確認しながら、その間安心して他の業務に取り掛かる事が出来るというのが嬉しい所である。
注記1
複数の計算を実施したい場合に、同時に実行するとコア数やメモリ不足を生じる場合が生じる。かような場合には、ひとつずつ順番にジョブを実行する必要がある。複数ジョブの数が多い場合や、少なくても計算に長時間を要する場合に、この順番制御を手動でやるのは非常に効率が悪い。
注記2 マシンのスペック確認方法
論理プロセッサ数
$ cat /proc/cpuinfo | grep “processor”
⇒ CPUs
物理CPUの数
$ cat /proc/cpuinfo | grep “physical id” | uniq
⇒ Sockets
物理コアの数
$ cat /proc/cpuinfo | grep “cpu cores” | uniq
⇒ CoresPerSocket
注記3 サブミット時の実行エラー
サブミットを実行した際、以下のエラーが出る。
sbatch: error: Batch script contains DOS line breaks (\r\n)
sbatch: error: instead of expected UNIX line breaks (\n).
これは特に仮想環境がWindowsマシン上の仮想マシンで有る場合に起こりがちな事で、ジョブ実行スクリプトをWindowsマシン上で作成して、そのファイルを直接使った場合に生じる。DOS(Windows)とUNIX(Linuxも同じ)とではテキストファイルの改行コードが異なる事に起因するエラーである。
linuxには、これに対処する為の変換コマンド(dos2unix)が存在するが、DEXCS-OFには同梱していない(次期ヴァージョンからは同梱予定)ので、これをインストールして変換して使うのが一つの方法。つまり、
また、インストールが出来ない環境なり、端末での操作を極力避けたいという人向けには、テキストエディタを使って変換する事も可能である。つまり、問題のファイルをテキストエディタで開いて、「置換」メニューを使っても良い(下図参照)。
あるいは、全テキスト内容をコピーして、新規ファイルにコピー。新規ファイルを別名で保存すれば、別名で保存したファイルはunix形式として保存されることになる。