本家様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

全体像

TORQUEslurm と同じように nis/samba-ad/ldapとかでノードのアカウント管理が行われ、nfsで/home, /appsらが共有されているとします.

ここでは ジョブを管理するOpenPBS管理ノードが1台、計算ノードはn1,n2,n3の3台、そしてジョブを投入するサイトが1台としてます

全ノードのOSは全てCentOS 7で、大事な時計は chrony で同期しています.

役目ホスト名IPアドレスcore数備考
管理ノードopenpbs192.168.0.701nis/samba-ad/ldapに参加する必要はありません
計算ノードn1192.168.0.521
n2192.168.0.532
n3192.168.0.543
s192.168.0.74GPUを2枚搭載
ジョブ発行ノードclient192.168.0.201

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」なる下記のジョブファイルを用意します

#!/bin/bash
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」(ジョブ実行前)に限ります
    qmove chem <job ID>

管理ノードのホスト名が変わったらデータベースを作り直す
「/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")}'

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2022-05-12 (木) 05:08:00 (386d)