本家様http://www.pbspro.org/
ジョブスケジューラ
TORQUEもいいのだがmauiとの連携でGPUが残念な状態である。そうなるとslurmが選択肢になるのだが、
ここにきて商用品であるPBS Professionalがオープンソースとして提供されている。
ここではこのPBS Professionalについて取り上げる. CentOS8でインストール可能なパッケージを用意したいと思う
特徴と言うかそのように作られたのでしょうけど、postgreSQLを利用しています
macOSではコンパイルできませんでした
pbspro/PBS_TMPDIR
pbspro/table
pbspro/windows ジョブ作成pbspro/job
pbspro/environment
rpmbuild下準備 †
っで、まずは下準備
[root@c ~]# mkdir -p ~/rpmbuild/{SOURCES,SPECS}
pbsproソースファイルの作成 †
https://github.com/PBSPro/pbspro
から最新コードが入手可能で、
ここでは version 19.1.3 を調理します
まずはgitで取得します
[root@c ~]# cd /apps/src/
[root@c src]#
[root@c src]# git clone https://github.com/PBSPro/pbspro
[root@c src]# cd pbspro/
[root@c pbspro]# git tag
OpenHPC_20160515
v14.1.0
v14.1.2
v18.1.1
v18.1.2
v18.1.3
v18.1.4
v18.1.beta
v19.1.1
v19.1.1beta1
v19.1.2
v19.1.3
[root@c pbspro]#
[root@c pbspro]# git branch
* master
[root@c pbspro]#
[root@c pbspro]# git checkout -b v19.1.3-c refs/tags/v19.1.3
Switched to a new branch 'v19.1.3-c'
[root@c pbspro]#
[root@c pbspro]# git branch
master
* v19.1.3-c
[root@c pbspro]#
PBSProソース一部修正 †
CentOS8になって「/usr/bin/python」がない. 「alternatives --config python」でlinkを用意して逃げればいいのだが、
どうもrpmbuildでは見てくれないようでエラーが発生する。
*** ERROR: ambiguous python shebang in /opt/pbs/unsupported/fw/bin/pbs_stat.py: #!/usr/bin/env python.
Change it to python3 (or python2) explicitly.
なので、ソースコードの一部を修正します。修正箇所は「pbspro/test/fw/bin/」のファイルすべて「pbs_as、pbs_config、pbs_loganalyzer、pbs_snapshot、pbs_swigify、pbs_benchpress、pbs_cov、pbs_py_spawn、pbs_stat」で一行目の「python」を「python2」にします。
#!/usr/bin/env python
↓
#!/usr/bin/env python2
その後にrpmbuildで使用するSOURCEを作ります。
[root@c pbspro]# cd ..
[root@c src]# tar cvfz ~/rpmbuild/SOURCES/pbspro-19.1.3.tar.gz pbspro --transform 's/pbspro/pbspro-19.1.3/'
[root@c src]# cp pbspro/pbspro.spec ~/rpmbuild/SPECS/
(後始末?)
[root@c src]# cd pbspro
[root@c pbspro]#
[root@c pbspro]# git branch
master
* v19.1.3-c
[root@c pbspro]#
[root@c pbspro]# git checkout -f master
[root@c pbspro]# git branch
* master
v19.1.3-c
[root@c pbspro]# git branch -D v19.1.3-c
[root@c pbspro]# git branch
* master
[root@c pbspro]#
PBSPro specファイルの修正 †
[root@c ~]# cp -ap ~/rpmbuild/SPECS/pbspro.spec ~/rpmbuild/SPECS/pbspro.spec.orig
[root@c ~]# vi ~/rpmbuild/SPECS/pbspro.spec
っで修正を加える。
| --- /root/rpmbuild/SPECS/pbspro.spec.orig 2019-10-15 03:19:23.473837197 +0900
+++ /root/rpmbuild/SPECS/pbspro.spec 2019-10-15 03:42:07.404901107 +0900
@@ -53,7 +53,7 @@
%endif
%if !%{defined pbs_home}
-%define pbs_home /var/spool/pbs
+%define pbs_home /var/lib/pbs
%endif
%if !%{defined pbs_dbuser}
@@ -106,8 +106,8 @@
BuildRequires: perl
BuildRequires: postgresql-devel
BuildRequires: postgresql-contrib
-BuildRequires: python-devel >= 2.6
-BuildRequires: python-devel < 3.0
+BuildRequires: python2-devel >= 2.6
+BuildRequires: python2-devel < 3.0
BuildRequires: tcl-devel
BuildRequires: tk-devel
BuildRequires: swig
@@ -268,6 +268,7 @@
%setup
%build
+./autogen.sh
[ -d build ] && rm -rf build
mkdir build
cd build
|
rpmbuildの実行 †
っがpbsproのパッケージ要求があって、下記をyumでインストール。
[root@c ~]# yum --enablerepo=PowerTools install libedit-devel postgresql-contrib postgresql-devel \
swig tcl-devel tk-devel libical-devel hwloc-devel python2-devel
そうしてrpmbuildを実行します
[root@c ~]# rpmbuild -ba rpmbuild/SPECS/pbspro.spec
完成品がこれ
[root@c ~]# ls -lh rpmbuild/RPMS/x86_64/pbspro-*
-rw-r--r-- 1 root root 2.3M Oct 15 04:53 rpmbuild/RPMS/x86_64/pbspro-client-19.1.3-0.x86_64.rpm
-rw-r--r-- 1 root root 3.1M Oct 15 04:54 rpmbuild/RPMS/x86_64/pbspro-client-debuginfo-19.1.3-0.x86_64.rpm
-rw-r--r-- 1 root root 155K Oct 15 04:53 rpmbuild/RPMS/x86_64/pbspro-debuginfo-19.1.3-0.x86_64.rpm
-rw-r--r-- 1 root root 1.9M Oct 15 04:53 rpmbuild/RPMS/x86_64/pbspro-debugsource-19.1.3-0.x86_64.rpm
-rw-r--r-- 1 root root 2.7M Oct 15 04:53 rpmbuild/RPMS/x86_64/pbspro-execution-19.1.3-0.x86_64.rpm
-rw-r--r-- 1 root root 3.9M Oct 15 04:54 rpmbuild/RPMS/x86_64/pbspro-execution-debuginfo-19.1.3-0.x86_64.rpm
-rw-r--r-- 1 root root 3.8M Oct 15 04:53 rpmbuild/RPMS/x86_64/pbspro-server-19.1.3-0.x86_64.rpm
-rw-r--r-- 1 root root 6.5M Oct 15 04:54 rpmbuild/RPMS/x86_64/pbspro-server-debuginfo-19.1.3-0.x86_64.rpm
[root@c ~]#
品目が分かりやすくていい
導入 †
ジョブ管理ノードには (作業:pbspro/server)
- pbspro-server-14.1.2-0.x86_64.rpm
計算ノードには (作業:pbspro/execution)
- pbspro-execution-14.1.2-0.x86_64.rpm
ジョブ発行ノードには (作業:pbspro/client)
- pbspro-client-14.1.2-0.x86_64.rpm
をそれぞれインストールする
留意 同一マシンに「pbspro-execution」と「pbspro-client」は載せられない。
その場合、「pbspro-execution」は「pbspro-client」の機能を持つので「pbspro-execution」をインストールする
hosts.equiv †
計算ノードでの計算が終わった後に、標準出力、標準エラーとかのファイルは、
「/opt/pbs/sbin/pbs_rcp」もしくは「/bin/scp」を使って「ジョブを発行したノード」へコピーされます。
sshで計算ノードからジョブ発行ノードにパスワード無しとかでアクセスできればいいのですが、
そうで無い場合、rcpに対応すべく下記「/etc/hosts.equiv」を用意する
[root@pbspro ~]# cat /etc/hosts.equiv
+ +
[root@pbspro ~]# systemctl enable rexec.socket rsh.socket
[root@pbspro ~]# systemctl start rexec.socket rsh.socket
また、NFSで繋げていれば、計算ノードの「/var/lib/pbs/mom_priv/config」ファイルに
$usecp *:/home /home
$usecp *:/data /data
と記載していれば、rcp/scpなどネットワークを経由せずにcpコマンドでコピーされる
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 ~]#
とりあえず、この「workq」を使った簡単なテストジョブを発行してみる
[illya@pbspro ~]$ cat a.sh
#!/bin/sh
sleep 30
hostname
pwd
[illya@pbspro ~]$ qsub -q workq -N test -l select=1:ncpus=1:mem=1gb a.sh
14.pbspro
[illya@pbspro ~]$ qstat
Job id Name User Time Use S Queue
---------------- ---------------- ---------------- -------- - -----
14.pbspro test illya 00:00:00 R workq
[illya@pbspro ~]$
となる。
queueの名称で特定の計算ノードにジョブが渡るようにするには下記のように「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]$
終わったジョブの情報がみたい
set server job_history_enable = True
set server job_history_duration = 00:10:00
として「qstat -x」とすれば10分前まで過去の終了したジョブ情報が見える。詳しく見たければ「qstat -x -f <ジョブID>」を行う
メモ †
- set server query_other_jobs = True
他ユーザのジョブの状態を見たいのなら
「set server query_other_jobs = True」
をqmgrで実行する
Torqueならこれで /var/lib/torque/spool に蓄えられる一時ファイルのパーミッションが 644 とかになるのだが
PBSProではならないみたい.
もしPBSProでも 644 にしたいのなら ジョブファイルに「#PBS -W umask=0022」を追記する必要がある.
- set server node_fail_requeue = 0
計算ノードの停止とかで通信が途切れて、計算ノードが復帰したらの取り扱い。
0なら途切れればqeueuの条件にあう計算ノードに「requeue」しない。
0以上ならその間はその指定時間(秒)は待機するが、それ以降は「requeue」される。既定で310秒
- set server default_qsub_arguments= "-r n"
そもそも「rerun」をさせない様にするには「#PBS -r n」をジョブスクリプトに記載すればいいのだが、
既定でそのような使用にするには「set server default_qsub_arguments= "-r n"」とする
- 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」(ジョブ実行前)に限ります
- set server flatuid = True
管理ノード以外の誰でもジョブを投げれるようにするなら
- メールを送るのを停止する
qdelで殺された、自殺か、他殺かでメールとか、計算が終わったとかでもメールを送信することができる。
っが、全てのメールを停止するには「qsub -m n sample.sh」でqueueを発行するか、
set server default_qsub_arguments= "-m n"とする