LoginSignup
1
0

UbuntuでのOpenPBSの設定

Last updated at Posted at 2024-05-01

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と思しき記載が多い...):

1. Install the prerequisite packages for building PBS.
    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++
2. Install the prerequisite packages for running PBS.
    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_START_MOM=0”の個所を”PBS_START_MOM=1”に変更。例えば、サーバーでの設定は以下のような感じ。

/etc/pbs.conf
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 -xqstat -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"

の計算機にインストール。

トラブルシューティング

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が生成されていなかったため。

正しいcalc.sh
#!/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には以下のような内容が書き込まれていた(ジョブの終了後このファイルは消える)

/var/spool/pbs/aux/${PBS_JOBID}
hoge000
hoge000
hoge000
hoge000

誤っていた原因は、設定の箇所のmpiprocsを指定していなかったため。(つまりインストール等の不備はなくて、単に利用時の実行スクリプトが誤っていたというだけ)CentOS7での実行時は、ncpuの設定だけでどうにかなっていた(OSのバージョンに加えて、PBSのバージョンの違いも理由?)ので、これまでは考えてこなかった。
以下の経緯でそもそもPBS_NODEFILEってどんなものが書き込まれているのか調べるために検索したところ、OpenPBS/PBS_NODEFILE - Chaperoneで、どうもmpiprocsの指定が必要だぞ と書かれていたので、記載したところうまくいった。

これが誤った版のスクリプト

誤ったcalc.sh
#!/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を使って

calc.sh(抜粋)
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'
出力(apt install)
  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に以下のプロンプトで尋ねた。

You
OpenPBSで設定した情報が、ビルドしたOpenMPIに適切に読み込まれていないようです。どのような原因が考えられますか?
ChatGPT
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で表示したところ空であることがわかった。

You
OpenPBSでPBS_NODEFILEが適切に作られていないようです。どのような問題が考えられますか。
ChatGPT
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
という内容が見つかる。
これに則って、

/var/spool/pbs/mom_priv/config
$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
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0