KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

SLURMをRockyLinuxで構築

登録日 :2024/01/21 11:12
カテゴリ :SLURM

Rocky LinuxにSLURMをインストール

RockyLinux8.8にSLURMをインストールしてみたことを忘備録としてまとめました。
RockyLinuxでも無事にSLURMをインストールすることができました。

その他、CentOS7やUbuntuでもSLURMをインストールを確認して下記にまとめていますので、ご参考になれば幸いです。
Ubuntu:SLURMをインストール)https://qiita.com/believeriver/items/2204394cead531f6881c
Ubuntu:SLURMデータベース構築)https://qiita.com/believeriver/items/9993c3730fed2a777d4a
CentOS7:SLURMをインストール)https://qiita.com/believeriver/items/cef880b9c9b9a19e4ce9

環境

手法としては、WindowPC上にVirtualBoxをインストールして、Linux仮想マシンとしてRockyLinuxをインストールします。そこで、SLURMのヘッドノード(管理ノード)とコンピュートノード(計算ノード)を構築します。(今回は最も簡単な構成として、ヘッドノードとコンピュートノードを同一とします)

  • RockyLinux8.8
  • slurm 21.08.8-2
  • munge-0.5.14

インストールの基本的な流れ

1 slurmとmungeのパッケージをダウンロードする

  • mungeパッケージ
    mungeパッケージのダウンロードは、コンパイルするために.ascファイル、.gpgファイルも必要になるため、対応するversionの各種ファイルもダウンロードしておきます。mungeのバージョンは古いものを選んでいますが、必要に応じてより最新のものを使っても良いかと思います。
wget https://github.com/dun/munge/releases/download/munge-0.5.14/munge-0.5.14.tar.xz
wget https://github.com/dun/munge/releases/download/munge-0.5.14/munge-0.5.14.tar.xz.asc
wget https://github.com/dun.gpg
  • slurmパッケージ
    今回は、2023/12時点で入手可能な21.08の一番古いバージョンをインストールします。
    入手可能なversionについては、下記サイトで確認できます。
    https://download.schedmd.com/slurm/
wget https://download.schedmd.com/slurm/slurm-21.08.8-2.tar.bz2

2. パッケージをコンパイルする

パッケージをコンパイルするには、rpmbuildコマンドを用います。

ここで、rpmbuildやgccがインストールされていない場合、環境構築から必要となります。
ただし、RockyLinuxは開発環境などの選択肢があり、rpmbuildとmariadbをインストールした状態でRockyLinuxをインストールすることができます。そのため、RockyLinuxインストール時に合わせてインストールしておくことをお勧めします。

  • mungeのコンパイル
    teeコマンドで標準出力とログ出力していますが、tee以降はなくても良いです。
rpmbuild -tb --clean munge-0.5.14.tar.xz 2>&1 | tee munge-0.5.14_rpmbuild.log
  • slurmのコンパイル
rpmbuild -ta slurm-21.08.8-2.tar.bz2 2>&1 | tee rpmbuild-slurm.log

コンパイルに成功すると、「/root/rpmbuild/RPMS」にrpmファイルが作成されます。

3. slurmとmungeのインストール

mungeインストール

コンパイルされたmungeインストーラ一式は以下の通りです。
- munge-0.5.14-1.el8.x86_64.rpm
- munge-debuginfo-0.5.14-1.el8.x86_64.rpm
- munge-debugsource-0.5.14-1.el8.x86_64.rpm
- munge-devel-0.5.14-1.el8.x86_64.rpm
- munge-libs-0.5.14-1.el8.x86_64.rpm
- munge-libs-debuginfo-0.5.14-1.el8.x86_64.rpm

これらを同一ディレクトリに保管して、rpmコマンドでインストールを行います。

rpm -ivh munge/munge-* 2>&1 | tee install_munge.log

slurmインストール

ここで、slurmのインストールを行うには、前もって以下のmariadbに関するライブラリをインストールしておく必要があります。
- mariadb-connector-c-3.1.11-2.el8_3.x86_64.rpm
- mariadb-connector-c-config-3.1.11-2.el8_3.noarch.rpm

rpm -ivh mariadb-connector-c-3.1.11-2.el8_3.x86_64.rpm 2>&1 | tee mariadb-connector-c.log
rpm -ivh mariadb-connector-c-config-3.1.11-2.el8_3.noarch.rpm 2>&1 | tee mariadb-connector-c-config.log

