今回は、Open OnDemandのclusterでジョブを実行するために、ジョブスケジューラをインストールします。
Open OnDemandの Cluster Conguration のページを見るとは、いくつかのジョブスケジューラに対応しているようです。その中から、今人気の高い Slurm をインストールすることにします。
構築するジョブ実行環境
私の環境では、Slurmのために仮想マシン(VM)を以下の通り2個立ち上げています。この2ノードでジョブ実行環境を構築します。
・ood0 (192.168.1.204): 管理ノード兼計算ノード, Open OnDemandサーバも兼ねる
・ood1 (192.168.1.205): 計算ノード

仮想マシンを運用するホストサーバには、ミニPC MINISFORUM GK41 を使っています。
mungeのインストール
mungeって何?
Slurmをインストールする前提条件としてmungeが必要になります。munge公式サイトによると、mungeは以下の通り説明されています。
MUNGE(MUNGE Uid ‘N’ Gid Emporium)は、認証情報の作成と検証を行う認証サービスです。HPCクラスタ環境で使用できるよう、高い拡張性を持つように設計されている。共通のユーザーとグループを持つホストのグループ内で、ローカルまたはリモートの別のプロセスの UID と GID を認証することができます。
なるほどクラスタ内のノードでSlurmがユーザがジョブを実行するときに、認証は必要になるので、その役割を担うのがmungeという訳です。
mungeのインストールと鍵の設置
管理ノードと計算ノードの両方でmungeをインストールします。Rocky Linux 8.8では、dnfコマンドで簡単にインストールできました。
# dnf -y install munge
以下のコマンドを実行して鍵を作成し、/etc/munge/munge.key に格納します。
鍵の元になる文字列に “xxxxx” を使用していますが、この文字列はなんでも良いです。
# echo -n “xxxxx” | sha1sum | cut -d’ ‘ -f1 > /etc/munge/munge.key
# chown munge:munge /etc/munge/munge.key
# chmod 400 /etc/munge/munge.key
作成した鍵は、管理ノードだけでなく全ての計算ノードにコピーしましょう。
mungeサービスの起動
鍵を設置したら、管理ノードと計算ノードの両方で、以下の通りに mungeサービスの起動と起動設定を行いましょう。
# systemctl start munge
# systemctl enable munge
munge認証のチェック
管理ノードと計算ノードのそれぞれのノードで、以下のコマンドを実行して Success(0) が出力されることを確認します。要するに、エンコードしたものを正しくデコードできるかどうかを確認しています。
# munge -n | unmunge
STATUS: Success (0)
ENCODE_HOST: ood0 (192.168.1.204)
ENCODE_TIME: 2024-05-05 10:28:30 +0900 (1714872510)
DECODE_TIME: 2024-05-05 10:28:30 +0900 (1714872510)
TTL: 300
CIPHER: aes128 (4)
MAC: sha256 (5)
ZIP: none (0)
UID: root (0)
GID: root (0)
LENGTH: 0
管理ノードでエンコードしたものが計算ノードで正しくデコードできるかどうかについても、以下の通り確認します。同様にSucess(0)が出力されればOKです。
# munge -n | ssh 192.168.1.205 unmunge
STATUS: Success (0)
ENCODE_HOST: ??? (192.168.1.204)
ENCODE_TIME: 2024-05-05 10:40:22 +0900 (1714873222)
DECODE_TIME: 2024-05-05 10:40:22 +0900 (1714873222)
TTL: 300
CIPHER: aes128 (4)
MAC: sha256 (5)
ZIP: none (0)
UID: root (0)
GID: root (0)
LENGTH: 0
Slurmのインストール
Slurmのインストール
管理ノードでは、SlurmクライアントとSlurm コントローラデーモン(slurmctld)をインストールします。ood0は計算ノードも兼ねるので, Slurmノードデーモン(slurmd)もインストールします。
# dnf -y install slurm slurm-slurmctld slurm-slurmd
計算ノードとなる ood1 では、SlurmクライアントとSlurmノードデーモンをインストールします。
# dnf -y install slurm slurm-slurmd
Slurmの設定
Slsurmの設定ファイルは /etc/slurm/slurm.conf です。以下の箇所を修正します。
ClusterNameの設定
初期値は cluster になっています。Open OnDemandと同じクラスタ名 my_cluster に変更します。
何故ならば、Open OnDemandでSlurmジョブを投入するときに「-M <クラスタ名>」という引数オプションでクラスタ名を指定されるためです。
ClusterName=my_cluster
クラスタ名を変更したら以下の通り /var/spool/slurm/ctld/clustername を削除して、slurmctld を再起動します。こうしないとクラスタ名が変更されません。
# rm -f /var/spool/slurm/ctld/clustername
# systemctl restart slurmctld
計算ノードとpartitionの設定
計算ノードはジョブを実行するノードで、partitionは計算ノードのグループを意味します。
これらも /etc/slurm/slurm.conf の中で定義されており、初期値は以下のようになっています。
NodeName=localhost CPUs=1 State=UNKNOWN
PartitionName=debug Nodes=localhost Default=YES MaxTime=INFINITE State=UP
計算ノードはNodeNameで指定します。localhost という計算ノードが CPUが1個のノードとして定義されています。
partitionはPartitionNameで指定します。debug という名前のpartitionに、localhost という計算ノードが含まれていることが分かります。
sinfoコマンドを実行すると、partitionの情報を出力することができます。
# sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
debug* up infinite 1 idle localhost
さてここで、ood0とood1を計算ノードとして NodeName に登録していきますが、注意点があります。NodeNameに登録するホスト名は hostname -s で出力されるホスト名と一致していないとならないということらしいです。
計算ノード ood0, ood1 は /etc/hosts に定義しておきますが、このように定義したホスト名とhostname -s で出力されるホスト名が一致する訳ではないので注意して下さい。
192.168.1.204 ood0
192.168.1.205 ood1
/etc/slurm/slurm.conf において計算ノード ood0とood1を定義し(localhost はood0に名前を変更しました)、debugというpartitionには全ノードを意味する ALL を定義します。
NodeName=ood0 CPUs=1 State=UNKNOWN
NodeName=ood1 CPUs=1 State=UNKNOWN
PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
ood0とood1の定義は以下のようなメタ記述を使うことで1行で指定することもできます。
NodeName=ood[0-1] CPUs=1 State=UNKNOWN
ControlMachineとControlAddrの設定
管理ノードのホスト名とIPアドレスを定義します。
初期値は以下の通りとなっており管理ノード兼計算ノードの1ノードで運用するならこのままで良いのですが…
ControlMachine=localhost
ControlAddr=127.0.0.1
今回はood0を管理ノード兼計算ノード、ood1を計算ノードとして運用するので、以下の通りに修正して下さい。
ControlMachine=ood0
ControlAddr=192.168.1.204
管理ノードで /etc/slurm/slurm.conf を修正したら、それを全ての計算ノードの /etc/slurm/slurm.conf にもコピーして下さい。
計算ノードのslurmdは管理ノードのslurmctldと通信する必要があるため、この定義を読み込みます。上記の通り、管理ノードのホスト名とIPアドレスをlocalhostではなくood0に修正したのは、このためです。
デーモンの起動
管理ノード兼計算ノードとなるood0では、Slurm コントローラデーモン(slurmctld)とSlurmノードデーモン(slurmd)の起動と起動設定を行って下さい。
# systemctl start slurmctld
# systemctl enable slurmctld
# systemctl start slurmd
# systemctl enable slurmd
計算ノードとなるood1では、Slurmデーモンの起動と起動設定を行って下さい。
# systemctl start slurmd
# systemctl enable slurmd
/etc/slurm/slurm.conf を修正した場合も、デーモンの再起動が必要になります。
上記の通り、デーモンを再起動する代わりに、管理ノードと計算ノードのそれぞれで以下のコマンドを実行することでも良いみたいです。
# scontrol reconfig
それぞれのデーモンが正しく起動したどうかについては、それぞれ以下のコマンドで確認することができます。「active (running)」と表示されれば正しく動作しています。
systemctl status slurmctld
systemctl status slurmd
slurm.confの記述方法に誤りがあると、上記の方法で状態を確認したときに「active (running)」とならず「failed」になっています。
failedになってしまう原因を探る最も簡単な方法は、slurmctld または slurmd を -Dオプションを以下のように付けて直接実行し、エラーメッセージを端末上に表示することです。
/usr/sbin/slurmctld -D
/usr/sbin/slurmd -D
partitionの情報を表示して確認する
sinfo コマンドで partitionの情報を表示してみましょう。ジョブが割り当てられていない状態であれば、ood0とood1がidleとして表示されます。
# sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
debug* up infinite 2 idle ood[0-1]
slurmdが計算ノードで稼働していないとSTATEがunk*(unknown)と表示されてしまいます。計算ノードでもslurmdを起動するようにしましょう。
ジョブ投入のテスト
ジョブ投入のテストは一般ユーザで行います。ジョブ実行するスクリプト go.sh は以下の通り作成しました。
#!/bin/bash
pwd
ls
hostname
sleep 30
sbatchコマンドでジョブを投入した後で、squeueコマンドでジョブの状態を確認します。
以下の例では、ジョブを2本投入して、1本目がood0で、2本目がood1で実行されていることが分かります。
[testu1@ood0 SLURM]$ sbatch go.sh
Submitted batch job 22
[testu1@ood0 SLURM]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
22 debug go.sh testu1 R 0:02 1 ood0
[testu1@ood0 SLURM]$ sbatch go.sh
Submitted batch job 23
[testu1@ood0 SLURM]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
22 debug go.sh testu1 R 0:11 1 ood0
23 debug go.sh testu1 R 0:04 1 ood1
ジョブの出力は、ジョブ投入ディレクトリ上に slurm-<ジョブID>.out というファイルで作成されます。ジョブID 23の出力ファイル slurm-23.out の内容は、以下のようになっています。
/home/share/testu1/SLURM
go.sh
slurm-22.out
slurm-27.out
ood1
NQSやPBSと異なり、ジョブ実行直後のカレントディレクトリは、ジョブ投入ディレクトリと同じになっています。これは便利ですね。ジョブID 23のジョブはノードood1で実行されたことも確認できます。
所感
Slurmの設定(slurm.confの定義)は、初心者には少し難解です。Open OnDemandからSlurmジョブを投入する前に、Slurm単独でジョブ投入のテストを実施しておくことをお勧めします。
広告主へのリンク



コメント