修正中

本家様https://www.openpbs.org/
ジョブスケジューラ
TORQUEもいいのだが現状オープンソースではなく商用品のご様子. 2018.06に宣言
CentOS7、CentOS8にて今でもyum/dnfでインストール可能ですが、古いオープンソース時代の 4.2.10 が配布されている. それでいいのかは不明
*このバージョン、微妙にschedデーモンがメモリーリークなのか次第にメモリーを消費続けるので適時schedデーモンの再起動が必要...

出来ればずっと継続的に開発され進化し続けてくれるものが望ましく、その一つにslurmがある.
これはこれでいいのだが、ここにきて商用品であるPBS Professionalがオープンソースとして提供されるようになった.

名称は以前、PBSProだったのだが、最近 OpenPBS へ名称変更された.
ここではこの OpenPBS について取り上げる. CentOS8でインストール可能なパッケージを用意したいと思う

特徴と言うかそのように作られたのでしょうけど、postgreSQLを利用しています
macOSではコンパイルできませんでした
OpenPBS/PBS_TMPDIR
OpenPBS/table

OpenPBS/windows ジョブ作成OpenPBS/job
OpenPBS/environment
OpenPBS/GPU
ドキュメント https://www.altairjp.co.jp/pbs-works-documentation/

rpmbuildの下準備

っで、まずは下準備

[root@centos8 ~]# mkdir -p ~/rpmbuild/{SOURCES,SPECS}

pbsproソースファイルの作成

https://github.com/openpbs/openpbsから最新コードが入手可能で、
ここでは v20.0.1 を調理します. *branchで最新系列でもいいのですが、特定のバージョンで作ることにしました
まずはgitで取得します

[root@centos8 ~]# cd /apps/src/
[root@centos8 src]# git clone https://github.com/openpbs/openpbs
[root@centos8 src]# cd openpbs/
[root@centos8 openpbs]# git tag
 :
v20.0.0
v20.0.1
 
[root@centos8 openpbs]# git checkout -b v20.0.1 refs/tags/v20.0.1
Switched to a new branch 'v20.0.1'
[root@centos8 openpbs]# git branch
  master
* v20.0.1
[root@centos8 openpbs]#

rpmbuildでビルドするための準備

[root@centos8 openpbs]# cd ..
[root@centos8 src]# tar cvfz ~/rpmbuild/SOURCES/openpbs-20.0.1.tar.gz openpbs --transform 's/openpbs/openpbs-20.0.1/'

これで「~/rpmbuild/SOURCES」にソースtarballが用意される(~/rpmbuild/SOURCES/pbspro-20.0.1.tar.gz)

あとはopenpbsのspecファイルを「~/rpmbuild/SPECS/」内に配置する
幸い openpbs の git にはopenpbs.specファイルが用意されているのでこれをそのまま採用します

[root@centos8 src]# cp openpbs/openpbs.spec ~/rpmbuild/SPECS/

そのままでもいいのだが、一部specファイルを修正します。

Python

「~/rpmbuild/SPECS/openpbs.spec」の中身を読むと
BuildRequires; python3-devel >= 3.5

とあり、python3系での対応が必要なのが分かる.
CentOS7では既定でpython2.7なので、yumでpython3.6をインストールする必要がある. CentOS8ではpython3.6が既定です.

OpenPBS specファイルの修正

OpenPBSの既定の場所を変更してます. 全くの好みです. Torqueがこの場所を使っていたので

--- rpmbuild/SPECS/openpbs.spec.old     2020-08-30 00:31:14.552949519 +0900
+++ rpmbuild/SPECS/openpbs.spec 2020-08-30 00:31:30.495286834 +0900
@@ -56,7 +56,7 @@
 %endif
 
 %if !%{defined pbs_home}
-%define pbs_home /var/spool/pbs
+%define pbs_home /var/lib/pbs
 %endif
 
 %if !%{defined pbs_dbuser}

rpmbuildの実行

その前にOpenPBSのbiuldに必要なパッケージをyum/dnfでインストール。

[root@centos8 ~]# dnf --enablerepo=PowerTools install expat-devel hwloc-devel libXt-devel libedit-devel libical-devel \
                                                libtool-ltdl-devel ncurses-devel openssl-devel perl \
                                                postgresql-contrib postgresql-devel python3-devel \
                                                swig tcl-devel tk-devel zlib-devel

そうしてrpmbuildを実行します

[root@centos8 ~]# rpmbuild -ba rpmbuild/SPECS/openpbs.spec

完成品がこれ

[root@centos8 ~]# ls -lh rpmbuild/RPMS/x86_64/
total 25M
-rw-r--r--. 1 root root 1.8M Aug 30 01:03 openpbs-client-20.0.1-0.x86_64.rpm
-rw-r--r--. 1 root root 3.5M Aug 30 01:03 openpbs-client-debuginfo-20.0.1-0.x86_64.rpm
-rw-r--r--. 1 root root 158K Aug 30 01:03 openpbs-debuginfo-20.0.1-0.x86_64.rpm
-rw-r--r--. 1 root root 1.9M Aug 30 01:03 openpbs-debugsource-20.0.1-0.x86_64.rpm
-rw-r--r--. 1 root root 431K Aug 30 01:03 openpbs-devel-20.0.1-0.x86_64.rpm
-rw-r--r--. 1 root root 2.2M Aug 30 01:03 openpbs-execution-20.0.1-0.x86_64.rpm
-rw-r--r--. 1 root root 4.5M Aug 30 01:03 openpbs-execution-debuginfo-20.0.1-0.x86_64.rpm
-rw-r--r--. 1 root root 3.4M Aug 30 01:03 openpbs-server-20.0.1-0.x86_64.rpm
-rw-r--r--. 1 root root 7.3M Aug 30 01:03 openpbs-server-debuginfo-20.0.1-0.x86_64.rpm
[root@centos8 ~]#

品目が分かりやすくていい

構築

ジョブ管理ノードには (作業: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」の機能を有してます。なので計算ノードからもジョブを発行できます。

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」(ジョブ実行前)に限ります
    qmove chem <job ID>
  • set server flatuid = True
    管理ノード以外の誰でもジョブを投げれるようにするなら
  • メールを送るのを停止する
    qdelで殺された、自殺か、他殺かでメールとか、計算が終わったとかでもメールを送信することができる。
    っが、全てのメールを停止するには「qsub -m n sample.sh」でqueueを発行するか、
    set server default_qsub_arguments= "-m n"とする
  • いま稼働中のOpenPBSのバージョンは?
    「qstat -fB | grep pbs_version」で得られる

トップ   編集 添付 複製 名前変更     ヘルプ   最終更新のRSS
Last-modified: 2020-09-14 (月) 04:37:20 (4d)