Mac book proにParalles Desktopを使ってSLURMをインストールしてみた（CentOS編）

仕事で並列計算機にSLURMをインストールすることになりました。
SLURMについて全くの未経験だったので、自宅のMacBook Pro（13-inchi, Mid 2012)にParalles Desktop １２　を使ってCentOS7を４台インストールして、仮想のHPC環境を作り、SLURMのインストールに挑戦しました。
その忘備録をまとめます。

注意）2022現在、Macbook Airを購入し、Paralles Desktop 18を使って同様の環境を構築しようとしたら、なんとParallesDesktop 18はCent OSがインストールできなくなってしまいました。Version 17まではインストールできていたようですので、ご注意ください。
私も困ったので、Ubuntuで構築する方法を検討中です。確認できたらまた記事にまとめるつもりです。
（追記）
試しに、VirtualBoxをインストールしてCentOS環境構築もトライしてみましたが、ARMのCentOSを使っても起動できず、今のところうまくいっていないです。

# 目次
- 動作環境について
- ParallesデスクトップにCentOSをインストール
- SLURMの構成について
- Mungeのインストール
- SLURMのインストール
- SLURMの設定
- うまくいかないときのチェックメモ
- 参考とさせていただいたサイト

# 作業環境
私が構築した環境は以下の通りです。１０年近くMacBook Proを愛用してきたため、かなり古い環境ですね。ただし、SLURMを構築するのはCentOS上のため、仮想環境や土台となるOSはなんでもOKです。例えば、VM ware Esxiという仮想サーバーに仮想マシンでCentOSを作って、同様の環境構築した経験もあります。VMware Esxiでの環境構築も別の機会にまとめたいと思います。

今回の動作環境
- MacBook Pro(13-inichi, Mid 2012)
- Paralles Desktop 12
- ゲスト OS：CentOS ７

# Paralles DesktopヘのCentOSインストール
Paralles　Desktopは、Macマシンに複数のOSをインストールすることができる仮想マシンソフトウェアです。有償ソフトウェアになりますが、とても使いやすくて安定しており、私はMacで自学自習するときはとても活用しています。２週間のお試しインストール（無料）もありますので、試しに使ってみてはいかがでしょうか。

本環境を構築するにあたり、Standard版で十分です。
サブスクリプション版は、約1000円/月ほどでバージョンアップもできますが、私は１回の買取版（12,700円)を選択しました。

Paralles Desktop公式サイト）
https://www.parallels.com/jp/pd/general/?gclid=CjwKCAiAmuKbBhA2EiwAxQnt71oCAmy8DsHC0qPY3Wn7PxO5ngk3OKIbxKjQBHBwpwv_G1lJuYYWixoCcu0QAvD_BwE

注意として、CentOSを使うには、最新版ではなくversion 17までをインストールしましょう。公式サイトでは、最新版しかありませんが、以下のサイトで旧バージョンのインストールもできそうです。
Paralles Desktop 旧バージョン)
https://yama-mac.com/parallels-desktop-for-mac-older-versions/

