#author("2024-10-09T10:31:34+00:00","default:sysosa","sysosa") #author("2026-03-13T16:31:29+00:00","default:sysosa","sysosa") 本家様[[https://www.openpbs.org/>+https://www.openpbs.org/]] ジョブスケジューラ [[TORQUE]]もいいのだが現状オープンソースではなく商用品のご様子. &size(10){2018.06に宣言}; 出来ればずっと継続的に開発され進化し続けてくれるものが望ましく、その一つに[[slurm]]がある. これはこれでいいのだが、ここにきて商用品であるPBS Professionalがオープンソースとして提供されている. 名称は OpenPBS です. ここではこの OpenPBS について取り上げる. &size(10){特徴と言うかそのように作られたのでしょうけど、postgreSQLを利用しています}; &size(10){macOSではコンパイルできませんでした}; &size(10){[[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/>+https://www.altairjp.co.jp/pbs-works-documentation/]] [[OpenPBS/ubuntu]] [[OpenPBS/ulimit]] ***全体像 [#fb2f0c26] [[TORQUE]]や[[slurm]] と同じように [[nis>NIS]]/[[samba-ad>samba]]/[[ldap>LDAP]]とかでノードのアカウント管理が行われ、nfsで/home, /appsらが共有されているとします. ここでは ジョブを管理するOpenPBS&color(orangered){管理ノード};が1台、&color(blueviolet){計算ノード};はn1の1台、そして&color(green){ジョブを投入するサイト};が1台としてます 全ノードのOSは全て&color(lightseagreen){''Rockylinux8''};で、大事な時計は chrony で同期しています. |BGCOLOR(yellow):役目|BGCOLOR(yellow):ホスト名|BGCOLOR(yellow):IPアドレス|BGCOLOR(yellow):core数|BGCOLOR(yellow):備考| |&color(orangered){管理ノード};|openpbs|192.168.0.70|1|nis/samba-ad/ldapに参加する必要はありません| |&color(blueviolet){計算ノード};|pbs-node1|192.168.0.101|4|GPUを1枚搭載| |&color(blueviolet){計算ノード};|pbs-node2|192.168.0.101|4|| |&color(green){ジョブ発行ノード};|pbs-client|192.168.0.45|1|| ***rpmパッケージの作成 [#z10b1b88] ソースからコンパイルして用意するのもありなのだが、全ノードでコンパイルは面倒至極. なのでrpmパッケージを作ります. [[OpenPBS/rpm]] ***構築 [#e96e9fee] ジョブ管理ノードには (作業:[[OpenPBS/server]]) -openpbs-server-23.06.06-0.x86_64.rpm 計算ノードには (作業:[[OpenPBS/execution]]) -openpbs-execution-23.06.06-0.x86_64.rpm ジョブ発行ノードには (作業:[[OpenPBS/client]]) -openpbs-client-23.06.06-0.x86_64.rpm をそれぞれインストールする &color(red){*}; 「&color(darkgreen){pbspro-execution};」は「&color(orangered){pbspro-client};」の機能を有してます。なので計算ノードからもジョブを発行できます。 ***リモートシェル [#u04a5ca5] ジョブを流したら 「&color(magenta){qsub: Bad UID for job execution};」 と表示されるなら 計算ノード側に適切なアカウントがないのかも. nis/samba-ad/ldapとかで計算ノード間でアカウントと共有します ジョブ発行ノードから計算ノードへ ssh/rsh でパスワード入力なしでログインできるようにする必要はない. openmpiを使う計算の場合、TM Moduleが有効なら&color(orange){pbs_tmrsh};が仲介してくれるので. 参照[[https://community.openpbs.org/t/how-to-avoid-passwordless-ssh/2211/2>+https://community.openpbs.org/t/how-to-avoid-passwordless-ssh/2211/2]] &color(red){*};計算結果を転送するのにscpを使われては困るので各計算ノードには「$usecp *:/home /home」とかの定義が必要です ~ またインターラクティヴモードで計算ノードへのログインする際にも ssh/rsh の設定らは不要です. そのままで利用可能みたい. ***ジョブの実行 [#u60faf12] 使えるqueueは下記にて確認できる #code(nonumber){{ [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」なる下記のジョブファイルを用意します #code(bash,nooutline,nonumber){{ #!/bin/bash sleep 30 hostname pwd cat $PBS_NODEFILE }} &color(white,blue){留意}; 複数の書式があります -1ノード1coreで計算 &color(magenta){qsub -q workq -l nodes=1:ppn=1 a.sh}; &color(magenta){qsub -q workq -l select=1:ncpus=1 a.sh}; -1ノード1core+特定の計算ノードで計算 &color(magenta){qsub -q workq -l nodes=n1:ppn=1 a.sh}; &color(magenta){qsub -q workq -l select=1:ncpus=1:host=n3 a.sh}; -1ノード2coreで計算 &color(magenta){qsub -q workq -l nodes=1:ppn=2 a.sh}; &color(magenta){qsub -q workq -l select=1:ncpus=2 a.sh}; -2ノードそれぞれ2coreで計算 &color(magenta){qsub -q workq -l nodes=2:ppn=2 a.sh}; &color(magenta){qsub -q workq -l select=2:ncpus=2 a.sh}; -2ノードそれぞれ2core+特定の計算ノードで計算 &color(magenta){qsub -q workq -l nodes=n2:ppn=2+n3:ppn=2 a.sh}; &color(magenta){qsub -q workq -l select=1:ncpus=2:host=n2+1:ncpus=2:host=n3 a.sh}; ***queueの作成 [#f501960e] pbsproには2種類のqueueが用意されている。「routing」と「execution」 「routing」はジョブを他のqueueへ移す「queue」&size(10){(宛先は再度「routing」でも構わなく、当然「execution」でもOK)}; 「execution」はジョブを待機中とか計算中とかにさせる「queue」 &size(10){(「計算のqueue」とかと呼ばれるもの)}; pbsproでは既定で queue「workq」が用意されている。 #code(nonumber){{ [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」が担当するようにした &size(10){もちろんジョブの指定方法では「n1」「n2」の2つを使えます}; #code(nonumber){{ [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」コマンドで確認可能 #code(nonumber){{ [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 ~]# }} ノード指定を解除するには #code(nonumber){{ [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」を特定のユーザしか使わせないなら下記のように設定を施す #code(nonumber){{ Qmgr: set queue bio acl_users="illya@client.sybyl.local,saber@*.sybyl.loca" Qmgr: set queue bio acl_user_enable = true }} もし定義以外のユーザが実行しようとすると下記のようになる #code(nonumber){{ [archer@c ~/pbs]$ qsub d.sh qsub: Unauthorized Request [archer@c ~/pbs]$ }} ***メモ [#pf4c52a5] -20.0.1では「-N」(jobの名称)として「/(スラッシュ)」が入っていると実行できない -queueスクリプトに変数を渡す qusbの引数「-v」を使います。複数入れたい場合は「-v IN=a.mrc,OUT=a.tiff」と「,」で繋げます。 #code(nonumber){{ #!/bin/bash #PBS -q batch cd $PBS_O_WORKDIR e2proc2d.py ${IN} ${OUT} }} として「qsub -v IN=a.mrc,OUT=a.tiff」ができるかと -afterok 特定のジョブが完了後に動かしたい場合は「&color(magenta){afterok};:<jobid>」を指定する。 #code(nonumber){{ qsub -W depend=afterok:244.c JOB_B }} &size(10){「<jobid>」は、ジョブ管理ノードの拡張子を付けた方がいいみたい「244.c」とか}; -walltimeをジョブ投入後に変更する 管理者権限が必要です。 #code(nonumber){{ qalter -l walltime=48:00:00 <job ID> }} -&color(magenta){「Q」};状態のジョブを他のqueueに回す。 一般ユーザでもできます。ただし状態が「Q」(ジョブ実行前)に限ります #code(nonumber){{ qmove chem <job ID> }} 管理ノードのホスト名が変わったらデータベースを作り直す 「/opt/pbs/libexec/pbs_habitat」 を実行する ***一括ジョブ(Job Arrays) [#accbc07c] 参照先 [[https://www.cqu.edu.au/eresearch/high-performance-computing/hpc-sample-code-and-scripts/pbs-job-array-submission>+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つ同時にジョブが動きます。 計算のパラメータをこのジョブファイルで管理して、一括にジョブ投入できます #code(nonumber){{ #!/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ならこの変数とかパラメータをジョブに回せばいいのかなと. ***参照先 [#pbeda4ad] [[https://www.adc.nao.ac.jp/MDAS/ug/mdas-ug_j/4-2.html>+https://www.adc.nao.ac.jp/MDAS/ug/mdas-ug_j/4-2.html]] ***めも [#f996eab7] #code(nonumber){{ qstat -Q -f -w workq | grep Running| awk '{print gensub(/(.*)Running:([0-9]+)(.*)/,"\\2","1")}' }}