ジョブスケジューラーslurmをUbuntu20.04＠wsl2にインストールして、テストする。

## slurmをUbuntu20.04＠wsl2に入れてみたがうまくいかない
ジョブスケジューラーslurmを導入したい計算機があり、いきなりやって環境が汚れるのは嫌だったのでテストのためにUbuntu20.04＠wsl2にslurmをインストールした。
ちょっとすんなりいかなかったので共有します。
なお、クラスターではなく１台の計算機のケースです。
wslではなく、通常のUbuntu20.04にも入れてみましたが、"Systemdを有効にする"と"事前準備： makeとgccのインストール"行わずにやればインストールできました。

お役に立てたら、LGTMよろしくお願いします。

<strong> 参考にしたサイト </strong>
公式 ： https://slurm.schedmd.com/quickstart_admin.html
参考1 : https://qiita.com/inv_Koyama/items/313ba7bdd5a9c49ab8b9
参考2：https://qiita.com/JeJeNeNo/items/c545e72373d4d1deb36a

<strong> 環境 </strong>
インストールしたてのUbuntu20.04＠wls2にインストールする

## Systemdを有効にする
wslのLinuxは、systemdがそのままだと使えないので、有効にする。
下記にまとめてあります。
[Ubuntu20.04＠wsl2でsystemd(systemctl)を使用する](https://qiita.com/egoo/items/20b2599b0ce6f0eee98a)

## 事前準備： makeとgccのインストール
wslだと基本的なコマンドも入っていないので、入れます。

```bash
$ sudo apt update
$ sudo apt install make
$ sudo apt install gcc
```

## 事前準備：MUNGEをインストール
MUNGE([公式](https://dun.github.io/munge))はHPCクラスター用の認証システム。
[参考1](https://qiita.com/inv_Koyama/items/313ba7bdd5a9c49ab8b9)によるとaptでインストールできるとのこと。
ここでwslだとdpkgが入ってエラーがでることもあるのでdpkgも合わせてインストールしておく。

```bash
$ sudo apt update
$ sudo apt install dpkg
$ sudo apt install libmunge-dev
$ sudo apt install libmunge2
$ sudo apt install munge
## ちなみに、dpkgとlibmunge2はインストール済みとの表示される場合もあるが気にしない。
```
systemdで動いているか確認

```bash
$ sudo systemctl status munge
# 実行結果
● munge.service - MUNGE authentication service
     Loaded: loaded (/lib/systemd/system/munge.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-01-01 10:10:12 JST; 2min 5s ago
```

## slurmをインストールする。
最新版をWindowsのブラウザでダウンロードします。
https://slurm.schedmd.com/download.html
今回は、slurm-20.11.3.tar.bz2　をダウンロードしました。
(なお、Ubuntu用(slurm-wlm)も用意されている模様。)

Windowsでダウンロードしたファイルを、wls2のUbuntuのhomeディレクトリにコピーします。
WindowsのDownloadsフォルダに上記のファイルがある場合、Ubuntuで下記のコマンドを実行。

```bash
$ cp /mnt/c/Users/XXXX/Downloads/slurm-20.11.3.tar.bz2 ~/.
# WindowsのフォルダはUbuntuで、/mnt/cとしてマウントされています。
# XXXXは適宜変更してください。
```

ファイルを解凍します。

```bash
$ tar -jxvf slurm-20.11.3.tar.bz2
```

解凍されたフォルダの中に移動して下記を実行。
下記のコマンドを実行。1つ実行するたびにしばらく待ちます。

```bash
$ ./configure
$ make
$ sudo make install
```

デフォルトのインストール先は/usr/localのようで、findすると下記のフォルダにファイルが加わっている模様。

```bash
$ find /usr/local -name "slurm"
# 実行結果
/usr/local/include/slurm
/usr/local/lib/slurm
```

## 設定ファイル
slurmの設定ファイルを作ります。下記にアクセス。
https://slurm.schedmd.com/configurator.easy.html
(Ubuntuで解凍したslurmフォルダのdoc/html/configurator.easy.htmlをブラウザで開くでもOK）
設定は[参考2](https://qiita.com/JeJeNeNo/items/c545e72373d4d1deb36a)を参考にした。
私の環境は、1物理CPUの中に6コア入ったCPUを使ってます。

- SlurmctldHost　→　$ hostname　で返ってくる値。
- NodeName　→　上に同じ
- CPUs:6　→　物理CPU数ではなく、コア数の模様
- Sockets:1
- CoresPerScoket:6
- ThreadsPerCore:1
- SlurmUser　→　搭載しているメモリの量（free -m コマンドで表示される）
- Resource Selection
- SelectType: Cons_res に変更。
- SelectTypeParameters=CR_CPU この行は設定ファイルに直接書き込みます。

でSubmitボタンを押す。buntu上で、slurm.confという名前でファイルを作って出てきたテキストをコピペ。
さらに、下記の行を手動で書き換える。
\#SelectTypeParameters=
→　SelectTypeParameters=CR_CPU

私の場合は、エラーが出たので下記としてます。人によってはcgroupのままでいいかも。
ProctrackType=proctrack/cgroup
→　ProctrackType=proctrack/linuxproc
X11使ってるとそうなるっぽい。

```bash:/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.
#
SlurmctldHost=PC-wsl
#
#MailProg=/bin/mail
MpiDefault=none
#MpiParams=ports=#-#
#ProctrackType=proctrack/cgroup
ProctrackType=proctrack/linuxproc
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/affinity
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
SchedulerType=sched/backfill
SelectType=select/cons_res
SelectTypeParameters=CR_CPU
#
#
# LOGGING AND ACCOUNTING
AccountingStorageType=accounting_storage/none
ClusterName=cluster
#JobAcctGatherFrequency=30
JobAcctGatherType=jobacct_gather/none
#SlurmctldDebug=info
#SlurmctldLogFile=
#SlurmdDebug=info
#SlurmdLogFile=
#
#
# COMPUTE NODES
NodeName=PC-wsl CPUs=6 RealMemory=7000 Sockets=1 CoresPerSocket=6 ThreadsPerCore=1 State=UNKNOWN
PartitionName=debug Nodes=PC-wsl Default=YES MaxTime=INFINITE State=UP
```

作ったファイルを/usr/local/etc/にコピー

```bash
$ sudo cp slurm.conf /usr/local/etc/
```

## slurmをsystemdで起動する
コピーして、有効にして、開始します。

```bash
$ 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
```

実行されているか確認する。

```
$ systemctl status slurmctld.service
# 実行結果
● slurmctld.service - Slurm controller daemon
     Loaded: loaded (/etc/systemd/system/slurmctld.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-01-01 16:01:01 JST; 2h 0min ago

$systemctl status slurmd.service
# 実行結果
● slurmd.service - Slurm node daemon
     Loaded: loaded (/etc/systemd/system/slurmd.service; enabled; vendor preset: enabled)
     Active: active (running) since Sun 2021-01-01 16:01:01 JST; 2h 0min ago

```
どちらもactive(running)になっていればOK。
ちなみに、エラーが出ているときの対処法を、簡単に記載しております。
[systemdでslurmがエラーになる場合の対処方法](https://qiita.com/egoo/items/7e785b38c66e4e079c50)

## キューにジョブを投げて、うまく動くか確認してみる。
まず、ジョブチェック用のシェルスクリプト 1.sh を作ります。

```bash:1.sh
#!/bin/bash

#SBATCH -J 1Core
#SBATCH -o output_%j.txt
#SBATCH -e errors_%j.txt
#SBATCH -p debug
#SBATCH -n 1

echo Lets sleep
sleep 30
```
以下、解説

- #SBATCH -J 1Core 　　　　#Job名
- #SBATCH -o output_%j.txt　#標準出力
- #SBATCH -e errors_%j.txt　 #エラー出力
- #SBATCH -p debug　　　　#キューの名前。デフォルトキューはdebug
- #SBATCH -n 1　　　　　　 #Slurm上で要求するCPUコア数

投げて、確認してみる。コマンドは$ sbatch。続けてシェルスクリプトの名前を打つ。

```bash
$ sbatch 1.sh
```

投入したジョブの状態を確認する。$ squeueコマンドで確認できます。

```bash
$ squeue
#実行結果
 JOBID PARTITION     NAME     USER 　ST   TIME  　NODES NODELIST(REASON)
 　 1     debug    　1Core      XXX  R    0:02      1 PC-wsl
```
ST(State)がR(Run)になっていてジョブが走っているのがわかる。

1.shの#SBATCH -n の値を2と4と変更したファイルを、それぞれ2.sh　4.shと名前をつつけて適当に流してみる。

```bash
$ squeue
# 実行結果
  JOBID PARTITION     NAME     USER ST       TIME  NODES NODELIST(REASON)
     38     debug    4Core      XXX PD       0:00      1 (Resources)
     39     debug    1Core      XXX PD       0:00      1 (Priority)
     40     debug    4Core      XXX PD       0:00      1 (Priority)
     41     debug    2Core      XXX PD       0:00      1 (Priority)
     34     debug    1Core      XXX  R       0:29      1 PC-wsl
     35     debug    1Core      XXX  R       0:18      1 PC-wsl
     36     debug    2Core      XXX  R       0:15      1 PC-wsl
     37     debug    2Core      XXX  R       0:14      1 PC-wsl
```
このマシンは全部で6Coreとして設定しましたが、いい感じCPUに応じてジョブを割り振って(JOBID:34~37のST=R)、
残りは待機状態(JOBID=38~41のSTがPD)になってくれています。