LLM時代に必須！？トレーニングジョブを管理するSlurmのセットアップ手順

# はじめに

こんにちは、京セラコミュニケーションシステム　川村（@kccs_takahiro-kawamura）です。

皆さんはSlurmについてご存知ですか？
強力なGPUマシンでLLMをトレーニングしたり、スパコンで大規模な演算処理を行う際にそのジョブを管理するソフトウェアです。
今回は、Slurmのセットアップ手順と注意すべき点を記載します。

:::note info
本記事は2024年12月ごろに作成しております。よって、引用している文章などはこの時点での最新となります。ご了承ください。
:::

## 本記事の対象者
* Slurmでジョブ管理を検討している方

# 本記事におけるサーバー構成
以下の図のようなサーバー構成を前提に記載します。
また、サーバーのOSはUbuntu 24.04LTSを使用します。
![architecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164163/dc75109b-38f4-ea00-3bd9-fde845344429.png)


#### 管理ノード
Slurmのクラスターとジョブを管理するサーバーです。
slurmctldが動作します。

#### 計算ノード
Slurmのジョブを実行するサーバーです。
slurmdが動作します。

# 管理ノードのセットアップ
ここからは管理ノードのセットアップ手順を記載します。

### 1. 関連パッケージのインストール
まずは、aptを更新します。
```
$ sudo apt update
```
続いて、パッケージをインストールします。
`mailutils`のインストール後にPostfixの設定が出るため必要に応じて設定してください。
`No Configuration`を選択してもSlurmは動作します。
```
$ sudo apt install -y build-essential mailutils
```

### 2. mungeのインストール
Slurmの各ノード間の安全な認証と認可を提供するシステムです。
各ノードに同じ鍵ファイルを配置することで安全なノード間通信を実現します。
インストールするパッケージは2つあります。
```
$ sudo apt install -y munge libmunge-dev
```

### 3. mungeの鍵ファイル生成
Slurm間の通信で使用する鍵ファイルを生成します。
この鍵ファイルは何かしらの方法で計算ノードに共有する必要があります。
```
$ sudo dd if=/dev/random of=/etc/munge/munge.key bs=1024 count=1
$ sudo chown munge:munge /etc/munge/munge.key
$ sudo chmod 400 /etc/munge/munge.key
$ sudo systemctld restart munge
```

