はじめに
1 Intro
こんにちは、今年の4月から研究室配属になった新B4の学生です。
研究室内で学習環境を整備し、GPUクラスタとジョブスケジューラを構築することになったが、ネット上の情報が少なく、参考にしづらかったです。したがってこの記事ではジョブスケジューラであるSlurm、NFS、LDAPを用いたGPUクラスタの構築手順を自分の試行錯誤経験をベースに紹介して行きたいです。
初心者で恐縮だが、もしなにか不備あったら教えてくれるとありがたい。
2. 構成
使用する構成:
- OS: Ubuntu 24.04 LTS
- GPU: RTX3080, RTX3060
ネットワーク環境:
- mDNSによるネットワーク内の各ノード間の通信すでに行っている
Slurmの構築
1. インストール
1.1 Slurm
Slurmにはコントローラー用、計算ノード用など複数種類の実行ファイルが用意されているが、インストールは主に2つの方法がある:
- ソースコードからビルドする
-
apt
を使用して、パッケージとしてインストールする
ソースコードからビルドする場合は次の記事を参考にしてください。
今回の場合はパッケージからインストールする。
sudo apt install slurm-wlm
apt
を使用してコントローラーノードと計算ノードの両方にインストールする必要がある。
1.2 munge
mungeはノード間通信の認証のためのパッケージであり、同様にapt
でインストールする。
sudo apt install munge libmunge-dev
2 設定
2.1 mungeのkey 作成
mungeはノード間での通信の検証を行うためには共通のkeyを全ノード間で持つ必要がある。従って、mungeのkeyを生成し、他のノードになんかしらの方法で送信する必要がある。
sudo /usr/sbin/create-munge-key
sudo ls -la /etc/munge
次のmunge.key
があればOK
-r--------. 1 munge munge 1024 Nov 24 14:34 munge.key
すべてのノードに同じkeyをコピーする必要がある
sudo scp /etc/munge/munge.key [your_node_username]@[your_node_ip]:/etc/munge
2.2 munge userのuidの統一
全ノードのmunge userのuidを統一する必要がある
全ノード間では、mungeのuidとgidを統一する必要があるので、slurm controllerとなるノードに合わせることをおすすめする。今回は990
で統一する。
sudo su
systemctl stop munge #mungeを一時的に止める
groupmod -g 990 munge #mungeのuid gidを変更
usermod -u 990 -g 990 munge
chown -R munge:munge /etc/munge /var/lib/munge /var/log/munge #mungeと関連あるディレクトリの権限を変更
systemctl daemon-reload #daemon processのmungeを再起動
systemctl start munge
2.3 slurm userのuidの統一
全ノードのslurm userのuidを統一する必要がある
slurmも同じく全ノード間のuidとgidを揃える必要がある。今回は64030にする
systemctl stop slurmctld #計算ノードの場合は slurmd
groupmod -g 64030 slurm
usermod -u 64030 -g 64030 slurm
systemctl daemon-reload #daemon processのslurmctldを再起動
systemctl start slurmctld
2.4 slurm.confの設定
slurm.confの設定内容が多く、項目が煩雑なので、今回の記事では重要な項目についてのみ説明する。slurm公式はにはslurm.confを作成するためのツールがあり、次となる。
作成したslurm.confはおそらくコメントが多いと思うが、ここでコメントされていない項目について羅列する
# 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=your-cluster-name
SlurmctldHost=you-controller-name
SlurmctldParameters=enable_configless #重要!
GresTypes=gpu #gpu
ProctrackType=proctrack/cgroup
ReturnToService=1
SlurmctldPidFile=/run/slurm/slurmctld.pid
SlurmctldPort=6817
SlurmdPidFile=/run/slurm/slurmd.pid
SlurmdPort=6818
SlurmdSpoolDir=/var/spool/slurmd
SlurmUser=slurm
SlurmdUser=root
StateSaveLocation=/var/spool/slurmctld
InactiveLimit=0
KillWait=30
MinJobAge=300
SlurmctldTimeout=120
SlurmdTimeout=300
Waittime=0
#
#
# SCHEDULING
SchedulerType=sched/backfill
SelectType=select/cons_tres
#
# LOGGING AND ACCOUNTING
JobCompType=jobcomp/none
JobAcctGatherFrequency=30
#JobAcctGatherType=
SlurmctldDebug=info
SlurmctldLogFile=/var/log/slurm/slurmctld.log
SlurmdDebug=info
SlurmdLogFile=/var/log/slurm/slurmd.log
ここで特に重要な項目として挙げられるのは:
- SlurmctldParameters=enable_configless
- SlurmctldHost=you-controller-name
- GresTypes=gpu
- SlurmdUser=root
- SlurmdLogFile,SlurmctldLogFile
1. configless モード
まずはconfigless
ですが、従来のslurm.conf
はすべてのノードに配置する必要があったが、このenable_configless
を使用することで、コントローラーに配置するだけで済ませるので、configlessモードを使用すると、slurm.conf
に変更があったときにとても手間が減る。
2. SlurmctldHost
SlurmctldHostはコントローラーのホスト名となり、
hostname -s
で確認できる。
3. GresTypes
gpuクラスタを構築するために、計算資源をgpuとして指定する必要がある。
ただし、gpu使用するには、gpuの情報を入力する必要があるため、ノード間の通信の確認が終わるまで書かないほうがいい
4. logファイルの保存
SlurmdLogFile、SlurmctldLogFileはSlurmの動作そして設定中のログの確認のためのファイルであり、構築時のエラーメッセージが非常に重要である。この項目を上記のパスのように設定し、そのパスにあるディレクトリのuserと権限を変更を忘れないでください
sudo chown -R slurm:slurm /var/log/slurm
5. SlurmdUser
計算ノードで計算した結果を書き込む場合に権限周りがめんどくさいため、rootに指定すると無難である。
最後に
この記事では、slurmによるgpuクラスタを構築するための最初の設定の説明を行った。次の記事では、
-
slurm.conf
の配置の残りの説明 - 計算ノード
slurmd.service
の設定内容 - ノード間通信は正常に行ってるか確認するための方法
について述べる予定。
参考文献