Slurm Workload ManagerをUbuntu 16.04LTS に導入する

More than 1 year has passed since last update.


Slurm Workload Managerとは

Slurm Workload Manager (Slurm)は無料でオープンソースのジョブスケジューラであり、世界中の多くのスパコンで利用されている。Xeon E5-26XXv4では今まで使用していたジョブスケジューラ(TORQUE)がうまく動作しなかったので、こちらのジョブスケジューラを試したところ、うまく動いたので作業メモを残す。


MUNGEのインストール

MUNGEはSlurmのデフォルトの認証ソフト。 https://dun.github.io/munge/

これは、Ubntuのパッケージレポジトリからインストールできる。

sudo apt install libmunge-dev libmunge2 munge

しかし、"Job for munge.service failed because the control process exited with error code. See "systemctl status munge.service" and "journalctl -xe" for details."のようなエラーメッセージが表示され、MUNGEが起動しない。そこで、ググるとmunge.serviceのコードを以下のように少し書き換えれば対処できることが分かった。

https://groups.google.com/forum/#!topic/slurm-devel/_fUsovmjkvM

https://github.com/dun/munge/issues/31#issuecomment-127726497

sudo systemctl edit --system --full munge # munge.serviceを編集する。

# "ExecStart=/usr/sbin/munged" の行を
# "ExecStart=/usr/sbin/munged --syslog"に書き換える。
# nanoで編集しているので"ctrl+o"で上書き保存し、"ctrl+x"で終了する。


/etc/systemd/system/munge.service

[Unit]

Description=MUNGE authentication service
Documentation=man:munged(8)
After=network.target
After=time-sync.target

[Service]
Type=forking
ExecStart=/usr/sbin/munged --syslog
PIDFile=/var/run/munge/munged.pid
User=munge
Group=munge
Restart=on-abort

[Install]
WantedBy=multi-user.target


MUNGEの起動と動作確認

sudo systemctl start munge     # mungeを起動

systemctl status munge.service # mungeが動作しているか確認。


Slurmのインストール

SlurmもUbuntuのレポジトリからインストールできるはずだが、手元の環境ではうまく動作しなかったので、最新の安定版を使った。 https://www.schedmd.com/downloads.php から最新の安定版をダウンロードし、ダウンロードしたフォルダでビルドし、インストールする。

tar -jxvf slurm-16.05.6.tar.bz2 

cd slurm-16.05.6
./configure
make
sudo make install


Slurmの設定ファイルの作成

次にSlurmの設定ファイルを作成する。展開したslurmのフォルダに設定ファイルの作成を手助けするhtmlファイルがあるので(doc/html/configurator.easy.html)、適当なブラウザで開いて作成する。今回はPC一台にインストールするのでControl MachineとCompute Machinesを同一にした。また、Slurm Userをrootに、Resource Selection, SelectTypeをCons_resにそれぞれ変更した。submitボタンを押した後表示されるテキストをslurm.confファイルとして保存する。

firefox doc/html/configurator.easy.html

# ControlMachine: ホスト名
# ControlAddr: ホストのIPアドレス
# NodeName: ホスト名
# NodeAddr: ホストのIPアドレス
# Sockets: マザーボードに搭載しているCPUの数(普通は1か2)
# CoresPerSocket: 1CPUあたりのコアの数
# ThreadsPerCore: 1コアあたりのスレッドの数
# CPUs: SoketsとCoresPerSocketとThreadsPerCoreの積
# RealMemory: 搭載しているメモリの量(free -m コマンドで表示される)
# SlurmUser: root
# Resource Selection
# SelectType: Cons_res に変更。
# "SelectTypeParameters=CR_CPU" この行は設定ファイルに書き込む。

Hyper Threadingを使って全てのスレッドにジョブを割り振る場合は"Sockets", "CoresPerSocket", "ThreadsPerCore"は設定しない方がいいようだ。その場合は"CPUs"のみ設定する。

https://groups.google.com/forum/#!searchin/slurm-devel/all$20threads|sort:relevance/slurm-devel/wmCeUBwR9bk/GKmP4JNQBwAJ

http://slurm.schedmd.com/cons_res.html

作成したSlurmの設定ファイルを /usr/local/etc/ にコピーする。

sudo cp slurm.conf /usr/local/etc/


/usr/local/etc/slurm.conf

# slurm.conf file generated by configurator easy.html.

# Put this file on all nodes of your cluster.
# See the slurm.conf man page for more information.
#
ControlMachine=SlurmServer
ControlAddr=10.x.x.x
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
ProctrackType=proctrack/pgid
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=root
#SlurmdUser=root
StateSaveLocation=/var/spool
SwitchType=switch/none
TaskPlugin=task/none
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
FastSchedule=1
SchedulerType=sched/backfill
#SchedulerPort=7321
SelectType=select/cons_res
SelectTypeParameters=CR_CPU
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=cluster
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
#SlurmctldDebug=3
#SlurmctldLogFile=
#SlurmdDebug=3
#SlurmdLogFile=
#
#
# COMPUTE NODES
NodeName=SlurmServer NodeAddr=10.x.x.x CPUs=32 RealMemory=257850 State=UNKNOWN
PartitionName=defq Nodes=SlurmServer Default=YES MaxTime=INFINITE State=UP


Slurmが使用するポート

ファイアウォールを設定している場合は、Slurmで使用するポートを開けておく。デフォルトの設定だと、Slurmctldが6817、Slurmdが6818を使用し、Schedulerが7321を使用するようだ。


Slurmをサービスとしてsystemdに設定後、起動させる

# set and start slurmd and slurmctld as services

sudo cp etc/slurmctld.service /etc/systemd/system
sudo cp etc/slurmd.service /etc/systemd/system
sudo systemctl enable slurmctld.service
sudo systemctl enable slurmd.service
sudo systemctl start slurmctld.service
sudo systemctl start slurmd.service

# check status of the services
systemctl status slurmctld.service
systemctl status slurmd.service


動作テスト

srun -l sleep 60 &

squeue

ほかのジョブスケジューラとのコマンドの対応表はこちら。

https://slurm.schedmd.com/rosetta.pdf


参考

https://en.wikipedia.org/wiki/Slurm_Workload_Manager

https://slurm.schedmd.com/

http://www.ibm.com/developerworks/jp/linux/library/l-slurm-utility/

http://wildflower.diablonet.net/~scaron/slurmsetup.html

http://www-fps.nifs.ac.jp/ito/memo/slurm01.html

http://qiita.com/JeJeNeNo/items/908b127d9c3cfb8a21ce