### 4. slurmのインストール
Slurmは、オフィシャルサイトからダウンロードします。
この時、ダウンロードしたファイルを配置する場所は適宜変更してください。
今回はホームディレクトリにダウンロードします。
また、ダウンロードするSlurmのバージョン等は[こちら](https://download.schedmd.com/slurm/)から確認してご自身の環境にあったものをダウンロードください。
```
$ cd ~
$ wget https://download.schedmd.com/slurm/slurm-24.05.3.tar.bz2
```
ダウンロードしたファイルを展開します。
```
$ tar -jxvf slurm-24.05.3.tar.bz2
$ cd ~/slurm-24.05.3
```
Slurmをインストールします。
```
$ ./configure
$ make
$ sudo make install
```

### 5. slurmの設定ファイル作成
設定ファイルは公式サイトに作成できるツールがあります。
[簡易バージョン](https://slurm.schedmd.com/configurator.easy.html)と[フルバージョン](https://slurm.schedmd.com/configurator.html)があります。
設定は環境に合わせて行っていただく必要があるため、今回は簡易バージョンで設定ファイルを生成した上でいくつか設定項目を追加します。
設定ファイルは、`/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.
#
ClusterName=slurm-cluster
SlurmctldHost=controller-node
#
MailProg=/bin/mail
#MpiDefault=
#MpiParams=ports=#-#
ProctrackType=proctrack/cgroup
ReturnToService=1
SlurmctldPidFile=/var/run/slurmctld.pid
#SlurmctldPort=6817
SlurmdPidFile=/var/run/slurmd.pid
#SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
#SlurmdUser=root
StateSaveLocation=/var/spool/slurmctld
#SwitchType=
TaskPlugin=task/affinity,task/cgroup
#
#
# TIMERS
#KillWait=30
#MinJobAge=300
#SlurmctldTimeout=120
#SlurmdTimeout=300
#
#
# SCHEDULING
SchedulerType=sched/backfill
SelectType=select/cons_tres
#
#
# LOGGING AND ACCOUNTING
#AccountingStorageType=
#JobAcctGatherFrequency=30
#JobAcctGatherType=
#SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurmctld.log
#SlurmdDebug=info
SlurmdLogFile=/var/log/slurmd.log
#
# AUTHENTICATION
AuthType = auth/munge
CredType = cred/munge
#
# COMPUTE NODES
NodeName=compute-node-01 CPUs=2 State=UNKNOWN
NodeName=compute-node-02 CPUs=2 State=UNKNOWN
PartitionName=debug Nodes=ALL Default=YES MaxTime=INFINITE State=UP
```
いくつの項目をピックアップして説明します。
* `SlurmctldHost`: 管理ノードのホスト名を記載します。
* `AuthType`: Slurmの認証方式です。
* `CredType`: 認証で使用する鍵ファイルの種類です。
* `NodeName`: 計算ノードのホスト名を記載します。続くCPUsは実際のHWに合わせて記載します。(※1)
* `PartitionName`: パーティション（計算ノードのグループ）の名前です。パーティションに追加する計算ノードを`Nodes`に記載します。

※1: 管理ノードと計算ノードで名前解決できる必要があります。`/etc/hosts`に記載するなど環境に合わせて対応してください。

### 6. slurmのデーモン化

サーバー起動時にサービスが起動するようにします。
```
$ cd ~/slurm-24.05.3
$ sudo cp /etc/slurmctld.service /etc/systemd/system
$ sudo systemctl enable slurmctld.service
```

### 7. slurmユーザーの作成
slurmユーザーを作成して、sudoグループへの追加とsyslogグループへの追加をします。
```
$ sudo adduser slurm
$ sudo gpasswd -a slurm sudo
$ sudo usermod -aG syslog slurm
```

### 8. 必要なディレクトリの作成と権限変更
```
$ sudo mkdir -p /var/spool/slurmctld
$ sudo chown -R slurm:slurm /var/spool/slurmctld
$ sudo chmod -R 750 /var/spool/slurmctld
$ sudo chown slurm:slurm /usr/local/etc/slurm.conf
$ sudo chmod 644 /usr/local/etc/slurm.conf
```

### 9. slurmctldの起動
```
$ sudo systemctl start slurmctld
$ sudo systemctl status slurmctld
```
ステータスが`Active: active (running)`になっていたらOKです。
```
● slurmctld.service - Slurm controller daemon
     Loaded: loaded (/etc/systemd/system/slurmctld.service; disabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-11-29 02:42:36 UTC; 6s ago
   Main PID: 86552 (slurmctld)
      Tasks: 14 (limit: 4680)
     Memory: 4.3M
     CGroup: /system.slice/slurmctld.service
             ├─86552 /usr/local/sbin/slurmctld --systemd
             └─86554 slurmctld: slurmscriptd
```

管理ノード側のセットアップはひとまずここまでです。

# 計算ノードのセットアップ
続いて計算ノードのセットアップ手順を記載します。

### 1. 関連パッケージのインストール
まずは、aptを更新します。
```
$ sudo apt update
```
続いて、パッケージをインストールします。
Postfixの設定が出るため必要に応じて設定してください。
```
$ sudo apt install -y build-essential mailutils libdbus-1-dev
```

### 2. mungeのインストール
同様にインストールします。
```
$ sudo apt install -y munge libmunge-dev
```

### 3. mungeの鍵ファイル生成
管理ノードで生成した鍵ファイルと同じものを配置する必要があります。
今回は、scpを使用して管理ノードから計算ノードにコピーすることにします。
#### 管理ノードで実行するコマンド
```
$ sudo scp /etc/munge/munge.key compute-node-01:/etc/munge/
```

#### 計算ノードで実行するコマンド
```
$ sudo chown munge:munge /etc/munge/munge.key
$ sudo chmod 400 /etc/munge/munge.key
$ sudo systemctld restart munge
```

### 4. slurmのインストール
同様にインストールします。
```
$ cd ~
$ wget https://download.schedmd.com/slurm/slurm-24.05.3.tar.bz2
```
ダウンロードしたファイルを展開します。
```
$ tar -jxvf slurm-24.05.3.tar.bz2
$ cd ~/slurm-24.05.3
```
Slurmをインストールします。
```
$ ./configure
$ make
$ sudo make install
```

### 5. slurmの設定ファイル作成
mungeの鍵ファイル同様にこちらも管理ノードで作成した設定ファイルと同じものを計算ノードに配置する必要があります。
こちらも今回はscpを使用してコピーします。

#### 管理ノードで実行するコマンド
```
$ sudo scp /usr/local/etc/slurm.conf compute-node-01:/usr/local/etc
```

#### 計算ノードで実行するコマンド
権限変更は後でまとめて行うため、ここでは実行するコマンドはありません。

### 6. slurmのデーモン化

サーバー起動時にサービスが起動するようにします。
```
$ cd ~/slurm-24.05.3
$ sudo cp /etc/slurmd.service /etc/systemd/system
$ sudo systemctl enable slurmd.service
```

### 7. slurmユーザーの作成
slurmユーザーを作成して、sudoグループへの追加とsyslogグループへの追加をします。
```
$ sudo adduser slurm
$ sudo gpasswd -a slurm sudo
$ sudo usermod -aG syslog slurm
```
ここで作成したslurmユーザーのUIDと管理ノードのUIDが同じである必要があります。
管理ノードと計算ノードで次のコマンドを実行することでslurmユーザーのUIDを確認できます。
```
$ sudo cat /etc/passwd | awk -F ':' '{printf "%4s" " " "%-20s\n", $3, $1}'| sort -n
```
UIDが異なっていた場合は、計算ノードで次のコマンドを実行し、UIDを変更します。
```
$ sudo usermod -u [管理ノードのslurmユーザーのUID] slurm
```

### 8. 必要なディレクトリの作成と権限変更
```
$ sudo mkdir -p /var/spool/slurmd
$ sudo chown -R slurm:slurm /var/spool/slurmd
$ sudo chmod -R 750 /var/spool/slurmd
$ sudo chown slurm:slurm /usr/local/etc/slurm.conf
$ sudo chmod 644 /usr/local/etc/slurm.conf
```

### 9. slurmctldの起動
```
$ sudo systemctl start slurmd
$ sudo systemctl status slurmd
```
ステータスが`Active: active (running)`になっていたらOKです。
```
● slurmd.service - Slurm node daemon
     Loaded: loaded (/etc/systemd/system/slurmd.service; disabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-11-29 03:42:36 UTC; 6s ago
   Main PID: 86553 (slurmd)
      Tasks: 1 (limit: 4680)
     Memory: 2.2M
     CGroup: /system.slice/slurmd.service
             └─86553 /usr/local/sbin/slurmd --systemd
```

以上で、管理ノードと計算ノードのセットアップが完了です。

# まとめ
今回は、Slurmのセットアップ手順と注意点を記載しました。
鍵ファイルや設定ファイルがそれぞれのノードで内容が異なっていたり、計算ノードのリソースが実際のHWと異なる記載になっている場合はエラーになりますのでご注意ください。
次回は、このセットアップした環境でジョブを実行する手順と注意点について記載いたします。

次回の記事もお楽しみに！

## おしらせ

弊社X（旧：Twitter）では、Qiita投稿に関する情報や各種セミナー情報をお届けしております。情報収集や学びの場を求める皆さん！ぜひフォローしていただき、最新情報を手に入れてください😄

https://x.com/kccs_digital