本家様https://www.openpbs.org/
ジョブスケジューラ
TORQUEもいいのだが現状オープンソースではなく商用品のご様子. 2018.06に宣言
CentOS7、CentOS8にて今でもyum/dnfでインストール可能ですが、古いオープンソース時代の 4.2.10 が配布されている. それでいいのかは不明
*このバージョン、微妙にschedデーモンがメモリーリークなのか次第にメモリーを消費続けるので適時schedデーモンの再起動が必要...
出来ればずっと継続的に開発され進化し続けてくれるものが望ましく、その一つにslurmがある.
これはこれでいいのだが、ここにきて商用品であるPBS Professionalがオープンソースとして提供されるようになった.
名称は以前、PBSProだったのだが、最近 OpenPBS へ名称変更された.
ここではこの OpenPBS について取り上げる.
特徴と言うかそのように作られたのでしょうけど、postgreSQLを利用しています
macOSではコンパイルできませんでした
OpenPBS/PBS_TMPDIR
OpenPBS/table
OpenPBS/windows ジョブ作成OpenPBS/job
OpenPBS/environment
OpenPBS/GPU
OpenPBS/vnode
ドキュメント https://www.altairjp.co.jp/pbs-works-documentation/
OpenPBS/ubuntu
全体像 †
TORQUEやslurm と同じように nis/samba-ad/ldapとかでノードのアカウント管理が行われ、nfsで/home, /appsらが共有されているとします.
ここでは ジョブを管理するOpenPBS管理ノードが1台、計算ノードはn1,n2,n3の3台、そしてジョブを投入するサイトが1台としてます
全ノードのOSは全てCentOS 7で、大事な時計は chrony で同期しています.
役目 | ホスト名 | IPアドレス | core数 | 備考 |
管理ノード | openpbs | 192.168.0.70 | 1 | nis/samba-ad/ldapに参加する必要はありません |
計算ノード | n1 | 192.168.0.52 | 1 | |
n2 | 192.168.0.53 | 2 |
n3 | 192.168.0.54 | 3 |
s | 192.168.0.7 | 4 | GPUを2枚搭載 |
ジョブ発行ノード | client | 192.168.0.20 | 1 | |
rpmパッケージの作成 †
ソースからコンパイルして用意するのもありなのだが、全ノードでコンパイルは面倒至極.
なのでrpmパッケージを作ります.
OpenPBS/rpm
構築 †
ジョブ管理ノードには (作業:OpenPBS/server)
- openpbs-server-20.0.1-0.x86_64.rpm
計算ノードには (作業:OpenPBS/execution)
- openpbs-execution-20.0.1-0.x86_64.rpm
ジョブ発行ノードには (作業:OpenPBS/client)
- openpbs-client-20.0.1-0.x86_64.rpm
をそれぞれインストールする
* 「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 の設定らは不要です.
そのままで利用可能みたい.
なので /etc/ssh/sshd_config に 「AllowUsers root」を定義させroot以外はログイン不可とかの運用可
rsh系はSELinuxでは使えない. そもそも追加インストールが必要
ジョブの実行 †
使える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」なる下記のジョブファイルを用意します
| sleep 30
hostname
pwd
cat $PBS_NODEFILE
|
留意 複数の書式があります
- 1ノード1coreで計算
qsub -q workq -l nodes=1:ppn=1 a.sh
qsub -q workq -l select=1:ncpus=1 a.sh
- 1ノード1core+特定の計算ノードで計算
qsub -q workq -l nodes=n1:ppn=1 a.sh
qsub -q workq -l select=1:ncpus=1:host=n3 a.sh
- 1ノード2coreで計算
qsub -q workq -l nodes=1:ppn=2 a.sh
qsub -q workq -l select=1:ncpus=2 a.sh
- 2ノードそれぞれ2coreで計算
qsub -q workq -l nodes=2:ppn=2 a.sh
qsub -q workq -l select=2:ncpus=2 a.sh
- 2ノードそれぞれ2core+特定の計算ノードで計算
qsub -q workq -l nodes=n2:ppn=2+n3:ppn=2 a.sh
qsub -q workq -l select=1:ncpus=2:host=n2+1:ncpus=2:host=n3 a.sh
queueの作成 †
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]$
メモ †
- 20.0.1では「-N」(jobの名称)として「/(スラッシュ)」が入っていると実行できない
- queueスクリプトに変数を渡す
qusbの引数「-v」を使います。複数入れたい場合は「-v IN=a.mrc,OUT=a.tiff」と「,」で繋げます。
#!/bin/bash
#PBS -q batch
cd $PBS_O_WORKDIR
e2proc2d.py ${IN} ${OUT}
として「qsub -v IN=a.mrc,OUT=a.tiff」ができるかと
- afterok
特定のジョブが完了後に動かしたい場合は「afterok:<jobid>」を指定する。
qsub -W depend=afterok:244.c JOB_B
「<jobid>」は、ジョブ管理ノードの拡張子を付けた方がいいみたい「244.c」とか
- walltimeをジョブ投入後に変更する
管理者権限が必要です。
qalter -l walltime=48:00:00 <job ID>
- 「Q」状態のジョブを他のqueueに回す。
一般ユーザでもできます。ただし状態が「Q」(ジョブ実行前)に限ります
管理ノードのホスト名が変わったらデータベースを作り直す
「/opt/pbs/libexec/pbs_habitat」
を実行する
一括ジョブ(Job Arrays) †
参照先 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")}'