はじめに
Slurmは科学技術計算などでジョブ管理ツールとして使われるサービスです。スパコンなどでも使われています。無料です。人数が多い研究室や、クラスターでMPI並列したい人などにお薦めですが、インストール作業は苦行。
せめてもの助けになればと思い、自分向けノートを公開します。
主な手順
- Mungeのインストール
- Slurmのインストール
注意点
管理サーバー兼フロントシステムとなる管理ノードgw
と、子ノードとしてぶら下がり計算を担当する計算ノードnode01
があるとする。基本的には管理ノードが一つ、計算ノードが複数あることになる。今回のインストール作業では、管理ノードと計算ノードで行うことが異なるため、間違えないように。
以下の例ではインストール作業の際に、/home/tools/
というディレクトリにrpmを置くなどするが、このディレクトリは管理ノードと計算ノードでNFSなどで共有されていることにする。 NFS等が張れない場合は、何らかの手段でファイルをコピーして各ノードに配布すればよい。
1. Mungeのインストール
Mungeのバージョンはmunge-0.5.14
とする。
1.1. 管理ノードへのインストール
mungeを公式サイトから取り寄せて、rpmをビルドする。管理ノードでビルド作業を行う。
cd /home/tools/install/
wget 公式の場所/munge-0.5.14.tar.xz
wget 公式の場所/munge-0.5.14.tar.xz.asc
wget https://github.com/dun.gpg
rpmbuild -tb munge-0.5.14.tar.xz
cp -p /root/rpmbuild/RPMS/x86_64/*.rpm /home/tools/rpm/
管理ノード自身にインストール。鍵の生成。サービス起動。
cd ../rpm
rpm -ivh munge-0.5.14-1.el7.x86_64.rpm munge-devel-0.5.14-1.el7.x86_64.rpm munge-libs-0.5.14-1.el7.x86_64.rpm
#鍵の生成
sudo -u munge /usr/sbin/mungekey -v
sudo systemctl enable munge
sudo systemctl start munge
1.2. 計算ノードへのインストール
インストール。/home/tools/rpm
にアクセスできるものとして、以下を実行。途中、管理ノードからキーをコピーしている。
cd /home/tools/rpm
rpm -ivh munge-0.5.14-1.el7.x86_64.rpm munge-devel-0.5.14-1.el7.x86_64.rpm munge-libs-0.5.14-1.el7.x86_64.rpm
scp -p gw:/etc/munge/munge.key /etc/munge/munge.key
chown munge:munge /etc/munge/munge.key
systemctl enable munge
systemctl start munge
テスト(ノード共通)
インストールが上手く行っていれば、munge
というユーザーおよびグループが作られているはず。
管理ノード、計算ノード、それぞれで以下のコマンドを実行して問題が起こらないか確認。
munge -n |unmunge
また、管理ノードから次のコマンドを発行して、ssh経由で計算ノードnode01
にてmungeを解読できるか確認。
munge -n -t 10 | ssh node01 unmunge
2. Slurmのインストール
Slurmのバージョンはslurm-19.05.5
とする。
2.1 共通作業その1
※ユーザーおよびグループとしてslurm
を作っておく必要があるかもしれない。
2.2. 管理ノードへのインストール
公式からソースを取り寄せてビルド、かつ、インスコ。管理ノードで行う。
cd /home/tools/install
wget https://download.schedmd.com/slurm/slurm-19.05.5.tar.bz2
cd slurm-19.05.5/
./configure
make
make install
サービスを登録する。Mungeは自動で登録してくれるのに、Slurmはやってくれないので以下の手順で行う。。
管理ノードで起動するサービスはslurmctld
とslurmdbd
の二つ。計算ノードとは異なるので注意。まずはサンプルから.service
ファイルをコピーして/etc/systemd/system/
に配置。
cp -p /home/tools/install/slurm-19.05.5/etc/slurmctld.service /etc/systemd/system/
cp -p /home/tools/install/slurm-19.05.5/etc/slurmdbd.service /etc/systemd/system/
ここで、slurmctld.service
の中身は環境に合わせて書き換えます。特に重要なのはConditionPathExists
とPIDFile
。ここで後者の設定値は後述の理由によって/run/slurm/slurmctld.pid
に書き換える。
#slurmctld.serviceの中身
[Unit]
Description=Slurm controller daemon
After=network.target munge.service
ConditionPathExists=/usr/local/etc/slurm.conf #ここも重要
[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/slurmctld
ExecStart=/usr/local/sbin/slurmctld $SLURMCTLD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/slurm/slurmctld.pid #ここだけ書き換えた
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
#slurmdbd.serviceの中身
[Unit]
Description=Slurm DBD accounting daemon
After=network.target munge.service
ConditionPathExists=/usr/local/etc/slurmdbd.conf #ここも重要
[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/slurmdbd
ExecStart=/usr/local/sbin/slurmdbd $SLURMDBD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/slurm/slurmdbd.pid #ここだけ書き換えた
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
/usr/local/etc/slurm.conf
を書き換える。その場所にファイルが無かった場合は、/home/tools/install/slurm-19.05.5/etc/slurm.conf.example
をコピーする。書き換える上で、重要な点としてSlurmdPidFile
の設定値が先のslurmctld.service
のPIDFile
と同じになっていること。その他の設定値はここでは割愛。公式サイトを参照されたし。
#slurm.confの一部
SlurmdPidFile=/run/slurm/slurmd.pid #ここをslurmctld.serviceの設定値と同じにする
似たような内容だが、/usr/local/etc/slurmdbd.conf
を書き換える。その場所にファイルが無かった場合は、/home/tools/install/slurm-19.05.5/etc/slurmdbd.conf.example
をコピーする。書き換える上で、重要な点としてPidFile
の設定値が先のslurmdbd.service
のPIDFile
と同じになっていること。その他の設定値はここでは割愛。公式サイトを参照されたし。
#slurmdbd.confの一部
PidFile=/run/slurm/slurmdbd.pid #ここをslurmdbd.serviceの設定値と同じにする
2.3. 計算ノードへのインストール
管理ノードでコンパイルしたものを使ってインストール。(ただし、インストール場所は/usr/local/sbin/
配下なので、そこをNFS共有マウントするという荒業もアリ。)
cd /home/tools/install
/slurm-19.05.5/
make install
サービスを登録する。計算ノードで起動すべきサービスはslurmd
である。管理ノードとは異なるので注意。サンプルをコピーして/etc/systemd/system/slurmd.service
に配置。
cp -p /home/tools/install/slurm-19.05.5/etc/slurmd.service /etc/systemd/system/
そして、slurmd.service
の中身を書き換える。注意点は管理ノード同様にPIDファイルのパスに関する部分。
#slurmd.serviceの中身
[Unit]
Description=Slurm node daemon
After=munge.service network.target remote-fs.target
ConditionPathExists=/usr/local/etc/slurm.conf #ここも重要
[Service]
Type=forking
EnvironmentFile=-/etc/sysconfig/slurmd
ExecStart=/usr/local/sbin/slurmd $SLURMD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/slurm/slurmd.pid #ここだけ書き換えた
KillMode=process
LimitNOFILE=131072
LimitMEMLOCK=infinity
LimitSTACK=infinity
Delegate=yes
[Install]
WantedBy=multi-user.target
**【重要】**次に、/usr/local/etc/slurm.conf
を管理ノードからコピーする。(ただし、/usr/local/
配下をNFS共有マウントするという荒業もアリ。)
2.4. 共通作業その2
PIDファイルの場所の変更に合わせて、OS起動時に/run/slurm/
ディレクトリを自動生成するスクリプトを登録する。具体的には、/usr/lib/tmpfiles.d/forSlurm.conf
を手動で生成する。
vi /usr/lib/tmpfiles.d/forSlurm.conf
中身は次のようにする。
#forSlurm.confの中身
d /run/slurm 0755 root root -
ここで再起動して実際に/run/slurm/
が作成されることを確認。再起動したくない場合は、サービスを起動する前に手動でこのディレクトリを作っておく必要がある。
次のコマンドで動作時の一時管理ファイル用の場所を作る。ただし、場合によってはインストール時に作られているかもしれないので確認すべし。
mkdir /var/spool/slurm
mkdir /var/spool/slurm/ctld
chmod 775 /var/spool/slurm/ctld
chown -R slurm:slurm /var/spool/slurm
2.5. サービス起動
サービスの起動。以下のコマンドを実行
#管理ノードの場合
systemctl daemon-reload
systemctl enable slurmctld
systemctl enable slurmdbd
systemctl start slurmctld
systemctl start slurmdbd
#計算ノードの場合
systemctl daemon-reload
systemctl enable slurmd
systemctl start slurmd
サービスが起動しない場合は、journalctl -xe
コマンドで理由を調べる。例えばslurm.conf
にノードを登録していないと計算ノードのサービスは立ち上がらない。
PIDファイルの場所を変える理由
上記の設定では、3種類のPIDファイル(そもそもPIDとは?というのは置いておいて)の場所を、/var/run/*.pid
から/run/slurm/*pid
に変更しています。その理由として、どうやらsystemdのバグらしく、前者に置いたものは上手く動かないようです1。
しかし、/run/slurm/
配下にファイルを置くことにしても、/var/run/
および/run/
配下のファイルはOS再起動時に全て消えてしまうという事情があります2。
そこで、/usr/lib/tmpfiles.d/
配下にforSlurm.conf
を作って起動時に/run/slurm
ディレクトリが生成されるようにしています。
その他の注意点
-
色々な設定は
slurm.conf
に書くことになりますが、必ず全ノードで同じ内容になっている必要があります。書き換えたら全ノードへコピーし、全ノードでサービスを再起動しましょう。 -
各ノードの状態は、管理ノードから
sinfo
コマンドで見れます。ここで無事に起動すればidol
状態になるはずですが、稀にdown
のままの時があります(CentOS7では割とよくある)。確実に計算ノードのサービスが立ち上がっている場合は、次のコマンドで状態をidol
に変更してしまって大丈夫です。scontrol update nodename=node01 state=idle
おわりに
Slurmのインストール作業は、毎回トラブってる気がします。本当につらいですね。