Skip to content

Slurm安装 old

Slurm 安装

依赖安装

apt-get install libmunge-dev libmariadb-dev libpam0g-dev libcgroup-dev libhwloc-dev build-essential fakeroot devscripts equivs

munge 安装

在新服务器上安装 munge

# 安装 munge
apt update; apt install munge
# 将 master 节点的 root 用户的公钥复制到计算节点 `${node}` 的 root 用户的 authorized_keys 中。
cat XXXX >> /root/.ssh/authorized_keys # 将 master 节点 ada-709 的公钥复制进新服务器

在 masker 节点 ada-709 中的 /etc/hosts 文件中添加新服务器的 ip 和 hostname。然后在 master 节点(ada-709)上将 munge.key 传给新服务器:

scp /etc/munge/munge.key ${node}:/etc/munge/ # 通过 ssh 传输 munge 密钥

然后切换到新节点上,运行:

chown munge. /etc/munge/munge.key  # 修改权限
systemctl enable --now munge # 设置 munge 开机自启动
systemctl restart munge # 重新启动服务

可在 master 节点(ada-709)上验证 munge 是否配置成功:

munge -n -t 10 | ssh ${node} unmunge
ssh ${node}  munge -n -t 10 | unmunge

若上述命令的输出中包含 STATUS: Success (0),则说明配置成功

Slurm 安装

曾尝试过在新服务器上使用不同于 ada-709 的 slurm 版本 22.05 的 slurmd,但失败了。

  1. 如果使用 slurm 21.xx,会发现这个版本的 slurm 不支持 cgroup v2,但自从 ubuntu 22.04 后,apt 安装的 cgroup 为 v2,如果非要使用这个版本的 slurm,只能强制给 cgroup 降级,但不到万不得已不建议降级。

  2. 如果使用 slurm 23.xx,会发现消息格式不兼容,如下是报错内容:

image-20240709232234340

image-20240709232312408

因此,为了保证可用性,建议在新服务器上源码安装和 ada-709 一致的 slurm —— 22.05.4。

首先,在新服务器上,将源码下载到本地:

cd ~
wget https://download.schedmd.com/slurm/slurm-22.05.4.tar.bz2
mkdir -p /opt/slurm/22.05.4
apt update; apt install bzip2
tar -xaf slurm-22.05.4.tar.bz2; rm slurm-22.05.4.tar.bz2

编译源码

apt install libdbus-1-dev  # 缺少这个包,否则 make cgroup_v2.so 会报错,必须在 ./cofigure 命令之前安装好
cd ~/slurm-22.05.4
./configure  --prefix=/opt/slurm/22.05.4/ # --plugindir=/opt/slurm/
cd /opt/slurm/22.05.4/src/plugins/cgroup/v2; make -j
cd /opt/slurm/22.05.4/src/plugins/cgroup; make install -j
rm ~/slurm-22.05.4 # 删除源码

为 slurm 添加用户

groupadd slurm -g 64030
useradd slurm -g 64030 -u 64030 -d /nonexistent -s /usr/sbin/nologin

添加环境变量配置文件 /etc/profile.d/slurm.sh,内容如下:

export SLURM_HOME=/opt/slurm/22.05.4
export PATH=$SLURM_HOME/bin:$SLURM_HOME/sbin:$PATH

保存以后,退出重新登录,或者运行 source /etc/profile.d/slurm.sh,以使得配置生效。运行 slurmd -C 查看该节点资源信息,例如,ada-A100 的资源信息如下:

NodeName=ada-A100 CPUs=24 Boards=1 SocketsPerBoard=1 CoresPerSocket=12 ThreadsPerCore=2 RealMemory=257232

添加 /etc/systemd/system/slurmd.service 文件,内容如下:

[Unit]
Description=Slurm node daemon
After=munge.service network-online.target remote-fs.target
Wants=network-online.target

[Service]
Type=simple
EnvronmentFile=-/etc/default/slurmd
ExecStart=/opt/slurm/22.05.4/sbin/slurmd --conf-server ada-709:6817 -D -s $SLURMD_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
LimitNOFILE=131072
LimitMEMLOCK=infinity
LimitSTACK=infinity
Delegate=yes
TasksMax=infinity

[Install]
WantedBy=multi-user.target

设置 slurmd 开机自启动,并开启 slurmd 服务:

systemctl daemon-reload; 
systemctl enable --now slurmd

