PBS Proによるジョブ管理システムは、次のコンポーネントより構成されます
| コンポーネント名 | 識別子 | 役割 |
|---|---|---|
| Server | pbs_server | ユーザーからジョブの投入や取り消しなどのコマンドを受け付けます |
| Scheduler | pbs_sched | ジョブの実行開始や終了のタイミング、どのノードで実行するか、などを管理します |
| Communication daemon | pbs_comm | ノード間の通信を仲介します |
| Job Executor | pbs_mom | ジョブを実行します。momは Machine Oriented Mini-server の略で、全ての実行中のジョブの母親という意味も込められています |
以下ではNFSサーバによって、管理ノードの
が計算ノードと共有されているとします。 また、ユーザー情報とhostsもLDAPによって共有されているとします。
パスフレーズ無しでSSHログインできるようにします。 PBSを使用する全ユーザーは、管理ノードで以下を実行してください。
$ ssh-keygen -t rsa -N "" $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys $ echo "StrictHostKeyChecking no" >> ~/.ssh/config
ファイアウォールにUFWを使っている場合、プライベートLAN内の通信をすべて許可してやります。 管理ノードで以下のコマンドを実行します。
$ sudo ufw allow from 192.168.0.0/24
管理ノードと計算ノードで行います
$ sudo nano /etc/hosts
# Your system has configured 'manage_etc_hosts' as True. # As a result, if you wish for changes to this file to persist # then you will need to either # a.) make changes to the master file in /etc/cloud/templates/hosts.debian.tmpl # b.) change or remove the value of 'manage_etc_hosts' in # /etc/cloud/cloud.cfg or cloud-config from user-data # 127.0.0.1 localhost # The following lines are desirable for IPv6 capable hosts ::1 localhost ip6-localhost ip6-loopback ff02::1 ip6-allnodes ff02::2 ip6-allrouters
管理ノードと計算ノードのそれぞれで、アップデートと(必要ならば)再起動を行います
$ 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 g++ libcjson-dev
$ sudo apt install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin tcl tk libical3 postgresql-server-dev-all libhwloc-dev libcjson-dev # OpenPBS v23
ここでは /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 nano /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 nano /etc/bash.bashrc
(略) . /etc/profile.d/pbs.sh
$ sudo /opt/pbs/libexec/pbs_postinstall
$ sudo update-rc.d pbs defaults
$ sudo nano /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 node10 Qmgr: create node node11 ...
ノードあたりに使用できる最大スレッド数も指定できます(ここでは24コア)。
Qmgr: set node node10 resources_available.ncpus=24 Qmgr: set node node11 resources_available.ncpus=24 ...
ノードの設定状況も確認できます
Qmgr: print node node10 # # Create nodes and set their properties. # # # Create and define node node10 # create node node10 set node node10 state = free set node node10 resources_available.arch = linux set node node10 resources_available.host = node10 set node node10 resources_available.mem = 131666992kb set node node10 resources_available.ncpus = 24 set node node10 resources_available.vnode = node10 set node node10 resv_enable = True
使わなくなったノードはdeleteで消せます
Qmgr: delete node node10
登録された計算ノードは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 (node10:ncpus=1)
Sの列が状態を表し、Qだと実行待ち、Rだと実行中を意味します。 ジョブが計算ノードnode10で実行されていることがわかります。
ジョブを終了または削除したい場合は 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 node10 Hello world: rank 1 of 48 running on node10 (略) Hello world: rank 23 of 48 running on node10 Hello world: rank 24 of 48 running on node11 Hello world: rank 25 of 48 running on node11 (略) Hello world: rank 47 of 48 running on node11
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年にオープンソース化しました