This is an old revision of the document!
Table of Contents
概要
環境
- 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サーバーの設置
すべて管理ノードで行います。
認証鍵の作成
ジョブ投入の際には管理ノードから計算ノードにアクセスできるようにする必要があるため、各ノードに認証鍵の導入を行います。
- 昔は 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
- /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の公式サイトにあるスクリプトで作成可能です。
以下が最低限の設定ですので、よくわからなければコピーして使用してください。
$ sudo nano /etc/slurm/slurm.conf
- /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 $ sudo chown slurm:slurm slurm.key $ sudo chmod 600 slurm.key
各計算ノードで鍵を設置します。 (/etc/exports で /home に no_root_squash オプションが入っていることを確認してください)
$ sudo cp slurm.key /etc/slurm/slurm.key
設定ファイルの作成
管理ノードの 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 $ sudo scontrol update NodeName=node[11-30] State=RESUME # 計算ノードに設定が反映されない場合
使い方
よく使うコマンド
- ジョブの投入・管理:
- sbatch: シェルスクリプトをバックグラウンドジョブとしてキューに投入する。
$ sbatch job.sh
- ジョブスクリプトの雛形
- 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 <jobID>
- ステータスの確認:
- sinfo: クラスター内のノードの状態(idle, alloc, downなど)やパーティションの一覧を表示する。
$ sinfo
- squeue: 現在キューに溜まっている、または実行中のジョブの一覧を表示する。
$ squeue
- sacct: 過去に実行したジョブの履歴や消費リソースの統計(※データベース連携時)を確認する。
$ sacct
リソースやジョブの詳細を確認するには scontrol show を使います。
- ジョブの詳細情報を表示
$ scontrol show job <JobID>
- 計算ノードの詳細情報を表示
$ scontrol show node node11
