Gentoo LinuxにOpenPBS v20.0.1を入れる
はじめに
HPC向けのジョブ管理システムであるOpenPBSをGentoo Linuxにインストールしする方法を解説します。クラスターネットワークの設定やジョブを投げて並列計算を実行する方法については別記事を書く予定です。
- OpenPBSって何?
- 数少ないオープンソースのHPC向けジョブ管理システム。元はプロプライエタリ製品のオープンソースバージョンである。
- なぜGentoo Linuxに入れるの?
- ほとんど全てを選択してカスタマイズできるので、最小化インストールが可能でクラスター構築に向いているはず。また全て自分でコンパイルするので最適化で性能が引き出せる(かも)。
ジョブ管理システム
スーパーコンピューターは使ったことがありますか?使ったことのある方は、プログラムを並列計算用にコンパイルして、スパコンに実行を任せるためのスクリプトを書いたことがあるでしょう。
HPC分野におけるクラスター計算機では、MPI(Massage Passing Interface)を使って並列計算を実行するのがメジャーです。例えばFortranのコードはmpif90
でコンパイルし、mpiexec
で実行できます。この時にコマンド引数を使って、計算に使用するノードやプロセス数を設定できます。このように(並列計算用のコードを書くことに目をつむれば)並列計算を実行すること自体は、それほど難しくありません。
しかしながら、複数のユーザーが使う計算機でこのように実行していると問題が出てきます。並列計算の実行が複数同時に行われることで、一つの実行についてノード間通信の待ち時間(同期処理)が長くなり、計算自体が遅くなってしまうということが起こるのです。
このような問題を解決するために、多くの共用クラスター計算機では、「ジョブ管理システム」がインストールされています。ジョブ管理システムは、複数のジョブ(一つの実行の単位)をキューに保管し、これらの一つ一つを定められた順序にしたがって、クラスター計算機に実行を命令します。
ユーザーはジョブ管理システムに実行の設定を書いたスクリプトをサブミットする(「ジョブを投げる」という)ことで、クラスター計算機での並列計算を半ば独占的に実行できます。もちろん待ち時間はかかりますが。
OpenPBS
HPC向けのジョブ管理システムにはたくさんの製品がありますが、OSSとなっているものは少ないです。今回選択したOpenPBSは、元々NASAのために開発されたPBS(Portable Batch System)がルーツとなっており、PBSには以下の種類が存在しています。
- OpenPBS – 1998年にリリースされたオリジナルのオープンソースバージョン。
- TORQUE – 上のOpenPBSをフォークして作られたもの。かつてはOSSだったが、2018年以降はプロプライエタリライセンスになった。
- 現在、Portageでインストールできるのはv4.1.7で、これはすでにメンテナンスされていない。
- PBS Professional – Altair Engineeringが開発しているバージョンでデュアルライセンスが採用されている。通称 PBS Pro。
ここで扱うOpenPBSとは、PBS Proのオープンソースライセンスバージョン(AGPLv3)です。1998年に公開されたOpenPBSとどのような関係にあるかはわかりませんでした。
現在のOpenPBSのバイナリパッケージはopenpbs.orgで入手することが可能で、またソースコードはGitHubで公開されています。
インストール
Gentoo Linuxの流儀に従って、全てのソフトウェアをソースコードからコンパイルしてインストールします。Gentoo以外のOSへのインストールはGitHubのopenpbs/INSTALLに記述されています。
注意:本稿では、Vagrantを使って仮想環境で、単一ノードでテストしています。ですのでセキュリティに関する設定は扱っていません。実際にクラスターマシンを構成してOpenPBSを実行する際には、firewalld
やiptables
などのセキュリティ設定を必ず行なってください。
前準備
USEフラグの設定
USEフラグの設定に関してはHPC on Gentoo – Gentoo Wikiを参考にしました。vim-syntax,networkmanager
あたりはお好みでどうぞ。
# cat /etc/portage/make.conf
...
USE="${USE} 3dnow fortran gnuplot gpm mmx ncurses nptl nptlonry openmp ompt
pam perl ssl tcpd unicode vim-syntax xml zlib python networkmanager"
sudo
とgit
(オプション)
インストールの作業に使うパッケージのsudo
とgit
をインストールします。すべてスーパーユーザーで実行する場合、Tarballをダウンロードしてインストールする場合には必要ありません。
# emerge --ask --verbose app-admin/sudo dev-vcs/git
依存パッケージのインストール
emergeでインストールするパッケージ
OpenPBSをビルドのに必要となるパッケージを、次のシェルスクリプトを実行してインストールします。コメントアウトされた3-5行目のemerge
コマンドでは、Gentooのインストール過程でインストール済みになっていることが多いものをまとめています。もしインストールされていないパッケージがあれば、インストールしてください。
#!/bin/bash
### ビルド時依存パッケージ
# emerge --ask --verbose sys-devel/gcc sys-devel/make sys-devel/libtool \
# sys-apps/hwloc sys-libs/ncurses dev-lang/perl dev-lang/python \
# dev-libs/openssl sys-devel/autoconf sys-devel/automake
emerge --ask --verbose dev-libs/libedit dev-db/postgresql dev-lang/swig \
x11-libs/libX11 x11-libs/libXt x11-libs/libXext x11-libs/libXft \
media-libs/fontconfig
### 実行時依存パッケージ
emerge --ask --verbose dev-libs/libical x11-libs/libXrender mail-mta/sendmail
以下を実行してパッケージをインストールします。
# ./openpbs_deps_install.sh
Tcl/Tkをマニュアルでビルド
Tclはスプリクト言語の一つで、TkはそのGUIツールキットです。二つともPortageでインストールできます。
しかしながら、Portageでインストールした場合は/usr/lib
に静的ライブラリファイルが生成されません。OpenPBSをビルドする際にはどうやら静的ライブラリに依存しているようです1。
このためこの2つはTarballからマニュアルでビルドしてインストールします。2
インストール先は/usrですが、作業ディレクトリとして/usr/local
を使います。インストールする順序は、はじめにTcl、次にTkです。ソースコードはTcl Developer Siteでダウンロードできます。
### TCL
# cd /usr/local
# wget https://prdownloads.sourceforge.net/tcl/tcl8.6.11-src.tar.gz
# tar xzf ./tcl8.6.11-src.tar.gz
# cd ./tcl8.6.11/unix
# ./configure --prefix=/usr --enable-static --disable-shared
# make
# make install
### TK
# cd /usr/local
# wget https://prdownloads.sourceforge.net/tcl/tk8.6.11.1-src.tar.gz
# tar xzf ./tcl8.6.11-src.tar.gz
# cd ./tk8.6.11/unix
# ./configure --prefix=/usr --enable-static --disable-shared
# make
# make install
ビルドとインストール
OpenPBSのインストール先は/opt/pbs
とします。
# cd /opt
### git cloneする場合
# git clone https://github.com/openpbs/openpbs/ /opt/openpbs-20.0.1
# cd openpbs-20.0.1
# git checkout v20.0.1
### tarballを展開する場合
# wget https://github.com/openpbs/openpbs/archive/refs/tags/v20.0.1.tar.gz
# tar xvzf v20.0.1.tar.gz
# mv v20.0.1 openpbs-20.0.1
# cd /opt/openpbs-20.0.1
# ./autoge.sh
libtinfo.so
とリンクさせるためにLDFLAGS=“-ltinfo”
を設定し、./configure
を以下のオプションで実行します。3
# export LDFLAGS=“-ltinfo”
# ./configure —-prefix=/opt/pbs —-libexecdir=/opt/pbs/libexec
次にmake
&make install
を実行します。make
時にエラーとなる場合があるので、以下のようにLDFLAGS
を設定しておきます。
# export LDFLAGS=“${LDFLAGS} -L/usr/lib64 -lfontconfig -lXft”
# make
# make install
# /opt/pbs/bin/pbs_hostn --version
pbs_version = 20.0.1
なお、作業ディレクトリ(git clone
したディレクトリ)を他に設定すれば、make install
より前は通常ユーザーで実行可能です。
インストール後の設定
Post-install scriptの実行
以下のコマンドを各ノードで実行します。
# /opt/pbs/libexec/pbs_postinstall
/etc/pbs.conf
が生成されます。PBS_HOME
が/var/spool/pbs
に設定され、設定ファイル群・ログディレクトリなどが生成されます。
次に、一部の実行ファイルのパーミッションを以下のように設定します。
# chmod 4755 /opt/pbs/sbin/pbs_iff /opt/pbs/sbin/pbs_rcp
/etc/pbs.conf
の設定
/etc/pbs.conf
は自ホストの動作と役割を設定するファイルです。ホストの役割については、PBS Proのドキュメント「PBS Professional Installation & Update Guide」を参照してください。
PBS_SERVER
はマスターノードのホスト名を記述します。PBS_START_*
はホストの役割を記述します4。
マスターノードではサーバー、スケジューラー、コミュニケーションの役割が必要なので、PBS_START_SERVER=1, PBS_START_SCHED=1, PBS_START_COMM=1
に設定します。今回のテストではマスターノードで計算するので、PBS_START_MOM=1
と設定します(別の計算ノードを用意する場合は前3者を0
にして、PBS_START_MOM=1
を設定すれば基本的にはOKです)。
# cat /etc/pbs.conf
PBS_SERVER=master
PBS_START_SERVER=1
PBS_START_SCHED=1
PBS_START_COMM=1
PBS_START_MOM=1
PBS_EXEC=/opt/pbs
PBS_HOME=/var/spool/pbs
PBS_CORE_LIMIT=unlimited
PBS_SCP=/usr/bin/scp
server_priv/
とmom_priv/
の設定
server_priv/nodes
に追加するノードのホスト名を記述します。さらにノードを追加するには、同様に名前解決できるホスト名を追加します。5
# cat /var/spool/pbs/server_priv/nodes
master np=1 allnodes
mom_priv/config
には、以下のように設定しました。$clienthostにはマスターノードのホスト名を記述します。
# cat /var/spool/pbs/mom_priv/config
$clienthost master
$restrict_user_maxsysid 999
起動
データベースサーバーの起動
postgresql-13の設定のロードとサービスの起動を行います。
# emerge —-config dev-db/postgresql:13
# /etc/init.d/postgresql-13 start
# rc-update add postgresql-13 default
# rc-service postgresql-13 status
* Checking PostgreSQL 13 status ...
pg_ctl: server is running (PID: XXXX)
/usr/lib64/postgresql-13/bin/postgres "-D" "/etc/postgresql-13" (省略)
pbs_habitatの実行とサービスの起動
初期設定を行うpbs_habitatを実行し、PBSのサービスを起動します。
# /opt/pbs/libexec/pbs_habitat
***
*** Setting default queue and resource limits.
***
*** End of /opt/pbs/libexec/pbs_habitat
# rc-service pbs start
Starting PBS
/opt/pbs/sbin/pbs_comm ready (pid=XXXX), Proxy Name:master:17001, Threads:4
PBS comm
PBS sched
Connecting to PBS dataservice...connected to PBS dataservice@master
PBS server
ノードの登録
### 計算ノードの登録
# /opt/pbs/bin/qmgr -c “create node master”
### サービスの再起動
# rc-service pbs restart
起動状態の確認
pbsnodes
コマンドで現在のノードの状態を確認することができます。state = free
となっていれば、起動は成功です。これでノードはジョブを受け取り計算を実行する準備ができている状態です。
% pbsnodes -a
master
Mom = master
ntype = PBS
state = free
pcpus = 1
resources_available.arch = linux
resources_available.host = master
resources_available.mem = 2033580kb
resources_available.ncpus = 1
resources_available.vnode = master
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 = Sat Sep 25 10:05:51 2021
まとめ
本稿では、ジョブスケジューラーであるOpenPBSをGentoo Linuxにインストールする手順について述べました。基本的にはPortageで依存パッケージをインストールして、一部をマニュアルビルドしてライブラリファイルを用意し、ライブラリの参照を指定してビルドすればインストールすることができます。
設定ファイルを適切に記述し、データベースサーバーを実行していれば、PBSサービスを起動することができます。
あとがき
試行錯誤の段階では、いくつも嵌ったポイントがありましたが、無事ゴールに辿り着くことができました。ビルド時依存と実行時依存の分類は怪しい部分がありますので、必要に応じてパッケージをインストールしてください。
JuliaやFortranプログラムを使うため、 MPIを導入した複数ノードによる計算環境の構築については、別の記事で扱う予定です。
- テスト環境は?
- CPUは2コア、4スレッド(Intel)
- openSUSE Tumbleweed上のVirtualboxで、Vagrantを使ってGentoo Linuxの仮想マシンを用意した。
- なぜこの記事を書いたの?
- Gentoo WikiのHigh Performance Computing on Gentooのページが古すぎるのと、Gentooにジョブ管理システムをインストールする情報が(英語でも)ほとんど無いため。
参考文献
- Altair PBS Works | Support and Documentation
- ジョブスケジューラPBS ProでGPU計算クラスタを組みAIを効率的に学習させる方法(前編) – Qiita
- CentOS7でOpenPBSの設定 – Qiita
脚注
- PortageでインストールしたTcl/Tkの場合は、
make
でエラーとなります。 - ebuildスクリプトを書くことができれば、Portageでインストールすることができるようになるのですが、まだその技量はありません。それが可能ならそもそもOpenPBSをインストールするebuildを作るでしょう(ebuildライティングは最近入門しました。将来的にはOpenPBSをインストールできるOverlayを作りたいですね)。
- 参照:個人的Linux: Gentooでfdcloneをmakeする
- 環境変数で設定してもこれらの変数は、
pbs.conf
で取得・設定はされないので、/etc/pbs.conf
内で設定する必要があります。 server_priv
の設定はSERVER
のロールを担当するノード、つまりマスターノードにのみ記述します。