====== 概要 ======
環境
* Ubuntu 26.04
* Slurm 25.11.2
構成
* 管理ノード (ホスト名:head)
* 計算ノード(ホスト名:node11, node12, ..., node30)
* node11〜node20は12コアのCPUが2ソケット
* node21〜node30は24コアのCPUが2ソケット
* 管理ノード、計算ノードの管理者のユーザー名は system_admin とします。
注意
* NFSによって /home が共有されているとします。
* OSは管理ノードと計算ノードで、バージョンも含めて同じものを使用してください。
* LDAPによって、ノード間でユーザーを共有してください。
* LDAPまたはDNSサーバ(Dnsmasq)によってホスト名を共有してください
====== インストール手順 ======
===== 事前準備 =====
==== SSHの設定 ====
パスフレーズ無しで計算ノードにSSHログインできるようにします。
PBSを使用する全ユーザーは、管理ノードで以下を実行してください。
$ ssh-keygen -N ""
$ cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ echo "StrictHostKeyChecking no" >> ~/.ssh/config
==== Slurmパッケージのインストール ====
管理ノードと計算ノードでそれぞれのパッケージをインストールしてください。
ここでは、SlurmのデータベースソフトにMariaDBを使用します。
* 管理ノード$ sudo apt update
$ sudo apt install -y mariadb-server slurm-wlm slurmdbd
* 計算ノード$ sudo apt update
$ sudo apt install -y slurmd slurm-client
slurm-client は、ユーザーや管理者がSlurmクラスターに対して操作を行うための「コマンド群(クライアントツール)」のみを詰め込んだパッケージです。
===== Slurmサーバーの設置 =====
すべて管理ノードで行います。
==== 認証鍵の作成 ====
ジョブ投入の際には管理ノードから計算ノードにアクセスできるようにする必要があるため、各ノードに認証鍵の導入を行います。
* 参考:https://slurm.schedmd.com/authentication.html#slurm
* 昔は munge という認証システムを入れる必要があったのですが、Slurm v23.11から認証システムがSlurm内蔵になり、設置がだいぶ楽になりました。
$ sudo dd if=/dev/random of=/etc/slurm/slurm.key bs=1024 count=1
$ sudo chown slurm:slurm /etc/slurm/slurm.key
$ sudo chmod 600 /etc/slurm/slurm.key
==== データベースの設定 ====
まずMariaDBの設定を行います。
your_secure_passwordにはSlurm管理者用のパスワードを設定してください。
$ sudo mysql -u root
以下のSQLコマンドを順に実行します
MariaDB [(none)]> CREATE DATABASE slurm_acct_db;
MariaDB [(none)]> CREATE USER 'slurm'@'localhost' IDENTIFIED BY 'your_secure_password';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON slurm_acct_db.* TO 'slurm'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> EXIT;
次にSlurm Databaseの設定を行います。
your_secure_passwordにはさきほどと同じものを使ってください。
sudo nano /etc/slurm/slurmdbd.conf
AuthType=auth/slurm
DbdHost=head
DbdPort=6819
SlurmUser=slurm
LogFile=/var/log/slurm/slurmdbd.log
PidFile=/var/run/slurmdbd.pid
# データベース接続設定
StorageType=accounting_storage/mysql
StorageHost=localhost
StoragePort=3306
StoragePass=your_secure_password
StorageUser=slurm
StorageLoc=slurm_acct_db
slurmdbd.conf にはパスワードが含まれるため、所有者を slurm にし、権限を 600 に設定してください。
$ sudo chown slurm:slurm /etc/slurm/slurmdbd.conf
$ sudo chmod 600 /etc/slurm/slurmdbd.conf
==== 設定ファイルの作成 ====
設定ファイル(slurm.conf)はSlurmの公式サイトにあるスクリプトで作成可能です。
* https://slurm.schedmd.com/configurator.html
以下が最低限の設定ですので、よくわからなければコピーして使用してください。
$ sudo nano /etc/slurm/slurm.conf
ClusterName=my_cluster
SlurmctldHost=head
# 認証
AuthType=auth/slurm
CryptoType=crypto/slurm
SlurmUser=slurm
SlurmdUser=root
SlurmctldPort=6817
SlurmdPort=6818
# 状態保存とログ
StateSaveLocation=/var/spool/slurmctld
SlurmdSpoolDir=/var/spool/slurmd
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdLogFile=/var/log/slurm/slurmd.log
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmdPidFile=/var/run/slurmd.pid
# アカウンティング(データベース連動)
AccountingStorageType=accounting_storage/slurmdbd
AccountingStorageHost=head
AccountingStoragePort=6819
# ジョブの完了を記録する設定(オプションですが推奨)
JobCompType=jobcomp/none
# ジョブがCPUのコアを正しく占有・バインドできるようにする設定
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core_Memory,CR_LLN
TaskPlugin=task/cgroup
# configファイルの内容を計算ノードと共有(Configless機能)
SlurmctldParameters=enable_configless
# リソース管理(CPU数やメモリは各ノードの実装に合わせる必要があります)
# 以下はnode11〜node20が12コアCPUが2ソケット、node21〜node30が24コアCPUが2ソケットの例です。
# RealMemoryの単位はメガバイト
NodeName=node[11-20] CPUs=24 Boards=1 SocketsPerBoard=2 CoresPerSocket=12 ThreadsPerCore=1 RealMemory=126000 State=UNKNOWN
NodeName=node[21-30] CPUs=48 Boards=1 SocketsPerBoard=2 CoresPerSocket=24 ThreadsPerCore=1 RealMemory=252000 State=UNKNOWN
# パーティション設定
PartitionName=batch Nodes=node[11-30] Default=YES MaxTime=INFINITE State=UP
PartitionName=cpu24 Nodes=node[11-20] Default=NO MaxTime=INFINITE State=UP
PartitionName=cpu48 Nodes=node[21-30] Default=NO MaxTime=INFINITE State=UP
* CR_Core_Memory: CPUコアとメモリを細かく切り出して割り当てます。
* CR_LLN (Least Loaded Node): ジョブが投入された際、割り当て候補となるノードの中から「現在最も負荷が低い(使われていないリソースが多い)ノード」を最優先で選択します。
計算ノードのホスト名が hogehoge, fugafuga のように連続する数字の連番でまとめられない場合は以下のように書きます。
NodeName=hogehoge CPUs=24 Boards=1 SocketsPerBoard=2 CoresPerSocket=12 ThreadsPerCore=1 RealMemory=128000 State=UNKNOWN
NodeName=fugafuga CPUs=48 Boards=1 SocketsPerBoard=2 CoresPerSocket=24 ThreadsPerCore=1 RealMemory=256000 State=UNKNOWN
PartitionName=batch Nodes=hogehode,fugafuga Default=YES MaxTime=INFINITE State=UP
NodeNameにはコンピュータ名(計算ノードで $ hostname と入力して出てくるもの)を設定します。
これがネットワーク上でのホスト名と異なるものになっている場合は NodeAddr にホスト名(あるいはIPアドレス)を別途設定します。
NodeName=hogehoge NodeAddr=192.168.0.11 CPUs=24 Boards=1 SocketsPerBoard=2 CoresPerSocket=12 ThreadsPerCore=1 RealMemory=128000 State=UNKNOWN
NodeName=fugafuga NodeAddr=192.168.0.12 CPUs=24 Boards=1 SocketsPerBoard=2 CoresPerSocket=12 ThreadsPerCore=1 RealMemory=128000 State=UNKNOWN
各計算ノードで指定できるリソースの最大値は、Slurmをインストールした計算ノードで以下のコマンドで確認できます。
$ slurmd -C
slurm.confでスペック以上の数値を指定すると、その計算ノードは動かなくなります。
==== ディレクトリの作成とサービスの起動 ====
slurmdbd -> slurmctldの順に立ち上げてください。
$ sudo mkdir -p /var/spool/slurmctld /var/log/slurm
$ sudo chown -R slurm:slurm /var/spool/slurmctld/ /var/log/slurm/
$ sudo systemctl enable slurmdbd slurmctld
$ sudo systemctl start slurmdbd
$ sudo systemctl start slurmctld
===== Slurmクライアントの設置 =====
==== 認証鍵の設置 ====
管理ノードで行います。
鍵ファイルをホームディレクトリにコピーします。
$ sudo cp /etc/slurm/slurm.key ~/slurm.key
各計算ノードで鍵を設置と権限の設定をします。
(/etc/exports で /home に no_root_squash オプションが入っていることを確認してください)
$ sudo cp slurm.key /etc/slurm/slurm.key
$ sudo chown slurm:slurm /etc/slurm/slurm.key
$ sudo chmod 600 /etc/slurm/slurm.key
NFSでno_root_squashを使いたくない場合は、いったん鍵をscpで各計算ノードの/tmpディレクトリに送り込んで、そこから/etc/slurm/にコピーする方法もあります。
==== 設定ファイルの作成 ====
管理ノードの slurm.conf と同じ中身のファイルを計算ノードの /etc/slurm/ に置く必要がありますが、設定が変わるたびにすべてのノードにコピーし直すのは非常に面倒なので、Configless機能を使って管理ノードのファイルを読み込むようにします。
計算ノードで実行してください。
$ sudo systemctl edit slurmd
[Service]
ExecStart=
ExecStart=/usr/sbin/slurmd --systemd --conf-server 192.168.0.1
必ず "### Edits below this comment will be discarded" の上に書き加えてください。
$ sudo systemctl daemon-reload
==== ディレクトリの作成とサービスの起動 ====
計算ノードで実行してください。
$ sudo mkdir -p /var/spool/slurmd /var/log/slurm
$ sudo chown -R slurm:slurm /var/spool/slurmd/ /var/log/slurm/
$ sudo systemctl enable slurmd
$ sudo systemctl start slurmd
====== 管理 ======
計算ノードが正しく設定されているか確認してください。
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
batch* up infinite 20 idle node[11-30]
cpu24 up infinite 10 idle node[11-20]
cpu48 up infinite 10 idle node[21-30]
slurm.confを更新した場合は、管理ノードで以下のコマンドを実行してください
$ sudo scontrol reconfigure
ノードの停止と再開(OSのアップデートなど、ノードでなにか作業するときはノードを一旦停止させてください)
$ sudo scontrol update nodename=node[11-30] state=drain # 停止
$ sudo scontrol update nodename=node[11-30] state=resume # 再開
====== 使い方 ======
よく使うコマンド
* ジョブの投入・管理:
* sbatch: シェルスクリプトをバックグラウンドジョブとしてキューに投入する。$ sbatch job.sh
* ジョブスクリプトの雛形
#!/bin/bash
#SBATCH -J job_name # ジョブ名(任意)
#SBATCH -p batch # 使用するパーティションを指定
#SBATCH -N 1 # ノード数 = 1
#SBATCH --ntasks-per-node=2 # 1ノードあたりのMPIプロセス数 (mpiprocs=2)
#SBATCH --cpus-per-task=6 # 1MPIプロセスあたりのCPUコア数 (ompthreads=6)
#SBATCH -o %x.%j.out # 標準出力ファイル名 (ジョブ名.ジョブID.out)
#SBATCH -e %x.%j.err # 標準エラーファイル名
# ホスト名の表示
hostname
# OpenMPスレッド数の設定と確認
echo "OMP_NUM_THREADS = $OMP_NUM_THREADS"
# 総コア数の計算と表示
TOTAL_CPUS=$((SLURM_NTASKS * SLURM_CPUS_PER_TASK))
echo "NCPUS = $TOTAL_CPUS"
# MPI実行
# Slurm環境の mpirun は、特別なノードファイル指定 (-f) なしで自動的に割り当てられたリソース(2プロセス × 6スレッド)を認識
mpirun program.exe > program.out
* scancel: 実行中または待機中のジョブを取り消す(キャンセルする)。JobIDはsqueueコマンドで確認できます。$ scancel
* ステータスの確認:
* sinfo: クラスター内のノードの状態(idle, alloc, downなど)やパーティションの一覧を表示する。$ sinfo
* squeue: 現在キューに溜まっている、または実行中のジョブの一覧を表示する。$ squeue
* sacct: 過去に実行したジョブの履歴や消費リソースの統計(※データベース連携時)を確認する。$ sacct
リソースやジョブの詳細を確認するには scontrol show を使います。
* ジョブの詳細情報を表示
$ scontrol show job
* 計算ノードの詳細情報を表示
$ scontrol show node node11