跟随大型超级计算机(如 NVIDIA DGX SuperPOD )的脚步,本文将引导您完成创建适合您桌面的小型集群的过程。以下是完成该项目的推荐硬件和软件。该小规模集群可用于加速人工智能( AI )和深度学习( DL )工作流的训练和推理,包括使用来自 NVIDIA NGC 目录等来源的容器化环境。
硬件:
- 4 倍 NVIDIA Jetson Xavier NX 开发工具包
- 4x MicroSD 卡( 128GB 以上)
- 1x SD + microSD 读卡器
- 1x (可选) Seeed Studio Jetson Mate Cluster Mini
- 1x (可选) USB-C PD 电源( 90w 以上)
- 1x (可选) USB-C PD 100w 电力电缆
虽然 Seeed Studio Jetson Mate 、 USB-C PD 电源和 USB-C 电缆不是必需的,但在本文中使用了它们,强烈建议将其用于整洁紧凑的桌面集群解决方案。
软件:
有关更多信息,请参阅 NVIDIA Jetson Xavier NX 开发工具包 .
安装
将 JetPack 图像写入 microSD 卡,并执行初始 JetPack 配置步骤:
本文的第一次迭代针对 Slurm 控制节点(slurm-control
)。配置第一个节点后,可以选择为每个模块重复每个步骤,也可以为其他模块克隆第一个 microSD 卡;稍后将对此进行详细介绍。
有关 JetPack 闪烁和初始设置的更多信息,请参阅 Jetson Xavier NX 开发工具包入门 .
在遵循上述入门指南的同时:
- 跳过无线网络设置部分,因为将使用有线连接。
- 选择用户名和密码时,请选择您喜欢的,并在所有节点上保持一致。
- 将计算机名称设置为当前使用的目标节点,第一个是
slurm-control
。 - 当提示选择 Nvpmodel Mode 的值时,选择
MODE_20W_6CORE
以获得最大性能。
刷新并完成《入门指南》后,运行以下命令:
echo "`id -nu` ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/`id -nu` sudo systemctl mask snapd.service apt-daily.service apt-daily-upgrade.service sudo systemctl mask apt-daily.timer apt-daily-upgrade.timer sudo apt update sudo apt upgrade -y sudo apt autoremove -y
禁用 NetworkManager ,启用 systemd networkd ,并配置网络[DHCP]:
sudo systemctl disable NetworkManager.service NetworkManager-wait-online.service NetworkManager-dispatcher.service network-manager.service sudo systemctl mask avahi-daemon sudo systemctl enable systemd-networkd sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf cat << EOF | sudo tee /etc/systemd/network/eth0.network > /dev/null [Match] Name=eth0 [Network] DHCP=ipv4 MulticastDNS=yes [DHCP] UseHostname=false UseDomains=false EOF sudo sed -i "/#MulticastDNS=/c\MulticastDNS=yes" /etc/systemd/resolved.conf sudo sed -i "/#Domains=/c\Domains=local" /etc/systemd/resolved.conf
配置节点主机名:
如果您已经在初始 JetPack 设置中设置了主机名,则可以跳过此步骤。
[slurm-control]
sudo hostnamectl set-hostname slurm-control sudo sed -i "s/127\.0\.1\.1.*/127\.0\.1\.1\t`hostname`/" /etc/hosts
[compute-node]
计算节点应遵循特定的命名约定,以便通过 Slurm 轻松寻址。使用一致标识符,后跟顺序递增的数字(例如, node1 、 node2 等)。在本文中,我建议对计算节点使用nx1
、nx2
和nx3
。但是,您可以选择遵循类似约定的任何内容。
sudo hostnamectl set-hostname nx[1-3] sudo sed -i "s/127\.0\.1\.1.*/127\.0\.1\.1\t`hostname`/" /etc/hosts
为 Munge 和 Slurm 创建用户和组:
sudo groupadd -g 1001 munge sudo useradd -m -c "MUNGE" -d /var/lib/munge -u 1001 -g munge -s /sbin/nologin munge sudo groupadd -g 1002 slurm sudo useradd -m -c "SLURM workload manager" -d /var/lib/slurm -u 1002 -g slurm -s /bin/bash slurm
安装 Munge :
sudo apt install libssl-dev -y git clone https://github.com/dun/munge cd munge ./bootstrap ./configure sudo make install -j6 sudo ldconfig sudo mkdir -m0755 -pv /usr/local/var/run/munge sudo chown -R munge: /usr/local/etc/munge /usr/local/var/run/munge /usr/local/var/log/munge
创建或复制 Munge 加密密钥:
[slurm-control]
sudo -u munge mungekey --verbose
[compute-node]
sudo sftp -s 'sudo /usr/lib/openssh/sftp-server' `id -nu`@slurm-control <<exit get /etc/munge/munge.key /etc/munge exit sudo chown munge: /etc/munge/munge.key
启动 Munge 并测试本地安装:
sudo systemctl enable munge sudo systemctl start munge munge -n | unmunge
预期结果:STATUS: Success (0)
验证 Munge 加密密钥是否从计算节点匹配到 slurm 控件:
[compute-node]
munge -n | ssh slurm-control unmunge
预期结果:STATUS: Success (0)
安装 Slurm ( 20.11.9 ):
cd ~ wget https://download.schedmd.com/slurm/slurm-20.11-latest.tar.bz2 tar -xjvf slurm-20.11-latest.tar.bz2 cd slurm-20.11.9 ./configure --prefix=/usr/local sudo make install -j6
索引 Slurm 共享对象并复制 systemd 服务文件:
sudo ldconfig -n /usr/local/lib/slurm sudo cp etc/*.service /lib/systemd/system
为 Slurm 创建目录并应用权限:
sudo mkdir -pv /usr/local/var/{log,run,spool} /usr/local/var/spool/{slurmctld,slurmd} sudo chown slurm:root /usr/local/var/spool/slurm* sudo chmod 0744 /usr/local/var/spool/slurm*
为所有节点创建 Slurm 配置文件:
对于这一步,您可以按照包含的命令操作,并为集群使用以下配置文件(推荐)。要自定义与 Slurm 相关的变量,请使用 configuration tool 。
cat << EOF | sudo tee /usr/local/etc/slurm.conf > /dev/null #slurm.conf for all nodes# ClusterName=SlurmNX SlurmctldHost=slurm-control MpiDefault=none ProctrackType=proctrack/pgid ReturnToService=2 SlurmctldPidFile=/usr/local/var/run/slurmctld.pid SlurmctldPort=6817 SlurmdPidFile=/usr/local/var/run/slurmd.pid SlurmdPort=6818 SlurmdSpoolDir=/usr/local/var/spool/slurmd SlurmUser=slurm StateSaveLocation=/usr/local/var/spool/slurmctld SwitchType=switch/none InactiveLimit=0 KillWait=30 MinJobAge=300 SlurmctldTimeout=120 SlurmdTimeout=300 Waittime=0 SchedulerType=sched/backfill SelectType=select/cons_tres SelectTypeParameters=CR_Core_Memory JobCompType=jobcomp/none SlurmctldDebug=info SlurmctldLogFile=/usr/local/var/log/slurmctld.log SlurmdDebug=info SlurmdLogFile=/usr/local/var/log/slurmd.log NodeName=nx[1-3] RealMemory=7000 Sockets=1 CoresPerSocket=6 ThreadsPerCore=1 State=UNKNOWN PartitionName=compute Nodes=ALL Default=YES MaxTime=INFINITE State=UP EOF
安装 Enroot 3.3.1 :
cd ~ sudo apt install curl jq parallel zstd -y arch=$(dpkg --print-architecture)curl -fSsL -O https://github.com/NVIDIA/enroot/releases/download/v3.3.1/enroot_3.3.1-1_${arch}.deb sudo dpkg -i enroot_3.3.1-1_${arch}.deb
安装 Pyxis ( 0.13 ):
git clone https://github.com/NVIDIA/pyxis cd pyxis sudo make install -j6
创建 Pyxis 插件目录和配置文件:
sudo mkdir /usr/local/etc/plugstack.conf.d echo "include /usr/local/etc/plugstack.conf.d/*" | sudo tee /usr/local/etc/plugstack.conf > /dev/null
将 Pyxis 默认配置文件链接到插件目录:
sudo ln -s /usr/local/share/pyxis/pyxis.conf /usr/local/etc/plugstack.conf.d/pyxis.conf
验证 Enroot / Pyxis 安装成功:
srun --help | grep container-image
预期结果:--container-image=[USER@][REGISTRY#]IMAGE[:TAG]|PATH
定稿
在其余节点上复制配置时,用分配的节点名和/或 microSD 卡标记 JetsonNX 模块。这有助于防止以后在移动模块或卡时出现混淆。
有两种不同的方法可以将安装复制到其余模块:手动配置或克隆 slurm 控制。仔细阅读这两种方法,然后选择你喜欢的方法。
手动配置其余节点
对于当前模块,请遵循下面的“启用并启动 Slurm 服务守护进程”部分,然后对其余模块重复整个过程 ,跳过 [slurm-control] 下标记的任何步骤。所有模块完全配置后,将其安装到各自插槽中的 Jetson 配对中,如“将所有 Jetson Xavier NX 模块安装到机柜”部分所述。
为其余节点安装克隆 slurm 控制
为了避免对每个节点重复所有安装步骤,请将slurm-control
节点的卡克隆为基本图像,并将其闪存到所有剩余的卡上。如果您只有一个多端口读卡器,并且希望进行卡到卡的克隆,则需要 microSD 到 SD 卡适配器。或者,也可以从源slurm-control
卡在本地机器上创建图像文件,然后闪烁目标卡。
- 关闭您正在使用的 Jetson ,从模块中取出 microSD 卡,然后将其插入读卡器。
- 如果您正在执行物理卡到卡克隆(使用 Balena Etcher 、 dd 或任何其他将逐扇区写入的实用程序),请将空白目标 microSD 插入 SD 卡适配器,然后将其插入读卡器。
- 识别您正在使用的应用程序中的源( microSD )和目标( SD 卡)的对应卡,然后开始克隆过程。
- 如果要创建图像文件,请使用您选择的实用程序,从本地机器上的
slurm-control
microSD 卡创建一个图像文件,然后取出该卡,并使用该图像闪烁其余空白卡。 - 克隆完成后,将克隆卡插入 Jetson 模块并通电。配置计算节点的节点主机名,然后继续启用并启动 Slurm 服务守护进程。对所有剩余的卡/模块对重复此过程。
启用并启动 Slurm 服务守护进程:
[slurm-control]
sudo systemctl enable slurmctld sudo systemctl start slurmctld
[compute-node]
sudo systemctl enable slurmd sudo systemctl start slurmd
将所有 Jetson Xavier NX 模块安装到机柜中
首先关闭所有正在运行的模块的电源,然后将其从托架上卸下。将所有 Jetson 模块安装到 Seeed Studio Jetson Mate 中,确保控制节点放置在标记为“ MASTER ”的主插槽中,计算节点 1-3 分别放置在标记为“ WORKE 1 、 2 和 3 ”的辅助插槽中。每个模块的 Jetson 配对套件中都有可选的风扇延长电缆。
机柜上的视频输出连接到主模块插槽,垂直 USB2 端口和 USB3 端口 1 也是如此。所有其他 USB 端口根据其各自的端口号连接到其他模块。
故障排除
本节包含一些有用的命令,用于帮助解决常见网络和 Slurm 相关问题。
测试网络配置和连接
以下命令应在routable
状态下显示eth0
,并从 DHCP 服务器获取 IP 地址信息:
networkctl status
该命令应以本地节点的主机名和响应。本地作为域(例如slurm-control.local
),以及 DHCP 分配的 IP 地址:
host `hostname`
选择已配置并联机的计算节点主机名。它应该类似地响应上一个命令。例如:主机 nx1 – nx1 。本地 has 地址为 192.168.0.1 。这也适用于在局域网上运行 mDNS 解析器守护进程的任何其他主机。
host [compute-node-hostname]
所有集群节点都应该可以被所有其他节点 ping ,所有本地 LAN IP 地址也应该可以 ping ,例如路由器。
ping [compute-node-hostname/local-network-host/ip]
测试外部 DNS 名称解析并确认到 internet 的路由功能正常:
ping www.nvidia.com
检查 Slurm 群集状态和节点通信
以下命令显示集群的当前状态,包括节点状态:
sinfo -lNe
如果sinfo
输出中的任何节点显示其状态未知或关闭,则以下命令向指定节点发出信号,以更改其状态并可用于作业调度([]在主机名“ nx ”后指定一个数字范围):
scontrol update NodeName=hostname[1-3] State=RESUME
以下命令在所有可用的计算节点上运行hostname
。节点应在控制台中使用其相应的主机名进行响应。
srun -N3 hostname
总结
现在,您已经成功构建了一个适合您的桌面的多节点 Slurm 集群。现在,您可以在迷你集群上运行大量基准测试、项目、工作负载和容器。欢迎在这篇帖子上分享您的反馈,当然,也可以分享您的新集群正在用于的任何内容。
打开电源,享受 Slurm !
有关更多信息,请参阅以下参考资料:
致谢
特别感谢我们团队的技术营销工程师 Robert Sohigian ,他在创建此帖子时提供了指导,提供了关于说明清晰性的反馈,并在构建此集群的多次运行中担任了实验鼠。你的反馈是无价的,让这篇文章成为了现实!