本家様https://www.openpbs.org/
ジョブスケジューラ
TORQUEもいいのだが現状オープンソースではなく商用品のご様子. 2018.06に宣言
出来ればずっと継続的に開発され進化し続けてくれるものが望ましく、その一つにslurmがある.
これはこれでいいのだが、ここにきて商用品であるPBS Professionalがオープンソースとして提供されている. 名称は OpenPBS です.
ここではこの OpenPBS について取り上げる.
特徴と言うかそのように作られたのでしょうけど、postgreSQLを利用しています
macOSではコンパイルできませんでした
OpenPBS/PBS_TMPDIR
OpenPBS/table
OpenPBS/windows ジョブ作成OpenPBS/job
OpenPBS/environment
OpenPBS/GPU
OpenPBS/vnode
OpenPBS/restrict_user
ドキュメント https://www.altairjp.co.jp/pbs-works-documentation/
TORQUEやslurm と同じように nis/samba-ad/ldapとかでノードのアカウント管理が行われ、nfsで/home, /appsらが共有されているとします.
ここでは ジョブを管理するOpenPBS管理ノードが1台、計算ノードはn1の1台、そしてジョブを投入するサイトが1台としてます
全ノードのOSは全てRockylinux8で、大事な時計は chrony で同期しています.
役目 | ホスト名 | IPアドレス | core数 | 備考 |
管理ノード | openpbs | 192.168.0.70 | 1 | nis/samba-ad/ldapに参加する必要はありません |
計算ノード | pbs-node1 | 192.168.0.101 | 4 | GPUを1枚搭載 |
計算ノード | pbs-node2 | 192.168.0.101 | 4 | |
ジョブ発行ノード | pbs-client | 192.168.0.45 | 1 |
ソースからコンパイルして用意するのもありなのだが、全ノードでコンパイルは面倒至極.
なのでrpmパッケージを作ります.
OpenPBS/rpm
ジョブ管理ノードには (作業:OpenPBS/server)
計算ノードには (作業:OpenPBS/execution)
ジョブ発行ノードには (作業:OpenPBS/client)
をそれぞれインストールする
* 「pbspro-execution」は「pbspro-client」の機能を有してます。なので計算ノードからもジョブを発行できます。
ジョブを流したら
「qsub: Bad UID for job execution」
と表示されるなら
計算ノード側に適切なアカウントがないのかも. nis/samba-ad/ldapとかで計算ノード間でアカウントと共有します
ジョブ発行ノードから計算ノードへ ssh/rsh でパスワード入力なしでログインできるようにする必要はない.
openmpiを使う計算の場合、TM Moduleが有効ならpbs_tmrshが仲介してくれるので.
参照https://community.openpbs.org/t/how-to-avoid-passwordless-ssh/2211/2
*計算結果を転送するのにscpを使われては困るので各計算ノードには「$usecp *:/home /home」とかの定義が必要です
またインターラクティヴモードで計算ノードへのログインする際にも ssh/rsh の設定らは不要です.
そのままで利用可能みたい.
使えるqueueは下記にて確認できる
[illya@client ~]$ qstat -Q
Queue Max Tot Ena Str Que Run Hld Wat Trn Ext Type
---------------- ----- ----- --- --- ----- ----- ----- ----- ----- ----- ----
workq 0 0 yes yes 0 0 0 0 0 0 Exe*
[illya@client ~]$
とりあえず、この「workq」を使った簡単なテストジョブを発行してみる
例えば、簡単に「a.sh」なる下記のジョブファイルを用意します
|
留意 複数の書式があります
pbsproには2種類のqueueが用意されている。「routing」と「execution」
「routing」はジョブを他のqueueへ移す「queue」(宛先は再度「routing」でも構わなく、当然「execution」でもOK)
「execution」はジョブを待機中とか計算中とかにさせる「queue」 (「計算のqueue」とかと呼ばれるもの)
pbsproでは既定で queue「workq」が用意されている。
[root@pbspro ~]# qstat -Q
Queue Max Tot Ena Str Que Run Hld Wat Trn Ext Type
---------------- ----- ----- --- --- ----- ----- ----- ----- ----- ----- ----
workq 0 0 yes yes 0 0 0 0 0 0 Exec
[root@pbspro ~]#
queueの名称で特定の計算ノードにジョブが渡るようにするには qmgrにて「set node <node> queue = <queue>」とする
ここでは、queue「bio」が指定されると、計算ノード「n1」と「n2」が担当するようにした
もちろんジョブの指定方法では「n1」「n2」の2つを使えます
[root@pbspro ~]# qmgr
Max open servers: 49
Qmgr: create queue bio queue_type = execution
Qmgr: set queue bio started = true
Qmgr: set queue bio enabled = true
Qmgr: set node n1 queue = bio
Qmgr: set node n2 queue = bio
[root@pbspro ~]#
どの計算ノードがどのqueueに割り当てられているかは「pbsnodes」コマンドで確認可能
[root@pbspro ~]# pbsnodes -aS
vnode state OS hardware host queue mem ncpus nmics ngpus comment
--------------- --------------- -------- -------- --------------- ---------- -------- ------- ------- ------- ---------
n1 free -- -- n1 bio 2gb 1 0 0 --
n2 free -- -- n2 bio 2gb 2 0 0 --
n3 free -- -- n3 -- 2gb 3 0 0 --
[root@pbspro ~]#
ノード指定を解除するには
[root@pbspro ~]# qmgr -c "unset node n2 queue"
とかで
1つの計算ノードを複数のqueueで共有する場合はvnode様式を使う
詳しくはPBSProのAdministrator's Guide「4.8.2.2.i Procedure to Associate Vnodes with Multiple Queues」を参照
queue「bio」を特定のユーザしか使わせないなら下記のように設定を施す
Qmgr: set queue bio acl_users="illya@client.sybyl.local,saber@*.sybyl.loca"
Qmgr: set queue bio acl_user_enable = true
もし定義以外のユーザが実行しようとすると下記のようになる
[archer@c ~/pbs]$ qsub d.sh
qsub: Unauthorized Request
[archer@c ~/pbs]$
#!/bin/bash
#PBS -q batch
cd $PBS_O_WORKDIR
e2proc2d.py ${IN} ${OUT}
qsub -W depend=afterok:244.c JOB_B
qalter -l walltime=48:00:00 <job ID>
qmove chem <job ID>
管理ノードのホスト名が変わったらデータベースを作り直す
「/opt/pbs/libexec/pbs_habitat」
を実行する
参照先 https://www.cqu.edu.au/eresearch/high-performance-computing/hpc-sample-code-and-scripts/pbs-job-array-submission
1つのジョブで複数のqueueを出します。変数は「#PBS -J」で定義して、スクリプト内は「$PBS_ARRAY_INDEX」として扱われる。
キュー名「workq」の中に3台計算機(ncpus=16)があるとすれば、変数を変えて3つ同時にジョブが動きます。
計算のパラメータをこのジョブファイルで管理して、一括にジョブ投入できます
#!/bin/bash
#PBS -q workq
#PBS -N job_array_test
#PBS -l select=1:ncpus=16
#PBS -r y
#PBS -J 1-5 # 1,2,3,4,5と展開されて$PBS_ARRAY_INDEXに入ります
#PBS -R oe # 標準出力、標準エラーをださない
cd $PBS_O_WORKDIR
hostname
date
echo echo $PBS_ARRAY_INDEX $(date) $(hostname) > ${PBS_JOBNAME}.${PBS_ARRAY_INDEX}
結果は「job_array_test.1」「job_array_test.2」とかのファイルが作られる。
bashスクリプトで case 文を作って1ならこの変数、2ならこの変数とかパラメータをジョブに回せばいいのかなと.
https://www.adc.nao.ac.jp/MDAS/ug/mdas-ug_j/4-2.html
qstat -Q -f -w workq | grep Running| awk '{print gensub(/(.*)Running:([0-9]+)(.*)/,"\\2","1")}'