User Tools

Site Tools


自作クラスタ計算機:pbs_proの基本設定

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
自作クラスタ計算機:pbs_proの基本設定 [2026/05/15 16:22] – [hostsファイルの編集] koudai自作クラスタ計算機:pbs_proの基本設定 [2026/06/05 23:48] (current) – removed koudai
Line 1: Line 1:
-====== 概要 ====== 
  
-  * 一人でクラスタ計算機を使用する場合は問題ありませんが、もし複数人で使用する場合は、プログラムの実行が同じノードでかち合ってしまう可能性があります。 
-  * これを避けるため、各ユーザーのプログラムの実行を管理するジョブ管理ソフト PBS Professional (PBS Pro) を使用します 
-  * もちろん、一人でクラスタ計算機を利用する場合でも、複数のジョブの実行を管理してくれるので非常に便利です 
- 
-  * PBS ProはGitHubにて公開されています 
-    * https://github.com/PBSPro/pbspro 
-  * 2020年より無償版はOpenPBSに名称変更になりました。 
- 
-====== 環境 ====== 
- 
-  * Ubuntu 26.04 LTS 
-  * 管理ノードと計算ノードで、OSはバージョンも含めて同一のものを使用してください 
- 
- 
-====== 構成 ====== 
- 
-PBS Proによるジョブ管理システムは、次のコンポーネントより構成されます 
- 
-^コンポーネント名^識別子^役割^ 
-|Server|pbs_server|ユーザーからジョブの投入や取り消しなどのコマンドを受け付けます| 
-|Scheduler|pbs_sched|ジョブの実行開始や終了のタイミング、どのノードで実行するか、などを管理します| 
-|Communication daemon|pbs_comm|ノード間の通信を仲介します| 
-|Job Executor|pbs_mom|ジョブを実行します。momは Machine Oriented Mini-server の略で、全ての実行中のジョブの母親という意味も込められています| 
- 
-  * 上の3つはまとめてフロントエンド (front end) と呼ばれ、同じノード(今回のクラスタ計算機では管理ノード)にまとめるのが普通です。 
-  * ジョブ・エグゼキュータは計算ノードで動かします。 
-  * ジョブのコマンドは計算ノードのある1つに送られて、そこで実行されます。この計算ノードをMother superiorノードと呼びます。 
-    * 他の計算ノードはSisterノードと呼ばれます。Mother superiorノードは(自分を含めた)計算ノードにMPI並列計算のプロセスを割り振ります。 
- 
- 
- 
- 
-====== PBSの設置 ====== 
- 
-以下ではNFSサーバによって、管理ノードの 
-  * /home 
-  * /opt 
-が計算ノードと共有されているとします。 
-また、ユーザー情報とhostsもLDAPによって共有されているとします。 
-===== 準備 ===== 
- 
-==== SSHの設定 ==== 
- 
-パスフレーズ無しでSSHログインできるようにします。 
-PBSを使用する全ユーザーは、管理ノードで以下を実行してください。 
- 
-<code> 
-$ ssh-keygen -t rsa -N "" 
-$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys 
-$ chmod 600 ~/.ssh/authorized_keys 
-$ echo "StrictHostKeyChecking no" >> ~/.ssh/config 
-</code> 
-==== UFWの設定 ==== 
- 
-ファイアウォールにUFWを使っている場合、プライベートLAN内の通信をすべて許可してやります。 
-管理ノードで以下のコマンドを実行します。 
- 
-<code> 
-$ sudo ufw allow from 192.168.0.0/24 
-</code> 
- 
-==== hostsファイルの編集 ==== 
- 
-管理ノードと計算ノードで行います 
- 
-    * Ubuntuでは自己参照アドレス(localhost)に127.0.1.1が割り当てられていますが、このままだと動かなくなるので削除します。<code>$ sudo nano /etc/hosts</code><file - 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 
-</file> 
-    * 再起動すると /etc/hosts がもとに戻ってしまいます。/etc/cloud/cloud.cfg を開いて 
-      * cloud_init_modulesのupdate_etc_hostsをコメントアウト 
-      * manage_etc_hosts: true があれば、falseに変更  
- 
- 
-==== 必要なパッケージのインストール ==== 
- 
-管理ノードと計算ノードのそれぞれで、アップデートと(必要ならば)再起動を行います<code> 
-$ sudo apt update 
-$ sudo apt upgrade 
-$ sudo reboot 
-</code> 
- 
-PBS Proには次のパッケージが必要です。 
- 
-  * PBS Proのコンパイルに必要なもの(管理ノードにインストール)<code> 
-$ 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 
-</code> 
-  * PBS Proの実行に必要なもの(管理ノードと計算ノードの両方にインストール)<code> 
-$ sudo apt install expat libedit2 postgresql python3 postgresql-contrib sendmail-bin tcl tk libical3 postgresql-server-dev-all libhwloc-dev libcjson-dev   # OpenPBS v23 
-</code> 
-    * 必要なパッケージはOSのバージョンによるので、必ず https://github.com/PBSPro/pbspro/blob/master/INSTALL をチェックしてください。 
- 
-===== 管理ノードでの作業 ===== 
- 
-ここでは /opt/pbs/ にPBS Proを設置することにします。 
- 
-  - GitHubの[[https://github.com/openpbs/openpbs/|PBS Proの配布ページ]]から最新版のソースコードをダウンロードします<code> 
-$ sudo apt install git 
-$ git clone https://github.com/openpbs/openpbs.git 
-$ cd openpbs 
-</code> 
-  - プログラムをコンパイルします<code> 
-$ ./autogen.sh 
-$ ./configure -prefix=/opt/pbs 
-$ make 
-</code> 
-    * 現在のバージョン(pbs20.0.0)ではPythonのバージョンが3.5であることを要求してくるので、configureで文句を言われたときはpyenvなどを使って変更してください。 
-    * https://qiita.com/pdv/items/1107bcdca7fa43de673d 
-  - PBSのインストールを完了させます<code> 
-$ sudo make install 
-$ sudo /opt/pbs/libexec/pbs_postinstall 
-</code> 
-    * (Ubuntu20.04 & pbs20.0.0) pbs_postinstallの際に"update-rc.d: error: no runlevel symlinks to modify, aborting!"と出てきたら自動起動の設定に失敗しています。手動で次のようにしてください<code> 
-$ sudo update-rc.d pbs defaults 
-</code> 
-  - 設定ファイルで PBS_START_SERVER, PBS_START_SCHED, PBS_START_COMM をすべて1にして、このノードがフロントエンドであることを設定します。<code> 
-$ sudo vi /etc/pbs.conf 
-</code><file - 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 
-</file> 
-  - 必要な実行権限を付与します<code> 
-$ sudo chmod 4755 /opt/pbs/sbin/pbs_iff /opt/pbs/sbin/pbs_rcp 
-</code> 
-  - PBSを起動します<code> 
-$ sudo /etc/init.d/pbs start 
-</code> 
-  - 環境変数を読み込む設定をします。すべてのユーザーがPBSを使えるように /etc/bash.bashrcを編集します<code> 
-$ sudo vim /etc/bash.bashrc  
-</code><file - bash.bashrc> 
-(略) 
-. /etc/profile.d/pbs.sh 
-</file> 
-  - いったんログアウトして、再ログインします 
- 
-===== 計算ノードでの作業 ===== 
- 
-  - 計算ノードでPBSのインストールを完了させます<code> 
-$ sudo /opt/pbs/libexec/pbs_postinstall 
-</code> 
-    * (Ubuntu20.04 & pbs20.0.0) pbs_postinstallの際に"update-rc.d: error: no runlevel symlinks to modify, aborting!"と出てきたら自動起動の設定に失敗しています。手動で次のようにしてください<code> 
-$ sudo update-rc.d pbs defaults 
-</code> 
-  - 設定ファイルで PBS_START_MOM=1 とすることで、このノードが計算ノードであることを指定します。またPBSサーバのホスト名を PBS_SERVER で設定します。<code> 
-$ sudo vi /etc/pbs.conf 
-</code><file - 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 
-</file> 
-  - 計算ノードでもPBSを起動します<code> 
-$ sudo /etc/init.d/pbs start 
-</code> 
- 
-計算ノードでの作業はこれで終わりですので、ログアウトして構いません。 
- 
- 
-====== 動作確認 ====== 
- 
-すべて管理ノードで作業します 
- 
-===== Qmgr ===== 
- 
-QmgrはPBSの設定を管理するソフトで、操作には管理者権限が必要です。 
-このページでは必ず設定が必要なものだけを紹介します。 
- 
-Qmgrは次のようにして起動します。 
-<code> 
-$ sudo -i qmgr 
-</code> 
-現在どのような設定がされているかは次のようにして確認します 
-<code> 
-Qmgr: print server 
-</code> 
-  * ちなみに全部入力しなくても、頭文字だけで "p s" とするだけでも表示されます 
-Qmgrを終了するにはqあるいはexitと入力します 
-<code> 
-Qmgr: q 
-</code> 
- 
-また、Qmgr用のプロンプトを起動せずに操作することもできます 
-<code> 
-$ sudo -i qmgr -c "print server" 
-</code> 
- 
-==== ユーザーの登録 ==== 
- 
-計算ノードからでもPBSが使えるようにします 
-<code> 
-Qmgr: set server flatuid = True 
-</code> 
-qstatコマンドで他のユーザーのジョブの実行状況が見えるようにします 
-<code> 
-Qmgr: set server query_other_jobs = True 
-</code> 
-==== 計算ノードの登録 ==== 
- 
-計算ノードのホスト名を入力します 
- 
-<code> 
-Qmgr: create node keisan11 
-Qmgr: create node keisan12 
-... 
-</code> 
- 
-ノードあたりに使用できる最大スレッド数も指定できます(ここでは24コア)。 
-<code> 
-Qmgr: set node keisan11 resources_available.ncpus=24 
-Qmgr: set node keisan12 resources_available.ncpus=24 
-... 
-</code> 
- 
-ノードの設定状況も確認できます 
-<code> 
-Qmgr: print node keisan11 
-# 
-# Create nodes and set their properties. 
-# 
-# 
-# Create and define node yagami11 
-# 
-create node yagami11 
-set node keisan11 state = free 
-set node keisan11 resources_available.arch = linux 
-set node keisan11 resources_available.host = keisan11 
-set node keisan11 resources_available.mem = 131666992kb 
-set node keisan11 resources_available.ncpus = 24 
-set node keisan11 resources_available.vnode = keisan11 
-set node keisan11 resv_enable = True 
-</code> 
- 
-使わなくなったノードはdeleteで消せます 
-<code> 
-Qmgr: delete node keisan11 
-</code> 
- 
- 
-登録された計算ノードはpbsnodesコマンドを使って確認します 
-<code> 
-$ pbsnodes -a 
-</code> 
- 
-  * 計算ノードになんらかのトラブルがあって認識されていない場合は state = down と表示されます。管理ノードから計算ノードにSSHで正しく接続できるにも関わらずこのようなメッセージが出る場合は、計算ノードのPBSを再起動します<code> 
-$ sudo /etc/init.d/pbs restart 
-</code> 
-===== ジョブの実行 ===== 
- 
-試しに「60秒間何もしない」というジョブを投げてみます。 
-クラスタ計算機を使用するユーザーで管理ノードにログインしてください。 
-qsubはジョブを投入するコマンドです 
- 
-<code> 
-$ echo 'sleep 60' | qsub 
-</code> 
-ジョブの現在の状態はqstatコマンドで確認できます 
-<code> 
-$ qstat -s 
- 
-kanri:  
-                                                            Req' Req'  Elap 
-Job ID          Username Queue    Jobname    SessID NDS TSK Memory Time  S Time 
---------------- -------- -------- ---------- ------ --- --- ------ ----- - ----- 
-1.kanri        sugimoto workq    STDIN        9007        --    --  R 00:00 
-   Job run at Tue Dec 03 at 04:56 on (keisan11:ncpus=1) 
-</code> 
-Sの列が状態を表し、Qだと実行待ち、Rだと実行中を意味します。 
-ジョブが計算ノードkeisan11で実行されていることがわかります。 
- 
-ジョブを終了または削除したい場合は qdel を使います 
-<code> 
-$ qdel 1.kanri 
-</code> 
-  * <nowiki>$ qdel 1</nowiki> でも可 
- 
- 
-====== プログラムの実行 ====== 
- 
-===== MPIの設置 ===== 
- 
-  * OpenMPI, MPICH2, Intel MPIなどのMPIライブラリを管理ノードの /opt にインストールし、NFSによって各計算ノードに共有してください 
-===== ソースコード ===== 
- 
- 
-実際にPBSを使ってクラスタ計算機にプログラムを投げてみます。 
-次のプログラムを使用します。 
- 
-<file c test.c> 
-#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; 
-} 
-</file> 
- 
-コンパイルは次のようにします。 
-<code> 
-$ mpicc -o hello hello.c 
-$ mpiicc -o hello hello.c   # Intel MPIを使用する場合 
-</code> 
- 
-===== ジョブ投入用スクリプト ===== 
- 
-次のスクリプトを作成します。 
-<file bash run.sh> 
-#!/bin/bash 
-#PBS -V 
-#PBS -l select=2:ncpus=24:mpiprocs=24 
- 
-cd $PBS_O_WORKDIR 
- 
-mpirun ./hello 
-</file> 
-  * <nowiki>#PBS -V</nowiki> ... 現在の環境を計算ノードでも引き継ぎます 
-  * <nowiki>#PBS -l</nowiki> ... 使用するリソースの量を指定します 
-    * select ... ノードの数。指定しなければ1になります 
-    * ncpus ... ノードあたりに確保するコアの数。指定しなければ1になります 
-    * mpiprocs ... ノードあたりのMPIプロセスの数。指定しなければMPI実行時に <nowiki>$ mpirun -n 48 ./hello </nowiki> とMPIプロセス数を明示する必要があります 
-  * ジョブを受け付けたPBSサーバは、#PBSで始まる行を読み込んで設定を行ったのち、Mother superiorノードにシェルスクリプトを送ります 
-  * シェルスクリプトを受け取ったMother superiorノードは、管理ノードのユーザ名と同じユーザ名のホームディレクトリで実行します。<nowiki>$PBS_O_WORKDIR</nowiki>には管理ノードで実行したときのディレクトリのパスが格納されているので、計算ノード内の同じ名前のディレクトリに移動します 
-  * MPIのホストファイル(プログラムを実行するノードのホスト名が書かれたファイル)は、Mother superiorノードの <nowiki>$PBS_NODEFILE = /var/spool/pbs/aux/<Job ID></nowiki> に生成されたものが使われます 
-実行権限を付与します。 
-<code> 
-$ chmod +x run.sh 
-</code> 
-ジョブを実行します 
-<code> 
-$ qsub run.sh 
-1.kanri 
-</code> 
-結果を見てみます 
-<code> 
-$ cat run.sh.o1 
-Hello world: rank 0 of 48 running on keisan11 
-Hello world: rank 1 of 48 running on keisan11 
-(略) 
-Hello world: rank 23 of 48 running on keisan11 
-Hello world: rank 24 of 48 running on keisan12 
-Hello world: rank 25 of 48 running on keisan12 
-(略) 
-Hello world: rank 47 of 48 running on keisan12 
-</code> 
- 
- 
- 
-==== (追記:2023/01/25) ==== 
- 
-oneAPIをアップデートしたら、ノード間並列をするときにエラーが出るようになってしまいました。 
-(バージョン:Intel(R) MPI Library 2021.5 for Linux) 
-次のようにしてください。 
- 
-<file bash run.sh> 
-#!/bin/bash 
-#PBS -V 
-#PBS -l select=2:ncpus=24:mpiprocs=24 
- 
-cd $PBS_O_WORKDIR 
- 
-mpirun -bootstrap ssh ./hello 
-</file> 
- 
-参考:https://community.intel.com/t5/Intel-oneAPI-HPC-Toolkit/faild-running-intel-oneAPI-MPI-mpihell-f90-example-on-multiple/m-p/1357061 
- 
- 
-==== OpenMPを使用する場合 ==== 
- 
-OpenMPのみ、あるいはMPI+OpenMPのハイブリッドで使用する場合は、次のようにOpenMPのスレッド数を指定してください 
-<file bash run.sh> 
-#!/bin/bash 
-#PBS -V 
-#PBS -l select=2:ncpus=24:mpiprocs=2:ompthreads=12 
- 
-cd $PBS_O_WORKDIR 
- 
-mpirun ./hello 
-</file> 
- 
-  * ompthreadsはMPIの1プロセスあたりのOpenMPのスレッド数です  
-  * 基本的には mpiprocs * ompthreads = ncpus となるようにします 
- 
-====== Fairshare ====== 
- 
-複数のユーザーが同時に使用する場合に、うまく計算資源を割り当てる機能です。 
- 
-  * https://www.altairjp.co.jp/resource/basic-fairshare-for-altair-pbs-professional 
- 
- 
-====== ノードごとの負荷の分散 ====== 
- 
-ジョブを投入したら、デフォルトでは1番目の計算ノードにジョブを埋めていき、その計算ノードのリソースが全て埋まってから次の計算ノードでジョブが走るようになります。 
-これを、各ノードの負荷を分散させるようにジョブが投入されるように変更します。 
- 
-設定ファイル <nowiki>/var/spool/pbs/sched_priv/sched_config</nowiki> から node_sort_key を探して次のように変更します。 
- 
-  * 使用しているCPUのコア数が一番少ないノードにジョブを割り当てたい場合<file - sched_config> 
-node_sort_key: "ncpus LOW assigned"     ALL 
-</file> 
- 
-  * 使用していないCPUのコア数が一番多いノードにジョブを割り当てたい場合<file - sched_config> 
-node_sort_key: "ncpus HIGH unused"     ALL 
-</file> 
- 
-(各計算ノードのコア数がすべて同じ場合は、どちらも同じ結果になります) 
- 
-PBSを再起動します。 
- 
-<code> 
-sudo /etc/init.d/pbs restart 
-</code> 
- 
-  * PBS Professional 2022.1 Administrator's Guide, Sec. 4.9.49 
-====== アンインストール ====== 
- 
-  - (管理ノードのみ)計算ノードの情報を削除します<code> 
-$ sudo -i qmgr -c "delete node @default" 
-</code> 
-  - PBSを終了します<code> 
-$ sudo /etc/init.d/pbs stop 
-</code> 
-  - インストール時に設置されたファイルを削除します<code> 
-$ 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/ 
-</code> 
- 
- 
-====== PBS Proについて ====== 
- 
-Altair Engineering社が提供するジョブ管理ソフトです。もともとは有償でしたが、2016年にオープンソース化しました 
- 
-  * [[https://www.altairjp.co.jp/news/altair%e3%81%8cpbs-professional-%e3%81%aehpc%e3%83%86%e3%82%af%e3%83%8e%e3%83%ad%e3%82%b8%e3%83%bc%e3%82%922016%e5%b9%b4%e3%81%ab%e3%82%aa%e3%83%bc%e3%83%97%e3%83%b3%e3%82%bd%e3%83%bc%e3%82%b9%e5%8c%96%e3%81%b8|AltairがPBS Professional®のHPCテクノロジーを2016年にオープンソース化へ]] 
- 
-====== 参考 ====== 
- 
-  * https://www.altair.com/pbs-works-documentation/ 
-    * 公式サイトです。必要な情報はここですべて手に入ります 
-  * https://www.nas.nasa.gov/assets/pdf/staff/RasberryPiClusterBuild.pdf 
-    * ラズベリーパイによるクラスターマシン作成方法です。OSがUbuntuと同じDebian系なのでそっくり参考になります。  
-  * https://qiita.com/MasafumiTsuyuki/items/acf4b19b54937496e32b  
-  * https://web.chaperone.jp/w/index.php?pbspro 
-  * https://pbspro.atlassian.net/wiki/spaces/PBSPro/pages/22183970/Building+and+Packaging+PBS+on+Debian+Ubuntu 
-    * パッケージを作っておくと、たくさんの計算ノードにインストールするとき楽です。 
自作クラスタ計算機/pbs_proの基本設定.1778829738.txt.gz · Last modified: 2026/05/15 16:22 by koudai