Gentoo LinuxにOpenPBS v20.0.1を入れる

はじめに

HPC向けのジョブ管理システムであるOpenPBSGentoo 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を実行する際には、firewalldiptablesなどのセキュリティ設定を必ず行なってください。

前準備

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"

sudogit(オプション)

インストールの作業に使うパッケージのsudogitをインストールします。すべてスーパーユーザーで実行する場合、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にジョブ管理システムをインストールする情報が(英語でも)ほとんど無いため。

参考文献

  1. Altair PBS Works | Support and Documentation
  2. ジョブスケジューラPBS ProでGPU計算クラスタを組みAIを効率的に学習させる方法(前編) – Qiita
  3. CentOS7でOpenPBSの設定 – Qiita

脚注

  1. PortageでインストールしたTcl/Tkの場合は、makeでエラーとなります。
  2. ebuildスクリプトを書くことができれば、Portageでインストールすることができるようになるのですが、まだその技量はありません。それが可能ならそもそもOpenPBSをインストールするebuildを作るでしょう(ebuildライティングは最近入門しました。将来的にはOpenPBSをインストールできるOverlayを作りたいですね)。
  3. 参照:個人的Linux: Gentooでfdcloneをmakeする
  4. 環境変数で設定してもこれらの変数は、pbs.confで取得・設定はされないので、/etc/pbs.conf内で設定する必要があります。
  5. server_privの設定はSERVERのロールを担当するノード、つまりマスターノードにのみ記述します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です