もう一つ、Mac OSを最新版(2022年現在）Venturaにバージョンアップしてしまうと、Paralle Desktop 17以下はインストールできなくなってしまいます。Mac OSはMontery12.0.1+ 以下になっていることも確認してください。（私は、これによって、新しいMacで同様の環境が作れないことがわかり、かなりショックでした涙）

Paralles Desktopの環境ができたら、CentOSのイメージをダウンロードしておきましょう。
CentoOSダウングレード）
https://www.centos.org/download/

古いMacはIntelのCPUのため、x86_84をダウンロードします。（今回環境です。）
新しいMacはM1やM2チップのため、ARM64の方からダウンロードしましょう。

CentoOSイメージのダウンロードができたら、Paralle　Desktopのメニューから今回ダウンロードしたイメージを選択して、ダウンロードしてください。Paralle Desktopのメニューの指示にそのまま従うだけなので、迷うことはないかと。

並列計算機を模擬するため、Paralle　Desktopに４台のCentoOS仮想マシンをインストールします。

# SLURMの構成について
今回構築するSLURMの構成は以下の通りです。
|hostname|SLURM役割|仮想マシン|備考|
|:---|:---|:---|:---|
|slmg|SLURMヘッドノード|CentOS 7|SLURMの管理サーバ|
|node1|SLURM node1 |CentOS 7|計算ノード|
|node2|SLURM node2 |CentOS 7|計算ノード|
|node3|SLURM node3 |CentOS 7|計算ノード|

パーティション構成を以下のようにします。
パーティションを構築することで、ジョブ投入時に選別される計算ノードをグループ化することができます。
|パーティション名|グループ化されるノード|備考|
|:---|:---|:---|
|Debug|slmg|管理ノードの死活監視|
|cluster1|node1 |node1のみ|
|cluster2|node2, node3|node2,node3から割り当て|

# Mungeインストール

・管理サーバ(slmg)でmungeのダウンロード
```
wget https://github.com/dun/munge/releases/download/munge-0.5.13/munge-0.5.13.tar.xz
```
・管理サーバ(slmg)でmungeのrpmbuildを作成する
```
rpmbuild -ta --clean munge-05.13.tar.bz2
```
・rpmbuildを/root/munge/にコピーする
```
cp -r /home/mockbuild/rpmbuild /root/install/munge
```
・インストーラーを計算ノード(node1~node3)に配布する
```
scp -r /root/install/munge/rpmbuild node1:/root/
```
・mungeインストール
```
rpm -ivh /root/rpmbuild/RPMS/x86_64/munge*
```
※ファイルは以下４つ
- munge-libs-0.5.13.el7.x86_64.rpm
- munge-0.5.13.el7.x86_64.rpm
- munge-devel-0.5.13.el7.x86_64.rpm
- munge-debuginfo-0.5.17.el6.x86_64.rpm

・管理サーバから、munge.keyを作成する。
```
sudo -u munge /usr/sbin/mungekey -v
```

・管理サーバから、munge.keyを配布する
```
scp -p /etc/munge/munge.key nx:/etc/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 -n | ssh node1 unmunge
munge -n | ssh node2 unmunge
munge -n | ssh node3 unmunge
```

これでmungeインストール完了

# SLURMインストール
・管理サーバ(slmg)でwgetでslurmの最新versionをダウンロードする
https://download.schedmd.com/slurm/slurm-29.11.8.tar.bz2
```
wget https://download.schedmd.com/slurm/slurm-29.11.8.tar.bz2
```
・管理サーバ(slmg)でslurmのrpmbuildを作成する
```
rpmbuild -ta slurm-29.11.8.tar.bz2
```
・rpmbuildを/root/install/slurm/にコピーする
```
cp -r /home/mockbuild/rpmbuild /root/install/slurm
```
・インストーラーを計算ノードに配布する
```
scp -r /root/install/slurm/rpmbuild node1:/root/
scp -r /root/install/slurm/rpmbuild node2:/root/
scp -r /root/install/slurm/rpmbuild node3:/root/
```
・slurmインストール
```
rpm -ivh /root/rpmbuild/SRPMS/slurm*
rpm -ivh /root/rpmbuild/RPMS/x86_64/slurm*
```
※事前インストール：perl(Switch)が必要な場合があります。
```
yum install -y perl-Switch
```

・必要なディレクトリを作成する
```
mkdir -p /var/lib/slurm
mkdir -p /var/lib/slurm/spool
mkdir -p /var/log/slurm
mkdir -p /var/spool/slurm/d
```
※SLURMを動作させるために、SLURMユーザを作成する手順が一般的なので、その場合は以下のようにSLURMユーザに対するパーティションを設定します。ただし、実はSLURMユーザの作成は必須ではなくrootアカウントでSLURMを動作すれば、SLURMアカウントの作成は不要だったりします。
```
chown -R slurm:slurm /var/lib/slurm
chown -R slurm:slurm /var/log/slurm
chown -R slurm:slurm /var/spool/slurm/d
```

# SLURM設定
・管理ノードで新しい計算ノードの情報を追加したslurm.confを作成する
本環境のサンプル（例）としての　Slurm.conf　
```
[user1@slmg slurm]$ cat 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.
#
# See the slurm.conf man page for more information.
#
ClusterName=cluster
ControlMachine=slmg
ControlAddr=10.211.55.24
#BackupController=
#BackupAddr=
#
SlurmUser=root
#SlurmdUser=root
SlurmctldPort=6817
SlurmdPort=6818
AuthType=auth/munge
#JobCredentialPrivateKey=
#JobCredentialPublicCertificate=
StateSaveLocation=/var/spool/slurm/ctld
#StateSaveLocation=/tmp
SlurmdSpoolDir=/var/spool/slurm/d
#SlurmSpoolDir=/tmp/slurmd
SwitchType=switch/none
MpiDefault=none
SlurmctldPidFile=/var/run/slurmctld.pid
SlurmdPidFile=/var/run/slurmd.pid
ProctrackType=proctrack/pgid
#PluginDir=
#FirstJobId=
#ReturnToService=1
ReturnToService=0
#MaxJobCount=
#PlugStackConfig=
#PropagatePrioProcess=
#PropagateResourceLimits=
#PropagateResourceLimitsExcept=
#Prolog=
#Epilog=
#SrunProlog=
#SrunEpilog=
#TaskProlog=
#TaskEpilog=
#TaskPlugin=
#TrackWCKey=no
#TreeWidth=50
#TmpFS=
#UsePAM=
#
# TIMERS
SlurmctldTimeout=300
SlurmdTimeout=300
InactiveLimit=0
MinJobAge=300
KillWait=30
Waittime=0
#
# SCHEDULING
SchedulerType=sched/backfill
#SchedulerAuth=
SelectType=select/cons_tres
SelectTypeParameters=CR_Core
#PriorityType=priority/multifactor
#PriorityDecayHalfLife=14-0
#PriorityUsageResetPeriod=14-0
#PriorityWeightFairshare=100000
#PriorityWeightAge=1000
#PriorityWeightPartition=10000
#PriorityWeightJobSize=1000
#PriorityMaxAge=1-0
#
# LOGGING
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurmd.log
JobCompType=jobcomp/none
#JobCompLoc=
#
# ACCOUNTING
#JobAcctGatherType=jobacct_gather/linux
JobAcctGatherType=jobacct_gather/none
JobAcctGatherFrequency=30
#
#AccountingStorageType=accounting_storage/slurmdbd
#AccountingStorageHost=slmg
#AccountingStorageLoc=
#AccountingStoragePass=/var/run/munge/munge.socket.2
#AccountingStorageUser=
#
# COMPUTE NODES
#NodeName=linux[1-32] Procs=1 State=UNKNOWN
NodeName=slmg CPUs=2 Boards=1 SocketsPerBoard=1 CoresPerSocket=2 ThreadsPerCore=1 RealMemory=986 State=UNKNOWN
NodeName=node1 CPUs=2 Boards=1 SocketsPerBoard=1 CoresPerSocket=2 ThreadsPerCore=1 RealMemory=986 State=UNKNOWN
NodeName=node2 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=986 State=UNKNOWN
NodeName=node3 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=986 State=UNKNOWN

PartitionName=debug Nodes=slmg Default=YES MaxTime=INFINITE State=UP
PartitionName=cluster1 Nodes=node1 Default=YES MaxTime=INFINITE State=UP
PartitionName=cluster2 Nodes=node[2-3] Default=YES MaxTime=INFINITE State=UP
```

ポイントとしては、ノードのハードウェア情報を、NodeNameで記載します。この情報は、各ノードで、slurmd -C と入力することでデータが取れます。これを転記します。
```
[user1@slmg slurm]$ slurmd -C
NodeName=slmg CPUs=2 Boards=1 SocketsPerBoard=1 CoresPerSocket=2 ThreadsPerCore=1 RealMemory=986
UpTime=4-11:01:58
```


・ntpを起動して、時刻同期をする。
SLURMでは、管理サーバと計算ノードの通信が暗号化されており、時刻同期されてないと計算ノード間の通信ができなくなります。もしSLURMがうまくいかないときは、この時間がずれていることが多いですのでチェックポイントです。

・SLURMのデーモンを起動する。
管理サーバでは、slurmctld, slurmdを起動します。
```
sudo systemctl enable slurmctld slurmd
sudo systemctl start slurmctld slurmd
sudo systemctl status slurmctld | grep Active| awk '{print $2 $3}'
sudo systemctl status slurmd | grep Active| awk '{print $2 $3}'
```
計算ノードは、slurmdを起動します。
```
sudo systemctl enable slurmd
sudo systemctl start slurmd
sudo systemctl status slurmd | grep Active| awk '{print $2 $3}'
```

slurmctld, slurmdがActiveとなれば、SLURMのインストールは終了です。
sinfo でSLURMのパーティション構成が出るかを確認してみてください。
slurm.confで定義したパーティションがidleとして表示されれば完了です。
```
[user1@slmg slurm]$ sinfo
PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST
debug        up   infinite      1   idle slmg
cluster1     up   infinite      1   idle node1
cluster2     up   infinite      2   idle node[2-3]
```

ここで、downというステータスがあると、計算ノード間の通信がうまくいっていないです。
私の場合は、各種デーモンの再起動、パーティションの設定、および時刻同期の３つを確認していくトラブルシューティングをしています。

# うまくいかないときのチェックメモ
slurmd, slurmctldを再起動する
うまく起動しない場合は、コンフィグに問題があるかもしれないので確認
slurmdとslurmctldの接続がうまくいかない場合、ntpdがfailedしている可能性があるので
再起動してみること。
それでもdownになるならば、scontrolで強制的にidleにしてみる
　
scontrol update nodename=n1 state=idle
※sinfo -R　とすると、もう少し原因がつかめるかもしれない。

sbatch -p 'パーミッション名'　./job.sh
にて、追加した計算ノードでジョブが実行できるかを確認する。

※scontrolの参考サイト
　https://x.momo86.net/article/132
※ジョブの実行方法
　https://www.j-focus.jp/user_guide/ug0004020000/
※spcコマンド使い方
　https://qiita.com/pugiemonn/items/3c80522f477bbbfa1302

# まとめ
自宅でSLURMの環境構築を行った手順を、ざっくりとまとめました。
しかし、本当はもっと色々な情報量が多く、細かいところをまとめきれていないので、これだけではうまく構築できないかもしれせん。
そのため、私ももっと記事をブラッシュアップしていくこと、そして追加の情報はさらに記事としてまとめていきます。

例えば、SLURMは、データベースがなくてもこの環境でジョブのスケジューリングや振り分けは可能ですが、SLURMデータベースを構築することで、アカウント情報を細かく制御したり、計算時間やステータスのログを管理して、課金情報につなげることができます。

この環境にSLURMデータベースを追加することも行っていますので、これは別の記事で、まとめていきたいと思います。

また、CentOS 7 も2024年6月でサポート切れとなりますので、Ubuntu (LTS)での環境構築もトライして、できたらまとめていこうと思います。

(追記)
Macbook Air(M2チップ）で、CentOSを使用できないかの検討で、VirtualBoxをインストールしてみましたが、ARMのCentOSイメージを使用しても起動できませんでした。あまり深くは検証していませんが、簡単には行かないような印象です。サポートが切れるとはいえ、まだ広く使われている OSではあると思うので、検証環境は作っておきたいなと思いつつ、ぼちぼちトライしてまた追加情報あれば追記していきたいと思います。

# 参考とさせていただいたサイト
https://qiita.com/evakichi/items/265c218362b200c3bc3d
https://download.schedmd.com/slurm/
https://qiita.com/evakichi/items/265c218362b200c3bc3d
http://www-fps.nifs.ac.jp/ito/memo/slurm01.html
※mariadbがいる
https://wiki.fysik.dtu.dk/niflheim/Slurm_installation#build-slurm-rpms
https://lists.schedmd.com/pipermail/slurm-users/2020-April/005245.html

※rpmbuildについて
https://www.indetail.co.jp/blog/12146/