Ubuntuの自前クラスター計算機のジョブスケジューラーを入れるための覚書。
CentOS7でのOpenPBSの設定 #centos7 - QiitaではCentOSを前提にまとめた。CentOSからALMALinuxやUbuntuにディストリビューションが移ってきているので、Ubuntu版もまとめることにした。
hoge000: PBSサーバー、NFSサーバー(/home, /opt_share)、NISサーバー
hoge001: PBSクライアント、NFSクライアント(/home, /opt_share)、NISクライアント
hoge002: PBSクライアント、NFSクライアント(/home, /opt_share)、NISクライアント
...
OpenPBSのサーバーのインストール
Ubuntu22.04の場合
cat /etc/lsb-relase
で
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"
の計算機にインストール。
ソースダウンロード
https://github.com/openpbs/openpbs/releases
v23.06.06.tar.gzが2024/05/01時点での最新版。ここでは、ダウンロードしたファイルが”v23.06.06.tar.gz”として話を進める。
準備
以下の内容を実行(ソースコードを展開したディレクトリにあるINSTALL
ファイルにあるUbuntu-18.04向けの記載から。なんか知らんけど、v20.0.0と思しき記載が多い...):
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++
sudo apt install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin \
sudo tcl tk libical3 postgresql-server-dev-all
インストール用ディレクトリの作成
sudo mkdir /opt/openpbs-23.06.06
を実行。
ソースの展開
sudo tar -zxvf v23.06.06.tar.gz
cd ./openpbs-23.06.06
configure, make, make install
sudo ./autogen.sh
sudo ./configure --prefix=/opt/openpbs-23.06.06
sudo make
sudo make install
ポストインストールプロセス
sudo /opt/openpbs-23.06.06/libexec/pbs_postinstall
を実行。
サーバー用/etc/pbs.conf
の編集
PBSサーバーが計算機サーバーも兼ねる構成にするために、“PBS_START_MOM=0”の個所を”PBS_START_MOM=1”に変更。例えば、サーバーでの設定は以下のような感じ。
PBS_SERVER=hoge000
PBS_START_SERVER=1
PBS_START_SCHED=1
PBS_START_COMM=1
PBS_START_MOM=1 #PBSサーバーも計算を実行する仕様
PBS_EXEC=/opt/openpbs-23.06.06
PBS_HOME=/var/spool/pbs
PBS_CORE_LIMIT=unlimited
PBS_SCP=/usr/bin/scp
パーミションの変更
sudo chmod 4755 /opt/openpbs-23.06.06/sbin/pbs_iff /opt/openpbs-23.06.06/sbin/pbs_rcp
デーモンの起動
sudo /etc/init.d/pbs start
の実行
出力
Starting PBS
PBS Home directory /var/spool/pbs needs updating.
Running /opt/openpbs-23.06.06/libexec/pbs_habitat to update it.
***
*** Setting default queue and resource limits.
***
Communication failure.
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qmgr: cannot connect to server
Connection refused
qterm: could not connect to server (15010)
cp: cannot stat '/usr/pgsql-14.11/lib/*': No such file or directory
cp: cannot stat '/usr/pgsql-14.11/lib/*': No such file or directory
cp: cannot stat '/usr/pgsql-14.11/share/timezonesets/*': No such file or directory
cp: cannot stat '/usr/pgsql-14.11/share/timezonesets/*': No such file or directory
cp: cannot stat '/usr/lib/postgresql/14/bin/pg_resetxlog': No such file or directory
*** End of /opt/openpbs-23.06.06/libexec/pbs_habitat
Home directory /var/spool/pbs updated.
/opt/openpbs-23.06.06/sbin/pbs_comm ready (pid=255126), Proxy Name:hoge000:17001, Threads:4
PBS comm
PBS mom
PBS sched
Connecting to PBS dataservice...connected to PBS dataservice@hoge000
PBS server
この時点で多分何かうまくいっていない。
OpenPBSクラスターを構築する【Ubuntu22.04編】 #Ubuntu22.04 - Qiitaのトラブルシューティングに従って、いろいろ設定を変えてみたが特にうまくいかない。
その後、試しに再起動したら、普通に起動した。(順番が前後するが、以降のqstat
, pbsnodes -a
, qmgr -c 'p s'
全て期待通りの挙動。)再起動はすべてを解決する。
PATH等の環境設定
source /etc/profile.d/pbs.sh
を実行。ルートだけでなく、一般ユーザーでも実行。(再度ログインして新しいセッションを立ち上げれば勝手に実行されているくさい)
正しく導入されているのかの確認
qmgr -c 'p s'
の出力
#
# Create queues and set their attributes.
#
#
# Create and define queue workq
#
create queue workq
set queue workq queue_type = Execution
set queue workq enabled = True
set queue workq started = True
#
# Set server attributes.
#
set server scheduling = True
set server default_queue = workq
set server log_events = 511
set server mailer = /usr/sbin/sendmail
set server mail_from = adm
set server query_other_jobs = True
set server resources_default.ncpus = 1
set server default_chunk.ncpus = 1
set server scheduler_iteration = 600
set server resv_enable = True
set server node_fail_requeue = 310
set server max_array_size = 10000
set server pbs_license_min = 0
qstat -Bの出力
erver Max Tot Que Run Hld Wat Trn Ext Status
---------------- ----- ----- ----- ----- ----- ----- ----- ----- -----------
hoge000 0 0 0 0 0 0 0 0 Active
pbsnodes -aの出力
hoge000
Mom = hoge000
ntype = PBS
state = free
pcpus = 8
resources_available.arch = linux
resources_available.host = hoge000
resources_available.mem = 32728888kb
resources_available.ncpus = 8
resources_available.vnode = hoge000
resources_assigned.accelerator_memory = 0kb
resources_assigned.hbmem = 0kb
resources_assigned.mem = 0kb
resources_assigned.naccelerators = 0
resources_assigned.ncpus = 0
resources_assigned.vmem = 0kb
resv_enable = True
sharing = default_shared
license = l
last_state_change_time = Wed May 1 17:37:18 2024
終了したジョブの履歴を表示
すでに終了したジョブの履歴をqstat -x
、qstat -H
で確認したいので、job_history_enable = True
, job_history_duration = 720:00:00
(720時間=30日間)を設定する。
pbs.sh
のスクリプトがsudo
時のPATHに反映されていないので、sudo
するときはqmgr
はfull pathで直打ち:
sudo /opt/openpbs-23.06.06/bin/qmgr -c "set server job_history_enable = True"
sudo /opt/openpbs-23.06.06/bin/qmgr -c "set server job_history_duration = 720:00:00"
OpenPBSのクライアントのインストール
Ubuntu22.04の場合
cat /etc/lsb-relase
で
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.4 LTS"
の計算機にインストール。
インストールの手続きはサーバー用と基本的には同じで、唯一の例外は/etc/pbs.conf
の書き方だけ。
サーバー用/etc/pbs.conf
の編集
PBSクライアント“PBS_START_MOM”, "PBS_START_SCHED", "PBS_START_COMM"をいずれも0に。が計算機サーバーなので”PBS_START_MOM=1”に変更。例えば、サーバーでの設定は以下のような感じ。
PBS_SERVER=hoge000
PBS_START_SERVER=0
PBS_START_SCHED=0
PBS_START_COMM=0
PBS_START_MOM=1
PBS_EXEC=/opt/openpbs/default
PBS_HOME=/var/spool/pbs
PBS_CORE_LIMIT=unlimited
PBS_SCP=/usr/bin/scp
残すはサーバーでも行った、パーミションの変更と、デーモンの起動。
一度、ログアウトして再度ログインすれば、PATH等は通っている。
PBSクライアントをPBSサービスに追加
以上の作業だけでは、追加したPBSクライアントhoge001
はPBSサーバーhoge000
上のサービスに認識されていない。これを行うために
sudo /opt/openpbs-23.06.06/bin/qmgr -c "create node hoge001"
を実行(sudoにqmgrのPATHを通していないのでfull pathで直打ち。
ここまでうまく行っていれば、pbsnodes -a
の実行で
hoge000
Mom = hoge000
ntype = PBS
state = free
pcpus = 32
resources_available.arch = linux
resources_available.host = hoge000
resources_available.mem = 263728756kb
resources_available.ncpus = 32
resources_available.vnode = hoge000
resources_assigned.accelerator_memory = 0kb
resources_assigned.hbmem = 0kb
resources_assigned.mem = 0kb
resources_assigned.naccelerators = 0
resources_assigned.ncpus = 0
resources_assigned.vmem = 0kb
resv_enable = True
sharing = default_shared
license = l
last_state_change_time = Wed Oct 2 18:29:58 2024
last_used_time = Fri Sep 20 19:14:35 2024
hoge001
Mom = hoge001
ntype = PBS
state = free
pcpus = 192
resources_available.arch = linux
resources_available.host = hoge001
resources_available.mem = 792287728kb
resources_available.ncpus = 192
resources_available.vnode = hoge001
resources_assigned.accelerator_memory = 0kb
resources_assigned.hbmem = 0kb
resources_assigned.mem = 0kb
resources_assigned.naccelerators = 0
resources_assigned.ncpus = 0
resources_assigned.vmem = 0kb
resv_enable = True
sharing = default_shared
license = l
last_state_change_time = Wed Oct 2 18:29:58 2024
last_used_time = Fri Sep 13 17:57:21 2024
といった、出力が得られる。
トラブルシューティング
Permission denied
OpenPBS経由で走らせた、自家製openmpiでのみ以下のメッセージで止まる。(apt-get
でインストールしたmpirunでは問題ない。また、bashにコマンドを書いて実行した場合も、自家製かapt-get
製かに依らず、問題ない)
Permission denied, please try again.
Permission denied, please try again.
shinohara@hoge000: Permission denied (publickey,password).
--------------------------------------------------------------------------
PRTE has lost communication with a remote daemon.
HNP daemon : [prterun-hoge000-361694@0,0] on node HOGE000
Remote daemon: [prterun-HOGE000-361694@0,1] on node hoge000
This is usually due to either a failure of the TCP network
connection to the node, or possibly an internal failure of
the daemon itself. We cannot recover from this failure, and
therefore will terminate the job.
--------------------------------------------------------------------------
パスフレーズなしのカギを設定して実行したところ、この問題は解決。
slot数が正しく設定されていない
mpirun -oversubscribe -np N
で、Nを2以上にすると以下のエラー出力で止まる。
一つ前のトラブルと同じで、OpenPBS経由で走らせた、自家製openmpiでのみ以下のメッセージで止まる。(apt-get
でインストールしたmpirunでは問題ない。また、bashにコマンドを書いて実行した場合も、自家製かapt-get
製かに依らず、問題ない)
--------------------------------------------------------------------------
There are not enough slots available in the system to satisfy the 4
slots that were requested by the application:
../src/mATTOHF
Either request fewer procs for your application, or make more slots
available for use.
A "slot" is the PRRTE term for an allocatable unit where we can
launch a process. The number of slots available are defined by the
environment in which PRRTE processes are run:
1. Hostfile, via "slots=N" clauses (N defaults to number of
processor cores if not provided)
2. The --host command line parameter, via a ":N" suffix on the
hostname (N defaults to 1 if not provided)
3. Resource manager (e.g., SLURM, PBS/Torque, LSF, etc.)
4. If none of a hostfile, the --host command line parameter, or an
RM is present, PRRTE defaults to the number of processor cores
In all the above cases, if you want PRRTE to default to the number
of hardware threads instead of the number of processor cores, use the
--use-hwthread-cpus option.
Alternatively, you can use the --map-by :OVERSUBSCRIBE option to ignore the
number of available slots when deciding the number of processes to
launch.
--------------------------------------------------------------------------
原因はPBSのジョブサブミットスクリプトの文法が誤っており、適切にPBS_NODEFILE
が生成されていなかったため。
#!/bin/bash
#PBS -l select=host=hoge000:ncpus=4:mpiprocs=4
cd $PBS_O_WORKDIR
cat $PBS_NODEFILE
module purge
module load openmpi/5.0.3/gcc-11.4.0
module list &> ${LOG}
EXE=../src/mATTOHF
IN='"./input.dat"'
mpirun -np 4 ${EXE} <<< ${IN} >> ${LOG}
このcat $PBS_NODEFILE
には以下のような内容が書き込まれていた(ジョブの終了後このファイルは消える)
hoge000
hoge000
hoge000
hoge000
誤っていた原因は、設定の箇所のmpiprocs
を指定していなかったため。(つまりインストール等の不備はなくて、単に利用時の実行スクリプトが誤っていたというだけ)CentOS7での実行時は、ncpu
の設定だけでどうにかなっていた(OSのバージョンに加えて、PBSのバージョンの違いも理由?)ので、これまでは考えてこなかった。
以下の経緯でそもそもPBS_NODEFILE
ってどんなものが書き込まれているのか調べるために検索したところ、OpenPBS/PBS_NODEFILE - Chaperoneで、どうもmpiprocs
の指定が必要だぞ と書かれていたので、記載したところうまくいった。
これが誤った版のスクリプト
#!/bin/bash
#PBS -l select=host=hoge000:ncpus=4
cd $PBS_O_WORKDIR
cat $PBS_NODEFILE
module purge
module load openmpi/5.0.3/gcc-11.4.0
module list &> ${LOG}
EXE=../src/mATTOHF
IN='"./input.dat"'
mpirun -np 4 ${EXE} <<< ${IN} >> ${LOG}
その場しのぎの解決法
結果的に動いたのは、-oversubscribe
を使って
mpirun -oversubscribe -np 4 ./a.out
としたもの。この方法だと、乗っているコア数がいくらだろうが、なんでも指定できてしまう(10年以上前のmpiのライブラリはどれもそうだった気がするが)のでちょっと気持ち悪いが、ひとまずこれで運用する。
ダメだった取り組み
hostfileを作って--hostfile
オプションで読み込んでみたけれど色々文句を言われて、うまく動かなかった。
OpenPBSとOpenMPIの連携が適当だからなのかもしれない(以前古いバージョンをCentOSに入れたときは問題なかったが)と思い、./configure
に--with-tm=/opt/openpbs-23.06.06
のオプションをつけてみたが、問題は特に解決しなかった。
bashでは動いてOpenPBS経由だと動かないので、何かの設定が読み込まれていないのだと思うのだけれど、OpenMPIの環境変数を調べたり、bashとOpenPBSでenv
の出力を書き出して比較したりしたけれど、原因はよくわからない(総当たりで調べるのは大変なので諦めた ということ)
ChatGPT 3.5に聞いたみたけれど、一般的には妥当そうな回答をしてくれるが、私の環境を考慮してくれているわけではないので、原因を探すヒントにはほとんどならなかった
PBSのスクリプトにenv > ./env.log
を記載して環境変数を書き出すと、LIBRARY_PATH
, LD_RUN_PATH
, LD_LIBRARY_PATH
が書き込まれていない。module load
で設定しているはずだけれど、prepend
で追加しているので、そもそもない環境変数には足されないのかもしれない。PBSでそもそもどの環境変数を導入するかは/var/spool/pbs/environment
に記載があるよう。
しかし、これらのPATHを入れても、エラーメッセージは変わらなかった。
解決策に至る紆余曲折
apt install
で入れたOpenMPIは期待通りの挙動で動いている。なので、この版のビルド状態を模擬すればうまくいく可能性が高い気がする。これはompi_info | grep "Configure command line"
で実行できて、私の環境だと
Configure command line: '--prefix=/opt/openmpi/5.0.3/gcc-11.4.0' '--with-tm=/opt/openpbs-23.06.06'
Configure command line: '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--disable-option-checking' '--disable-silent-rules' '--libdir=${prefix}/lib/x86_64-linux-gnu' '--runstatedir=/run' '--disable-maintainer-mode' '--disable-dependency-tracking' '--disable-silent-rules' '--disable-wrapper-runpath' '--with-package-string=Debian OpenMPI' '--with-verbs' '--with-libfabric' '--with-psm' '--with-psm2' '--with-ucx' '--with-pmix=/usr/lib/x86_64-linux-gnu/pmix2' '--with-jdk-dir=/usr/lib/jvm/default-java' '--enable-mpi-java' '--enable-opal-btl-usnic-unit-tests' '--with-libevent=external' '--with-hwloc=external' '--disable-silent-rules' '--enable-mpi-cxx' '--enable-ipv6' '--with-devel-headers' '--with-slurm' '--with-sge' '--without-tm' '--sysconfdir=/etc/openmpi' '--libdir=${prefix}/lib/x86_64-linux-gnu/openmpi/lib' '--includedir=${prefix}/lib/x86_64-linux-gnu/openmpi/include'
くらい差がある。
参考URL: OpenPBSクラスターを構築する【Ubuntu22.04編】 #Ubuntu22.04 - Qiita
この両者を眺めていると、'--with-pmix=/usr/lib/x86_64-linux-gnu/pmix2'
のあたりが怪しそう。(まだ試していない)
Process Management Interface (PMI) とは · Keichi Takahashi
一方で、OpenMPIビルド時にサードパーティのPMIxはインストールされている(pmix_info
でバージョンが確認できる)ので、PMIxが入っていないわけではなさそう。
その後色々確認したところ、そもそもPBS側で指定されていた情報(この時点ではNCPUの指定だけで十分だと思っていた)がapt版OpenMPIでも自家製版OpenMPIでもこちらが指定された数字は伝わっていなことがわかった。
具体的にはmpirun echo $HOSTNAME
を実行すると、設定されたプロセス数だけHostnameを出力するのだけれど、apt版OpenMPIはどんなNCPUでも4回、自家製OpenMPIではどんなNCPUでも一回しか出力しなかったため。
公式情報によると、基本的にPBSから呼び出した場合は、hostfileの情報はPBSが監督するので設定する必要がない というような記述が見当たるので、何か連携に不備がるのではないか と考えだした。
この辺からPBSの情報がMPIに渡すところに不備があるのかな と思って、ChatGPT3.5に以下のプロンプトで尋ねた。
OpenPBSで設定した情報が、ビルドしたOpenMPIに適切に読み込まれていないようです。どのような原因が考えられますか?
OpenPBSとOpenMPIを組み合わせて使用する際に、設定情報が適切に読み込まれない可能性があるいくつかの原因が考えられます。以下はその例です:
環境変数の設定不足: OpenPBSで設定した情報が、環境変数として適切に設定されていない場合があります。たとえば、PBS_NODEFILEやPBS_NUM_NODESなどの環境変数がOpenMPIに正しく渡されているか確認してください。
OpenMPIの設定: OpenMPIがPBSProと連携するための設定が不足している可能性があります。OpenMPIの設定ファイル(通常は$HOME/.openmpi/mca-params.confなど)を確認し、PBSProとの連携に必要な設定が行われているか確認してください。
ノード間通信の問題: ノード間通信に関連する設定が適切に行われていない場合、MPIプロセス間の通信に問題が発生する可能性があります。ネットワークの設定やファイアウォールなどを確認し、通信がブロックされていないかどうかを確認してください。
OpenPBSのバージョン: 使用しているOpenPBSのバージョンによっては、OpenMPIとの連携に問題がある場合があります。最新バージョンのOpenPBSやOpenMPIを使用してみてください。
これらの原因を確認して、問題を特定し解決することができるでしょう。
このあたりで、$PBS_NODEFILE
の中身をジョブ中にcat
で表示したところ空であることがわかった。
OpenPBSでPBS_NODEFILEが適切に作られていないようです。どのような問題が考えられますか。
PBS_NODEFILEが適切に作成されない場合、以下のような問題が考えられます。
PBSProの設定不備: PBSProがノードファイルを適切に生成するための設定が不足している可能性があります。PBSProの設定ファイル(通常は/etc/pbs.confや/etc/pbs.conf.d/内のファイル)を確認し、ノードファイルの生成に関連する設定が正しく行われているか確認してください。
ノードリソースの登録: PBSProがノードリソースを適切に認識していない場合、ノードファイルが正しく生成されないことがあります。PBSProの管理下にあるノードが正しく登録されているか、pbsnodes -aコマンドなどで確認してください。
PBSノードマネージャの状態: PBSノードマネージャが正常に動作していない場合、ノードファイルが生成されないことがあります。PBSノードマネージャのログを確認し、エラーや警告メッセージがあるかどうかを確認してください。
ネットワーク通信の問題: ノードファイルの生成には、PBSProサーバーと各ノードの間での通信が必要です。ネットワークの問題やファイアウォール設定などが原因で通信が阻害されている可能性があります。ネットワーク設定を確認し、通信が遮断されていないかどうかを確認してください。
これらの要因をチェックして、PBS_NODEFILEが正しく生成されるように問題を特定して修正していくことが重要です。
それで、どうもPBS_NODEFILE
の生成あたりが怪しいのでは となって問題解決に至る。
qsub: Bad UID for job execution
その1
インストール後、一度は動いていたのにNISやらNFS、付随して/etc/hosts
の設定を変えて、PBSのクライアントを足したのちに、echo "sleep 60; hostname; echo done" | qsub -l select=host=hoge000
を実行したら、qsub: Bad UID for job execution
なるエラーメッセージをいただいた。
sudo service network-manager restart
sudo /etc/init.d/pbs restart
でネットワークとPBSを再起動したところ、再びジョブを投入できるようになった。
クライアント側のstatusがEでジョブが正常終了しない
Jobs not getting Run. Goes to E state and stops - Users/Site Administrators - OpenPBS
を見ると、$usecp
を使えとあるので、調べると
IoTeX: PBS pro (openpbs) のインストールと設定
ジョブスケジューラPBSProでGPU計算クラスタを組みAIを効率的に学習させる方法 (前編) #Docker - Qiita
という内容が見つかる。
これに則って、
$clienthost hoge000
$restrict_user_maxsysid 999
$usecp *:/home/ /home/
として、sudo /etc/init.d/pbs restart
をサーバーとクライアントで両方行ったところ解決した。
qsub: Bad UID for job execution
その2
PBSクライアントでecho "sleep 60; hostname; echo done" | qsub -l select=host=hoge000
を実行するとqsub: Bad UID for job execution
をいただく。
計算機自体の再起動を行うも、問題は解決せず。(pbsnodes -a
では正しく計算機の状況が表示されている)
解決策は多分、以下
Qmgr: set server flatuid = True
OpenPBS公式情報
Reference Guide
PBS Professional 2021.1 Reference Guide - Documentation
2.33.2.2 Maintenance Reservations
PBS sets the reservation's resv_nodes attribute value so that all CPUs on the reserved hosts are assigned to themaintenance reservation. The select specification is always the following:
-lselect=host=<host1>:ncpus=<number of CPUs at host1>+host=<host2>:ncpus=<number of CPUs at
host2>+...
2.59.7 Environment Variables
PBS_NODEFILE
: Name of file containing the list of vnodes assigned to the job. Created when qsub
is run
5.5 Resource Table Format
mpiprocs
: Number of MPI processes for this chunk. Cannot use sum fromchunks as job-wide limit. The number of lines in PBS_NODEFILE
is the sum of the values of mpiprocs
for all chunks requested by the job. For each chunk with mpiprocs=P
, the host name for that chunk is written to the PBS_NODEFILE
P times.
ncpus
: Number of processors.
User's Guide
PBS Professional 2022.1 User's Guide - Documentation
4.8.3.2 ノ ー ド 指定の変換
-lselect=N:ncpus=P:mpiprocs=P
-lselect=4:ncpus=2:mpiprocs=2 # 4ノード、2 MPI processes per node