PBS Proによるジョブ管理システムは、次のコンポーネントより構成されます
コンポーネント名 | 識別子 | 役割 |
---|---|---|
Server | pbs_server | ユーザーからジョブの投入や取り消しなどのコマンドを受け付けます |
Scheduler | pbs_sched | ジョブの実行開始や終了のタイミング、どのノードで実行するか、などを管理します |
Communication daemon | pbs_comm | ノード間の通信を仲介します |
Job Executor | pbs_mom | ジョブを実行します。momは Machine Oriented Mini-server の略で、全ての実行中のジョブの母親という意味も込められています |
以下ではNFSサーバによって、管理ノードの
が計算ノードと共有されているとします。 また、hostsファイルはNISによって共有されているとします。
管理ノードで行います
$ sudo vi /etc/hosts
127.0.0.1 localhost 127.0.0.1 kanri 192.168.0.1 kanri 192.168.0.11 keisan11 192.168.0.12 keisan12 192.168.0.13 keisan13 (以下略)
$ sudo make -C /var/yp
管理ノードと計算ノードのそれぞれで、アップデートと(必要ならば)再起動を行います
$ sudo apt update $ sudo apt upgrade $ sudo reboot
PBS Proには次のパッケージが必要です。
$ sudo apt install gcc make libtool libhwloc-dev libx11-dev \ libxt-dev libedit-dev libical-dev ncurses-dev perl \ postgresql-server-dev-all postgresql-contrib python3-dev tcl-dev tk-dev swig \ libexpat-dev libssl-dev libxext-dev libxft-dev autoconf \ automake
$ sudo apt install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin tcl tk libical3 postgresql-server-dev-all libhwloc-dev # OpenPBS v20 $ sudo apt install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin tcl tk libical3 postgresql-server-dev-all # PBS Pro v19
ここでは /opt/pbs/ にPBS Proを設置することにします。
$ sudo apt install git $ git clone https://github.com/openpbs/openpbs.git $ cd openpbs
$ ./autogen.sh $ ./configure -prefix=/opt/pbs $ make
$ sudo make install $ sudo /opt/pbs/libexec/pbs_postinstall
$ sudo update-rc.d pbs defaults
$ sudo vi /etc/pbs.conf
PBS_SERVER=kanri PBS_START_SERVER=1 PBS_START_SCHED=1 PBS_START_COMM=1 PBS_START_MOM=0 PBS_EXEC=/opt/pbs PBS_HOME=/var/spool/pbs PBS_CORE_LIMIT=unlimited PBS_SCP=/usr/bin/scp
$ sudo chmod 4755 /opt/pbs/sbin/pbs_iff /opt/pbs/sbin/pbs_rcp
$ sudo /etc/init.d/pbs start
$ sudo vim /etc/bash.bashrc
(略) . /etc/profile.d/pbs.sh
$ sudo /opt/pbs/libexec/pbs_postinstall
$ sudo update-rc.d pbs defaults
$ sudo vi /etc/pbs.conf
PBS_SERVER=kanri PBS_START_SERVER=0 PBS_START_SCHED=0 PBS_START_COMM=0 PBS_START_MOM=1 PBS_EXEC=/opt/pbs PBS_HOME=/var/spool/pbs PBS_CORE_LIMIT=unlimited PBS_SCP=/usr/bin/scp
$ sudo /etc/init.d/pbs start
計算ノードでの作業はこれで終わりですので、ログアウトして構いません。
すべて管理ノードで作業します
QmgrはPBSの設定を管理するソフトで、操作には管理者権限が必要です。 このページでは必ず設定が必要なものだけを紹介します。
Qmgrは次のようにして起動します。
$ sudo -i qmgr
現在どのような設定がされているかは次のようにして確認します
Qmgr: print server
Qmgrを終了するにはqあるいはexitと入力します
Qmgr: q
また、Qmgr用のプロンプトを起動せずに操作することもできます
$ sudo -i qmgr -c "print server"
計算ノードからでもPBSが使えるようにします
Qmgr: set server flatuid = True
qstatコマンドで他のユーザーのジョブの実行状況が見えるようにします
Qmgr: set server query_other_jobs = True
計算ノードのホスト名を入力します
Qmgr: create node keisan11 Qmgr: create node keisan12 ...
ノードあたりに使用できる最大スレッド数も指定できます(ここでは24コア)。
Qmgr: set node keisan11 resources_available.ncpus=24 Qmgr: set node keisan12 resources_available.ncpus=24 ...
ノードの設定状況も確認できます
Qmgr: print node keisan11 # # Create nodes and set their properties. # # # Create and define node yagami11 # create node yagami11 set node keisan11 state = free set node keisan11 resources_available.arch = linux set node keisan11 resources_available.host = keisan11 set node keisan11 resources_available.mem = 131666992kb set node keisan11 resources_available.ncpus = 24 set node keisan11 resources_available.vnode = keisan11 set node keisan11 resv_enable = True
使わなくなったノードはdeleteで消せます
Qmgr: delete node keisan11
登録された計算ノードはpbsnodesコマンドを使って確認します
$ pbsnodes -a
$ sudo /etc/init.d/pbs restart
試しに「60秒間何もしない」というジョブを投げてみます。 クラスタ計算機を使用するユーザーで管理ノードにログインしてください。 qsubはジョブを投入するコマンドです
$ echo 'sleep 60' | qsub
ジョブの現在の状態はqstatコマンドで確認できます
$ qstat -s kanri: Req'd Req'd Elap Job ID Username Queue Jobname SessID NDS TSK Memory Time S Time --------------- -------- -------- ---------- ------ --- --- ------ ----- - ----- 1.kanri sugimoto workq STDIN 9007 1 1 -- -- R 00:00 Job run at Tue Dec 03 at 04:56 on (keisan11:ncpus=1)
Sの列が状態を表し、Qだと実行待ち、Rだと実行中を意味します。 ジョブが計算ノードkeisan11で実行されていることがわかります。
ジョブを終了または削除したい場合は qdel を使います
$ qdel 1.kanri
実際にPBSを使ってクラスタ計算機にプログラムを投げてみます。 次のプログラムを使用します。
#include <stdio.h> #include "mpi.h" int main( int argc, char *argv[] ) { int rank, size, len; char name[MPI_MAX_PROCESSOR_NAME]; MPI_Init( &argc, &argv ); MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); MPI_Get_processor_name( name, &len ); name[len] = '\0'; printf( "Hello world: rank %d of %d running on %s\n", rank, size, name ); MPI_Finalize(); return 0; }
コンパイルは次のようにします。
$ mpicc -o hello hello.c $ mpiicc -o hello hello.c # Intel MPIを使用する場合
次のスクリプトを作成します。
#!/bin/bash #PBS -V #PBS -l select=2:ncpus=24:mpiprocs=24 cd $PBS_O_WORKDIR mpirun ./hello
実行権限を付与します。
$ chmod +x run.sh
ジョブを実行します
$ qsub run.sh 1.kanri
結果を見てみます
$ cat run.sh.o1 Hello world: rank 0 of 48 running on keisan11 Hello world: rank 1 of 48 running on keisan11 (略) Hello world: rank 23 of 48 running on keisan11 Hello world: rank 24 of 48 running on keisan12 Hello world: rank 25 of 48 running on keisan12 (略) Hello world: rank 47 of 48 running on keisan12
oneAPIをアップデートしたら、ノード間並列をするときにエラーが出るようになってしまいました。 (バージョン:Intel(R) MPI Library 2021.5 for Linux) 次のようにしてください。
#!/bin/bash #PBS -V #PBS -l select=2:ncpus=24:mpiprocs=24 cd $PBS_O_WORKDIR mpirun -bootstrap ssh ./hello
OpenMPのみ、あるいはMPI+OpenMPのハイブリッドで使用する場合は、次のようにOpenMPのスレッド数を指定してください
#!/bin/bash #PBS -V #PBS -l select=2:ncpus=24:mpiprocs=2:ompthreads=12 cd $PBS_O_WORKDIR mpirun ./hello
複数のユーザーが同時に使用する場合に、うまく計算資源を割り当てる機能です。
ジョブを投入したら、デフォルトでは1番目の計算ノードにジョブを埋めていき、その計算ノードのリソースが全て埋まってから次の計算ノードでジョブが走るようになります。 これを、各ノードの負荷を分散させるようにジョブが投入されるように変更します。
設定ファイル /var/spool/pbs/sched_priv/sched_config から node_sort_key を探して次のように変更します。
node_sort_key: "ncpus LOW assigned" ALL
node_sort_key: "ncpus HIGH unused" ALL
(各計算ノードのコア数がすべて同じ場合は、どちらも同じ結果になります)
PBSを再起動します。
sudo /etc/init.d/pbs restart
$ sudo -i qmgr -c "delete node @default"
$ sudo /etc/init.d/pbs stop
$ sudo rm -f /etc/pbs.* $ sudo rm -f /etc/profile.d/pbs.* $ sudo rm -f /etc/rc*.d/*pbs $ sudo rm -f /etc/init.d/pbs $ sudo rm -rf /var/spool/pbs $ sudo rm -rf /opt/pbs/
Altair Engineering社が提供するジョブ管理ソフトです。もともとは有償でしたが、2016年にオープンソース化しました