大事な事っぽい事
- 管理ノードと計算ノードのslurmのバージョンはほぼ同じで 確かめてないけどメジャーバージョンが合っていればいいはず
- 計算ノーへの通信があるようで firewall が有効ならportを開けておく
- GPUノードの場合は /dev/nvidiaX を使うので「persistence mode」を有効にしておく
- mungeアカウントは各計算ノードで作る nis/ldap/adらの外部由来だとboot時に/run/mungeが消されてエラーになるっぽい
- 計算ノードの/etc/hostsに自ノードと管理ノードは入れて置いた方がいいかも
っで各計算ノード毎(OS毎)の構築
n1: ubuntu 20.04 †
ubuntu20.04はOS提供のパッケージがある. がだこのパッケージのversionは 19.05.5 でもし管理ノード(22.05.7)に繋ぐとエラーになる
slurmctld側(管理ノード)では「error: unpack_header: protocol_version 8704 not supported」と表記され
slurmd側(計算ノード)では「Unable to register: Zero Bytes were transmitted or received」と表記される
なのでソースから作る.
まずはGPUの制御のために「cuda-nvml-dev」を入れます. nvidiaドライバは登録済みですNVIDIA参照
root@n1:~# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.5 LTS (Focal Fossa)"
:
root@n1:~# cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 525.60.11 Wed Nov 23 23:04:03 UTC 2022
GCC version: gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
root@n1:~# nvidia-smi -L
GPU 0: NVIDIA RTX A2000 (UUID: GPU-23cc3ee7-31d3-a068-2f61-5aa00052d084)
root@n1:~# bash ./cuda_12.0.0_525.60.13_linux.run (「cuda-nvml-dev」のみインストール)
その後 munge アカウントを作成してmungeをインストールします. slurm アカウントはnis/ldap/ad 由来でも可
root@n1:~# groupadd -g 5001 munge && useradd -d /var/lib/munge -s /bin/bash -u 5001 -g munge munge
root@n1:~# apt install munge
あとはslurmをソースから作ります
root@n1:~# apt install build-essential libmunge-dev libpam-dev libcgroup-dev libpam-cgroup \
libhwloc-dev libpmix-dev libdbus-1-dev
root@n1:~# tar xf slurm-22.05.7.tar.bz2
root@n1:~# cd slurm-22.05.7/
root@n1:~/slurm-22.05.7# ./configure --prefix=/opt/slurm --sysconfdir=/opt/slurm/etc --disable-x11 --disable-selinux \
--enable-pam --with-hdf5=no --without-ucx --without-ofed --with-nvml=/usr/local/cuda-12.0
root@n1:~/slurm-22.05.7# make -j 20; make install
(インストール後の微調整)
mkdir /opt/slurm/etc
mkdir -p /var/spool/slurm/d
echo "D /run/slurm 0755 root root -" > /usr/lib/tmpfiles.d/slurm.conf
/usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/slurm.conf
echo "export PATH=${PATH}:/opt/slurm/bin" > /etc/profile.d/slurm.sh
cp ./slurm-22.05.7/etc/slurmd.service /usr/lib/systemd/system/
systemctl daemon-reload
root@n1:~# /opt/slurm/sbin/slurmd -C
NodeName=n1 CPUs=1 Boards=1 SocketsPerBoard=1 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=16001 -> この内容を管理ノードのslurm.confに加える
UpTime=0-00:13:55
root@n1:~#
(管理ノードから)
[root@slurm ~]# scp /opt/slurm/etc/*.conf n1:/opt/slurm/etc/
[root@slurm ~]# scp /etc/munge/munge.key n1:/etc/munge/
(デーモン起動)
root@n1:~# chown -R munge. /etc/munge/
root@n1:~# systemctl enable slurmd munge --now
管理ノードで「Configless 」が有効ならslurm/manager#d2a5c73c slurm.conf らのファイル転送は不要
ubuntuには既定でfirewallが設置されていないのでこれで完了
n2: RockyLinux9 †
RockyLinuxはリポジトリにて slurm-22.05.6 を提供している.
GPUカードを載せているのでまずはnvidiaドライバを組み込んでおきます. 参照NVIDIA
その後 munge アカウントを作成してmungeをインストールします. slurm アカウントはnis/ldap/ad 由来でも可
[root@n2 ~]# groupadd -g 5000 slurm && useradd -d /var/lib/slurm -s /sbin/nologin -u 5000 -g slurm slurm
[root@n2 ~]# groupadd -g 5001 munge && useradd -d /var/lib/munge -s /bin/bash -u 5001 -g munge munge
[root@n2 ~]# cat /etc/redhat-release
Rocky Linux release 9.1 (Blue Onyx)
[root@n2 ~]# cat /proc/driver/nvidia/version
NVRM version: NVIDIA UNIX x86_64 Kernel Module 525.60.11 Wed Nov 23 23:04:03 UTC 2022
GCC version: gcc version 11.3.1 20220421 (Red Hat 11.3.1-2) (GCC)
[root@n2 ~]# bash ./cuda_12.0.0_525.60.13_linux.run (「cuda-nvml-dev」のみインストール)
[root@n2 ~]# dnf list --enablerepo=devel,epel slurm-slurmd
Last metadata expiration check: 0:01:32 ago on Wed 21 Dec 2022 03:58:50 AM JST.
Available Packages
slurm-slurmd.x86_64 22.05.6-1.el9 epel
[root@n2 ~]#
しかし、これをインストールしようとするとmailxパッケージが必要と言われエラーになる. mailxパッケージはRockyLinux9には存在しないのに..
また起点が/usrで管理ノードと同じく/opt/slurmにしたかったのでslurm/rpmbuildを参照してパッケージを作り直してみた
(管理ノードにて)
[root@slurm ~]# scp slurm-22.05.7.tar.bz2 n2:
[root@n2 ~]# dnf --enablerepo=devel install munge-devel readline-devel pam-devel perl-ExtUtils-MakeMaker hwloc-devel mariadb-devel pmix-devel freeipmi-devel dbus-devel
[root@n2 ~]# rpmbuild --version
RPM version 4.16.1.3
[root@n2 ~]# vi slurm.rpmmacros
%_prefix /opt/slurm
%_slurm_sysconfdir %{_prefix}/etc
%_with_hwloc 1
%_with_pam 1
%_without_x11 1
%_with_pmix --with-pmix=/usr
%_with_nvml --with-nvml=/usr/local/cuda
%_with_freeipmi --with-freeipmi=/usr
[root@n2 ~]# rpmbuild -ta --load slurm.rpmmacros slurm-22.05.7.tar.bz2
(作ったパッケージをインストール)
[root@n2 ~]# dnf localinstall rpmbuild/RPMS/x86_64/slurm-slurmd-22.05.7-1.el9.x86_64.rpm \
rpmbuild/RPMS/x86_64/slurm-22.05.7-1.el9.x86_64.rpm -> 同時にmungeもインストールされます
(インストール後の微調整)
mkdir /opt/slurm/etc ; mkdir -p /var/spool/slurm/d ; mkdir /run/slurm
echo "export PATH=${PATH}:/opt/slurm/bin" > /etc/profile.d/slurm.sh
[root@n2 ~]# /opt/slurm/sbin/slurmd -C
NodeName=n2 CPUs=2 Boards=1 SocketsPerBoard=2 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=15732 -> この内容を管理ノードのslurm.confに加える
UpTime=0-00:13:31
[root@n2 ~]#
設定ファイルは管理ノードから頂きます
(管理ノードから)
[root@slurm ~]# scp /etc/munge/munge.key n2:/etc/munge/
[root@slurm ~]# scp /opt/slurm/etc/*.conf n2:/opt/slurm/etc/
もし管理ノードで「Configless 」が有効ならslurm/manager#d2a5c73c slurm.conf らのファイル転送は不要
firewall. slurm.confの「SlurmdPort」を開けておく
[root@n2 ~]# firewall-cmd --add-port=6818/tcp --zone=public --permanent
[root@n2 ~]# firewall-cmd --reload
最後にデーモンを起動させます
[root@n2 ~]# chown -R munge. /etc/munge/ ; mkdir /run/munge/ ; chown -R munge. /run/munge/
[root@n2 ~]# /usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/munge.conf
[root@n2 ~]# systemctl enable munge slurmd --now
*nvidia関係は「persistence mode」を有効にした方がいいかも NVIDIA#o13e41e5
n3: ubuntu 22.04 †
ディストリビューター提供のパッケージは 21.08.5 で管理ノードが 22.05.7 なのでこれもソースから作っていく
root@n3:~# cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.1 LTS"
:
root@n3:~# apt search slurmd
:
slurmd/jammy 21.08.5-2ubuntu1 amd64
SLURM compute node daemon
:
root@n3:~#
構築方法は n1 と同じ
あと末端の微調整
apt install munge
mkdir /opt/slurm/etc ; mkdir -p /var/spool/slurm/d ; mkdir /run/slurm
echo "export PATH=${PATH}:/opt/slurm/bin" > /etc/profile.d/slurm.sh
cp slurm-22.05.7/etc/slurmd.service /usr/lib/systemd/system/
systemctl daemon-reload
systemctl enable slurmd munge
root@n3:~# /opt/slurm/sbin/slurmd -C
NodeName=n3 CPUs=4 Boards=1 SocketsPerBoard=4 CoresPerSocket=1 ThreadsPerCore=1 RealMemory=16000 -> この内容を管理ノードのslurm.confに加える
UpTime=0-00:05:15
(管理ノードから)
[root@slurm ~]# scp /etc/munge/munge.key n3:/etc/munge/
[root@slurm ~]# scp /opt/slurm/etc/*.conf n3:/opt/slurm/etc/
最後にデーモンを起動させます
[root@n3 ~]# chown -R munge. /etc/munge/ ; mkdir /run/munge/ ; chown -R munge. /run/munge/
[root@n3 ~]# echo "d /run/munge 0755 munge munge" > /usr/lib/tmpfiles.d/munge.conf
[root@n3 ~]# /usr/bin/systemd-tmpfiles --create /usr/lib/tmpfiles.d/munge.conf
[root@n3 ~]# systemctl enable munge slurmd --now
メモ †
考えるに、、、slurm.confの共通が求められるって計算ノードはdisklessClusterを念頭にしているような..
rshは不要.
しかも ssh ログインもroot以外要で構わない.
[root@n1 ~]# vi /etc/ssh/sshd_config
:
:
AllowUsers root
[root@n1 ~]#
[root@n1 ~]# systemctl restart sshd
メモ †
- 下記のようなメッセージがでるのは単に「cgroup.conf」を用意していないから
slurmd: CPU frequency setting not configured for this node
slurmd: error: cgroup namespace 'freezer' not mounted. aborting
slurmd: error: unable to create freezer cgroup namespace
slurmd: error: Couldn't load specified plugin name for proctrack/cgroup: Plugin init() callback failed
slurmd: error: cannot create proctrack context for proctrack/cgroup
slurmd: error: slurmd initialization failed
- 下記文言が表示される
slurmd[73076]: fatal: Unable to determine this slurmd's NodeName
「slurm.conf」のクラスター構成メンツに「NodeName=<ホスト名>」が載ってないだけ
- 下記文言が表示される
Unable to register: Zero Bytes were transmitted or received
管理ノードと計算ノードのmungeのUID/GIDが異なる. mungeを止めて、munge.keyを再度コピーし直す.
- 計算ノードで下記エラーが出たなら
slurmd: error: Couldn't find the specified plugin name for cgroup/v2 looking at all files
slurmd: error: cannot find cgroup plugin for cgroup/v2
slurmd: error: cannot create cgroup context for cgroup/v2
slurmd: error: Unable to initialize cgroup plugin
これは製作中にdbus-glib-devel(RHEL系)、libdbus-1-dev(Ubuntu)を入れていないため
- 下記文言が表示される
slurmd: error: resolve_ctls_from_dns_srv: res_nsearch error: Unknown host
slurmd: error: fetch_config: DNS SRV lookup failed
slurmd: error: _establish_configuration: failed to load configs
slurmd: error: slurmd initialization failed
slurmd.confがないっぽい
- sinfoで「down*」となる
計算ノードの/etc/hostsとか管理ノード、計算ノードの名前解決を試す
あるいは「/usr/lib/systemd/system/slurmd.service」の「After=」に名前解決のサービスを入れる(ypbind.serviceとか) でも、、やっぱり/etc/hostsに自ホストとslurm管理ノードは入れて置くべきかな
- GPUノードは「persistence mode」を有効にした方がいいかも
理由は起動とともに「/dev/nvidia0」を有効にさせるために. 「persistence mode」の設定は NVIDIA#o13e41e5
あと、「/usr/lib/systemd/system/slurmd.service」の「After=」に「nvidia-persistenced.service」を入れる