然后切换到 master 节点(ada-709)修改 slurm 配置文件:

  • /opt/slurm/22.05.4/etc/gres.conf 中添加新节点的 GPU 资源信息,例如,ada-A100 信息如下:
NodeName=ada-A100  Name=gpu Type=a100 File=/dev/nvidia[0-1]
  • /opt/slurm/22.05.4/etc/gres.conf 中添加新节点的信息,需要进行的配置如下:

  • 添加节点信息,例如,ada-A100 信息如下:

    NodeName=ada-A100 NodeAddr=ada-A100 CPUs=24 RealMemory=257231 Sockets=1 CoresPerSocket=12 ThreadsPerCore=2 Gres=gpu:a100:2 State=UNKNOWN
    
  • 添加 Partition 信息,例如,ada-A100 对应的 partition 信息如下:

    PartitionName=a100 Nodes=ada-A100 Default=YES MaxTime=INFINITE State=UP
    

配置完成后,重启 slurmctl

systemctl restart slurmctld.service

若采用无配置(Configless)模式,只用在管理节点放置配置文件,而计算节点无需配置文件。若要启用无配置模式,需要在 slurm.conf 中添加 SlurmctldParameters=enable_configless,并重启 slurmctld

Pyxis 安装

安装 enroot

如下安装过程适用于 Debian-based 的发行版,若是其他 Linux 系统,请查看:enroot Installation

安装 build 依赖,并 clone enroot 仓库:

sudo apt install -y git gcc make libcap2-bin libtool automake libmd-dev
cd /opt/
git clone --recurse-submodules https://github.com/NVIDIA/enroot.git

安装运行时依赖

sudo apt install -y curl gawk jq squashfs-tools parallel
sudo apt install -y fuse-overlayfs libnvidia-container-tools pigz squashfuse # optional

若要安装 optinal,若报 E: Unable to locate package libnvidia-container-tools 的错误,请按如下方法解决:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvicadia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update 

修改 /opt/enroot/conf/enroot.conf 文件,添加如下变量配置:(很重要,否则 pyxis 默认会在 /run/user/<uid/ 下放置 enroot 文件,但是 /run/user/<uid/ 这个目录是用户登录时由 systemd 创建的,slurm 并不走这套流程,导致 pyxis 在尝试创建 /run/user/<uid/ 时 permission deny)

ENROOT_RUNTIME_PATH /mnt/<NODE_NAME>/data/enroot/$(id -u)
ENROOT_CACHE_PATH /mnt/<NODE_NAME>/data/enroot/enroot-cache/group-$(id -g)
ENROOT_DATA_PATH /mnt/<NODE_NAME>/data/enroot/enroot-data/user-$(id -u)

编译源码并 install,并允许非特权用户 import images。

cd enroot
sudo make install
sudo make setcap

记得提前创建目录:

mkdir -p /mnt/$NODE_NAME/data/enroot/enroot-cache
mkdir -p /mnt/$NODE_NAME/data/enroot/enroot-data
chmod 777 /mnt/$NODE_NAME/data/enroot /mnt/$NODE_NAME/data/enroot/enroot-cache /mnt/$NODE_NAME/data/enroot/enroot-data

从 ubuntu 23.04 起,需要设置 kernel.apparmor_restrict_unprivileged_userns=0,否则,非特权用户使用 enroot 会发生 permission denied。添加文件 /etc/sysctl.d/50-userns.conf,内容如下:

kernel.apparmor_restrict_unprivin = 0

安装 pyxis

clone pyxis 仓库

cd /opt/
git clone https://github.com/NVIDIA/pyxis.git
cd pyxis

修改 pyxis 中的 Makefile:

# 找到 CFLAGS 的赋值行:
# CFLAGS := -std=gnu11 -O2 -g -Wall -Wunused-variable -fstack-protector-strong -fpic $(CFLAGS) 
# 添加 slurm 安装路径中的 include 到 CFLAGS 中,以便编译器找到 slurm 的 spank.h 头文件:
CFLAGS := -I/opt/slurm/22.05.4/include -std=gnu11 -O2 -g -Wall -Wunused-variable -fstack-protector-strong -fpic $(CFLAGS)

编译安装

sudo make install

若是管理节点:

sudo ln -s /usr/local/share/pyxis/pyxis.conf /etc/slurm/plugstack.conf.d/pyxis.conf

重启服务

sudo systemctl restart slurmd