コンパイルされたslurmインストーラは以下の通りです。
- slurm-21.08.8-2.el8.x86_64.rpm
- slurm-contribs-21.08.8-2.el8.x86_64.rpm
- slurm-devel-21.08.8-2.el8.x86_64.rpm
- slurm-example-configs-21.08.8-2.el8.x86_64.rpm
- slurm-libpmi-21.08.8-2.el8.x86_64.rpm
- slurm-openlava-21.08.8-2.el8.x86_64.rpm
- slurm-pam_slurm-21.08.8-2.el8.x86_64.rpm
- slurm-perlapi-21.08.8-2.el8.x86_64.rpm
- slurm-slurmctld-21.08.8-2.el8.x86_64.rpm
- slurm-slurmd-21.08.8-2.el8.x86_64.rpm
- slurm-slurmdbd-21.08.8-2.el8.x86_64.rpm
- slurm-torque-21.08.8-2.el8.x86_64.rpm

rpm -ivh slurm/slurm-* 2>&1 | tee install_slurm_node2.log

SLURMのセットアップ

SLURMは、管理ノードと計算ノードそれぞれのセットアップが必要です。
管理ノード(ヘッドノードとも呼びます)では、slurmctldとmaridb及びslurmdbdを起動します。(mariadb,
計算ノード(コンピュートノードとも呼びます)では、slurmdを起動し、slurmctldと通信を行います。
管理ノードと計算ノードの通信では、mungeが使われています。
mungeは、slurmの通信(暗号化等)を行うサービスです。

今回は、管理ノードと計算ノードが同一の非常にシンプルな構成とします。slurmdbdも今回は使用しません。

1. mungeのセットアップ

先ずmungeのセットアップを行います。
管理ノードでmungeキーを作成します。

sudo -u munge /usr/sbin/mungekey -v
  mungekey: Info: Created "/etc/munge/munge.key" with 1024-bit key

mungeキーの属性を設定します。

chown munge:munge /etc/munge/munge.key
chmod 400 /etc/munge/munge.key

mungeを起動します。

systemctl enable munge
systemctl start munge
systemctl status munge
 munge.service - MUNGE authentication service
   Loaded: loaded (/usr/lib/systemd/system/munge.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2024-01-02 10:10:56 JST; 3h 44min ago
     Docs: man:munged(8)
  Process: 853 ExecStart=/usr/sbin/munged $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 871 (munged)
    Tasks: 4 (limit: 4552)
   Memory: 1.0M
   CGroup: /system.slice/munge.service
           mq871 /usr/sbin/munged

 1 02 10:10:55 headnode systemd[1]: Starting MUNGE authentication service...
 1 02 10:10:56 headnode systemd[1]: Started MUNGE authentication service.

2. SLURMのセットアップ

「slurmd -C」というコマンドで、ホストの情報を確認します。slurmのインストールができてれば、slurmを起動していなくてもこのコマンドは使うことができます。

[root@headnode install_command]# slurmd -C
NodeName=headnode CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770
UpTime=0-03:49:25

この情報は、「slurmd.conf」というslurmの設定ファイルで用います。
slurm.confの作成例を以下に示します。

#
# Example slurm.conf file. Please run configurator.html
# (in doc/html) to build a configuration file customized
# for your environment.
#
#
# slurm.conf file generated by configurator.html.
# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ClusterName=cluster_rocky_linux
SlurmctldHost=headnode
#SlurmctldHost=
#
#DisableRootJobs=NO
#EnforcePartLimits=NO
#Epilog=
#EpilogSlurmctld=
#FirstJobId=1
#MaxJobId=67043328
#GresTypes=
#GroupUpdateForce=0
#GroupUpdateTime=600
#JobFileAppend=0
#JobRequeue=1
#JobSubmitPlugins=lua
#KillOnBadExit=0
#LaunchType=launch/slurm
#Licenses=foo*4,bar
#MailProg=/bin/mail
#MaxJobCount=10000
#MaxStepCount=40000
#MaxTasksPerNode=512
MpiDefault=none
#MpiParams=ports=#-#
#PluginDir=
#PlugStackConfig=
#PrivateData=jobs
#ProctrackType=proctrack/cgroup
ProctrackType=proctrack/pgid
#Prolog=
#PrologFlags=
#PrologSlurmctld=
#PropagatePrioProcess=0
#PropagateResourceLimits=
#PropagateResourceLimitsExcept=
#RebootProgram=
#ReturnToService=1
ReturnToService=0
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
#SlurmUser=slurm
SlurmUser=root
#SlurmdUser=root
#SrunEpilog=
#SrunProlog=
StateSaveLocation=/var/spool/slurmctld
SwitchType=switch/none
#TaskEpilog=
TaskPlugin=task/affinity
#TaskProlog=
#TopologyPlugin=topology/tree
#TmpFS=/tmp
#TrackWCKey=no
#TreeWidth=
#UnkillableStepProgram=
#UsePAM=0
#
#
# TIMERS
#BatchStartTimeout=10
#CompleteWait=0
#EpilogMsgTime=2000
#GetEnvTimeout=2
#HealthCheckInterval=0
#HealthCheckProgram=
InactiveLimit=0
KillWait=30
#MessageTimeout=10
#ResvOverRun=0
MinJobAge=300
#OverTimeLimit=0
SlurmctldTimeout=120
SlurmdTimeout=300
#UnkillableStepTimeout=60
#VSizeFactor=0
Waittime=0
#
#
# SCHEDULING
#DefMemPerCPU=0
#MaxMemPerCPU=0
#SchedulerTimeSlice=30
SchedulerType=sched/backfill
SelectType=select/cons_tres
SelectTypeParameters=CR_Core
#
#
# JOB PRIORITY
#PriorityFlags=
#PriorityType=priority/basic
#PriorityDecayHalfLife=
#PriorityCalcPeriod=
#PriorityFavorSmall=
#PriorityMaxAge=
#PriorityUsageResetPeriod=
#PriorityWeightAge=
#PriorityWeightFairshare=
#PriorityWeightJobSize=
#PriorityWeightPartition=
#PriorityWeightQOS=
#
#
# LOGGING AND ACCOUNTING
#AccountingStorageEnforce=0
#AccountingStorageHost=
#AccountingStoragePass=
#AccountingStoragePort=
AccountingStorageType=accounting_storage/none
#AccountingStorageUser=
#AccountingStoreFlags=
#JobCompHost=
#JobCompLoc=
#JobCompPass=
#JobCompPort=
JobCompType=jobcomp/none
#JobCompUser=
#JobContainerType=job_container/none
JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurmd.log
#SlurmSchedLogFile=
#SlurmSchedLogLevel=
#DebugFlags=
#
#
# POWER SAVE SUPPORT FOR IDLE NODES (optional)
#SuspendProgram=
#ResumeProgram=
#SuspendTimeout=
#ResumeTimeout=
#ResumeRate=
#SuspendExcNodes=
#SuspendExcParts=
#SuspendRate=
#SuspendTime=
#
#
# COMPUTE NODES
NodeName=headnode CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770 State=UNKNOWN
#NodeName=node1 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770 State=UNKNOWN
#NodeName=node2 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=770 State=UNKNOWN
#
# PARTITION
#PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
PartitionName=debug Nodes=headnode Default=NO MaxTime=01:00 State=UP

slurmの起動

slurm.confの作成が完了したら、slurmを起動します。(slurmctld, slurmdをどちらも起動します)

sudo systemctl stop slurmctld slurmd 
sudo systemctl start slurmctld slurmd 
sudo systemctl status slurmctld slurmd 

「sinfo」でslurmのステータスを確認します。以下のように、使用可能なノードが「idle」として表示されればOKです。

[root@headnode slurm]# sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug        up       1:00      1   idle headnode
よくあるエラー

「down」ステータスになっている場合、slurmctldとslurmdの通信がうまくいっていないことが多いです。slurmctld,slurmd, mungedの再起動で解決しない場合、計算ノード間の時間が揃っていなことなどで良く発生しますので、システム時間の整合性もチェックしてみてください。(ただし今回の例は、1ノードで管理ノードと計算ノードを兼ねていますので、時間ずれの問題は発生しないはずです。)

備考

計算ノードを増やすことも可能です。手順はRockyLinuxとは関係ないため、Ubuntuにて解説した手順がありますので参考にしてください。
https://qiita.com/believeriver/items/2204394cead531f6881c

テストジョブの実行

それでは、テストジョブをと入力してみます。
ランスクリプトは、以下のように60秒間sleepするだけです。

#!/bin/sh
#SBATCH --job-name test
#SBATCH --nodes=1
#SBATCH --tasks-per-node=1
#SBATCH --ntasks=1
#SBATCH -o %x.%J.out
#SBATCH -e %x.%J.err

hostname
sleep 60

slurmのバッチジョブは、「sbatch」を用います。

[user01@headnode work]$ sbatch -p debug test_run.sh
Submitted batch job 8

ジョブのステータスは、「squeue」で確認します。

[user01@headnode work]$ squeue
             JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
                 8     debug     test   user01  R       0:04      1 headnode

ジョブが投入できることも確認できました。