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
ジョブが投入できることも確認できました。