在這篇文章中,我將分享我嘗試使用樹(shù)莓派構(gòu)建Slurm高性能計(jì)算集群的經(jīng)歷。一段時(shí)間前,我開(kāi)始使用這個(gè)集群作為測(cè)試平臺(tái),來(lái)創(chuàng)建一個(gè)更大的、支持GPU計(jì)算的高性能計(jì)算集群。我獲得了高性能計(jì)算設(shè)置各個(gè)組件的實(shí)踐經(jīng)驗(yàn),并了解了它們是如何協(xié)同工作的。設(shè)置SLURM組件確實(shí)是其中的主要部分,經(jīng)過(guò)一番研究,我終于成功搭建了自己的高性能計(jì)算集群。由于設(shè)置這臺(tái)機(jī)器非常簡(jiǎn)單,因此它非常適合快速嘗試不同的軟件包和庫(kù),或者調(diào)整集群硬件以查看哪種配置效果最佳。
我們的目標(biāo)是構(gòu)建一個(gè)能夠處理多個(gè)計(jì)算節(jié)點(diǎn)的高性能計(jì)算集群。從頭開(kāi)始創(chuàng)建這樣的系統(tǒng)是一項(xiàng)具有挑戰(zhàn)性的任務(wù),需要一定的專業(yè)知識(shí)。此外,找到一份涵蓋配置Slurm集群所有必要步驟的全面教程相當(dāng)困難,至少根據(jù)我的經(jīng)驗(yàn)是這樣。因此,我希望這份分步指南能對(duì)你構(gòu)建自己的高性能計(jì)算集群集群有所幫助。
概要
本文從對(duì)高性能計(jì)算集群的簡(jiǎn)要介紹開(kāi)始,并強(qiáng)調(diào)了Slurm作為高性能計(jì)算集群系統(tǒng)常用的資源管理器和作業(yè)調(diào)度器的重要性。接下來(lái),我將展示集群網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),討論必要的先決條件、硬件規(guī)格和操作系統(tǒng)設(shè)置。之后,我將指導(dǎo)你完成存儲(chǔ)節(jié)點(diǎn)的設(shè)置。然后,通過(guò)從源代碼構(gòu)建Slurm,在主節(jié)點(diǎn)上安裝和配置它,并添加一個(gè)額外的計(jì)算節(jié)點(diǎn)。最后,我將展示幾個(gè)示例,展示我們構(gòu)建的Slurm集群的狀態(tài)以及如何在其中處理作業(yè)提交。
特性
最終,你將可以擁有自己的高性能計(jì)算集群,需要:
1.Slurm工作負(fù)載管理器
2.集中式網(wǎng)絡(luò)存儲(chǔ)
目前,我專注于最小化特性,以防止這篇文章過(guò)長(zhǎng)。目標(biāo)是首先設(shè)置一個(gè)具有基本功能的高性能計(jì)算集群,但足夠靈活,以便以后進(jìn)行擴(kuò)展。
什么是高性能計(jì)算集群?
高性能計(jì)算集群是由互連的計(jì)算機(jī)組成的網(wǎng)絡(luò),旨在共同解決計(jì)算問(wèn)題并在多個(gè)領(lǐng)域高速處理大型數(shù)據(jù)集。這些集群由多個(gè)計(jì)算節(jié)點(diǎn)組成,每個(gè)節(jié)點(diǎn)都配備了處理器、內(nèi)存,并且通常還配備了專門(mén)的加速器,如GPU,使研究人員和科學(xué)家能夠處理計(jì)算密集型任務(wù)和模擬。
Slurm(簡(jiǎn)單Linux資源管理工具)是一種開(kāi)源的高性能計(jì)算集群作業(yè)調(diào)度器和資源管理器。它在高效分配計(jì)算資源、管理作業(yè)調(diào)度以及協(xié)調(diào)高性能計(jì)算集群上的并行計(jì)算方面發(fā)揮著關(guān)鍵作用。作為Kubernetes集群的替代方案,Slurm專門(mén)用于管理科學(xué)研究中常見(jiàn)的批處理計(jì)算工作負(fù)載、模擬和數(shù)據(jù)分析任務(wù)。而Kubernetes則更側(cè)重于容器化應(yīng)用程序和微服務(wù)。
集群網(wǎng)絡(luò)拓?fù)?/strong>
有多種網(wǎng)絡(luò)拓?fù)淇捎糜谂渲酶咝阅苡?jì)算集群,每種拓?fù)涠坚槍?duì)特定的性能預(yù)期和應(yīng)用需求進(jìn)行了定制。在我們的場(chǎng)景中,我們專注于通過(guò)路由器和交換機(jī)在子網(wǎng)(10.0.0.x)內(nèi)互連三個(gè)樹(shù)莓派。我在路由器上設(shè)置了一個(gè)DHCP服務(wù)器,并保留了IP地址,以便根據(jù)每個(gè)樹(shù)莓派的唯一MAC地址為其分配固定的IP地址。然而,這可以通過(guò)直接在樹(shù)莓派上配置靜態(tài)IP(192.168.0.x)來(lái)簡(jiǎn)化。此外,如果你使用Wi-Fi接入點(diǎn)而不是LAN連接來(lái)通過(guò)家庭ISP路由器互連樹(shù)莓派,則可以繞過(guò)路由器和以太網(wǎng)交換機(jī)的需求。由于此設(shè)置旨在用于測(cè)試集群,并且不需要快速或甚至穩(wěn)定的連接,因此這種替代方案是可行的。此外,通過(guò)將路由器鏈接到家庭ISP Wi-Fi接入點(diǎn)并通過(guò)以太網(wǎng)共享給設(shè)備來(lái)提供互聯(lián)網(wǎng)連接。下圖提供了集群網(wǎng)絡(luò)的視覺(jué)表示:
樹(shù)莓派高性能計(jì)算集群網(wǎng)絡(luò)拓?fù)?/i>
這種網(wǎng)絡(luò)拓?fù)涮峁┝丝梢浦残缘膬?yōu)勢(shì),允許集群輕松連接到不同的接入點(diǎn)。此外,我使用了一個(gè)節(jié)點(diǎn)專門(mén)用于數(shù)據(jù)管理,作為專用的網(wǎng)絡(luò)存儲(chǔ)服務(wù)器。剩下的兩個(gè)樹(shù)莓派一個(gè)用作主節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn),另一個(gè)用作額外的計(jì)算節(jié)點(diǎn)。
先決條件
硬件組件
我使用了三個(gè)閑置了一段時(shí)間的樹(shù)莓派以及其他一些組件,如下所示:
1.樹(shù)莓派4 Model B 2GB板(主機(jī)名rpnode01)
該設(shè)備作為主節(jié)點(diǎn)和計(jì)算節(jié)點(diǎn)。
2.樹(shù)莓派4 Model B 2GB板(主機(jī)名rpnode02)
該設(shè)備作為第二個(gè)計(jì)算節(jié)點(diǎn)。
3.樹(shù)莓派3+ 1GB板(主機(jī)名filenode01)
該設(shè)備設(shè)置為網(wǎng)絡(luò)存儲(chǔ)服務(wù)器。
你需要一個(gè)帶有多個(gè)端口的USB電源充電器,能夠同時(shí)支持多個(gè)樹(shù)莓派的電力需求(每個(gè)樹(shù)莓派至少2A)。
5.路由器和以太網(wǎng)交換機(jī)(可選)
路由器將管理外部連接,而交換機(jī)處理內(nèi)部設(shè)備通信。
樹(shù)莓派集群的照片
操作系統(tǒng)
我使用了Debian bookworm(版本12)OS Lite 64位,它以輕量級(jí)著稱,這對(duì)于像樹(shù)莓派這樣資源有限的系統(tǒng)來(lái)說(shuō)是有益的。預(yù)計(jì)需要對(duì)所有設(shè)備進(jìn)行以下調(diào)整:
1.我使用了默認(rèn)用戶pi,并設(shè)置了測(cè)試密碼testpass。然而,這里還有改進(jìn)的空間,可以利用LDAP或其他認(rèn)證機(jī)制來(lái)保持集群中用戶和組ID的同步。
2.在節(jié)點(diǎn)上啟用SSH訪問(wèn),一種方便的方法是使用SSH密鑰共享來(lái)訪問(wèn)節(jié)點(diǎn)。
3.為CPU和內(nèi)存啟用控制組。通過(guò)修改/boot/firmware/cmdline.txt,添加cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1。更改后重啟系統(tǒng)。
4.將以下主機(jī)名添加到/etc/hosts:
10.0.0.1rpnode01 rpnode01.home.local10.0.0.2rpnode02 rpnode02.home.local10.0.0.3filenode01 filenode01.home.local
5.如果需要,使用以下命令配置語(yǔ)言和區(qū)域設(shè)置:
$sudo raspi-config
6.最后,更新和升級(jí)系統(tǒng)包:
$sudo apt update && sudo apt upgrade
存儲(chǔ)節(jié)點(diǎn)
在高性能計(jì)算集群中,計(jì)算節(jié)點(diǎn)被設(shè)計(jì)為無(wú)狀態(tài)的,這意味著它們不保留任何持久數(shù)據(jù)或狀態(tài)。相反,所有應(yīng)用程序軟件和用戶數(shù)據(jù)都存儲(chǔ)在集中式共享存儲(chǔ)上。這種架構(gòu)提供了幾個(gè)優(yōu)勢(shì)。首先,它通過(guò)簡(jiǎn)化新計(jì)算節(jié)點(diǎn)的添加而無(wú)需在多臺(tái)機(jī)器上復(fù)制數(shù)據(jù)來(lái)增強(qiáng)可擴(kuò)展性。其次,它為用戶提供了靈活性,允許他們從集群中的任何計(jì)算節(jié)點(diǎn)訪問(wèn)其應(yīng)用程序和數(shù)據(jù)。第三,將所有數(shù)據(jù)存儲(chǔ)在集中式存儲(chǔ)節(jié)點(diǎn)上可確保數(shù)據(jù)完整性和一致性,消除了因在單個(gè)計(jì)算節(jié)點(diǎn)上本地存儲(chǔ)數(shù)據(jù)而可能產(chǎn)生的不一致性擔(dān)憂。最后,無(wú)狀態(tài)計(jì)算節(jié)點(diǎn)架構(gòu)簡(jiǎn)化了維護(hù)任務(wù),如軟件更新、硬件更換和故障排除,因?yàn)闊o(wú)需轉(zhuǎn)移或備份計(jì)算節(jié)點(diǎn)上本地存儲(chǔ)的數(shù)據(jù)。
NFS服務(wù)器
我在專用節(jié)點(diǎn)filenode01上設(shè)置了NFS(網(wǎng)絡(luò)文件系統(tǒng))服務(wù)器,以便擁有網(wǎng)絡(luò)存儲(chǔ)。當(dāng)我在高性能計(jì)算集群的上下文中將計(jì)算節(jié)點(diǎn)稱為“無(wú)狀態(tài)”時(shí),我的意思是計(jì)算節(jié)點(diǎn)本身不保留任何持久數(shù)據(jù)。相反,所有用戶主目錄數(shù)據(jù)和應(yīng)用程序軟件都駐留在集中式存儲(chǔ)節(jié)點(diǎn)上。
為此,我使用apt包管理器安裝了NFS服務(wù)器。這可以通過(guò)在終端中運(yùn)行以下命令來(lái)完成:
$sudo apt install nfs-kernel-server
然后,我通過(guò)配置/etc/exports文件來(lái)定義我希望通過(guò)NFS共享的目錄。這是在Unix類操作系統(tǒng)中NFS服務(wù)器使用的配置文件。該文件指定了服務(wù)器上哪些目錄與NFS客戶端共享,并定義了這些目錄的訪問(wèn)權(quán)限。我確保這些文件夾存在,然后使用以下命令添加條目:
$sudomkdir-p /home /nfs
$ sudobash -c"cat >> /etc/exports << EOF/home ?*(rw,sync,no_root_squash,no_subtree_check)/nfs ?*(rw,sync,no_root_squash,no_subtree_check)EOF"
在這里,我使用*來(lái)允許來(lái)自任何節(jié)點(diǎn)的訪問(wèn),并根據(jù)需要指定了選項(xiàng),如rw表示讀寫(xiě)訪問(wèn)。編輯exports文件后,通過(guò)運(yùn)行以下命令應(yīng)用更改:
$sudo exportfs -ra
如果節(jié)點(diǎn)上啟用了防火墻,你可能需要打開(kāi)NFS端口。NFSv4使用TCP和UDP端口2049,而NFSv3使用額外的端口。你可以使用ufw或iptables根據(jù)防火墻配置打開(kāi)這些端口。
我們可以使用showmount來(lái)驗(yàn)證NFS共享是否可用。此命令將顯示節(jié)點(diǎn)上導(dǎo)出的目錄列表。
$ sudo showmount -eExport listforfilenode01:/home */nfs *
NFS客戶端
為了在兩個(gè)NFS客戶端節(jié)點(diǎn)(即rpnode01和rpnode02)上啟用網(wǎng)絡(luò)存儲(chǔ)訪問(wèn),我們可以通過(guò)調(diào)整/etc/fstab文件來(lái)包含NFS掛載點(diǎn)。這是一個(gè)系統(tǒng)文件,允許在系統(tǒng)啟動(dòng)時(shí)自動(dòng)化掛載文件系統(tǒng)。
在更改此文件之前,請(qǐng)?jiān)俅未_保客戶端側(cè)的目錄/home和/nfs存在。執(zhí)行以下命令:
$sudomkdir-p /home /nfs
$ sudobash -c"cat >> /etc/fstab << EOFfilenode01:/home /home nfs defaults 0 0filenode01:/nfs /nfs nfs defaults 0 0EOF"
追加到/etc/fstab的每一行都定義了一個(gè)不同的NFS掛載點(diǎn)。它指示系統(tǒng)將主機(jī)名為filenode01的NFS服務(wù)器上的/home(/nfs)目錄掛載到本地的/home(/nfs)目錄。如前所述,/home用于用戶數(shù)據(jù),而/nfs目錄用于共享軟件棧。重啟節(jié)點(diǎn)。
為了檢查更新的/etc/fstab的正確性,我使用以下命令mount -a。
$ sudo mount -av/nfs : successfully mounted/home : successfully mounted
這會(huì)在系統(tǒng)啟動(dòng)時(shí)讀取/etc/fstab,并掛載尚未掛載的文件系統(tǒng)。
主節(jié)點(diǎn)
構(gòu)建和安裝Slurm
我總是更喜歡從源代碼編譯Slurm,而不是使用預(yù)構(gòu)建的包。這允許定制化,確保訪問(wèn)最新功能和修復(fù),并提供教育價(jià)值。從源代碼構(gòu)建Slurm包并使其準(zhǔn)備安裝的說(shuō)明與此處所述大致相同,但我做了一些更改,下面將進(jìn)行解釋。
1.先決條件庫(kù)
在繼續(xù)配置Slurm之前,請(qǐng)確保已安裝以下庫(kù)或頭文件。你可以通過(guò)apt包管理器輕松安裝它們。
$sudo apt install libpmix-dev libpam-dev libmariadb-dev \ libmunge-dev libdbus-1-dev munge
2.從源代碼構(gòu)建
讓我們從SchedMD的GitHub倉(cāng)庫(kù)下載最新版本的Slurm 23.11(在撰寫(xiě)本文時(shí))。我們將為其構(gòu)建aarch64架構(gòu),而不是x86_64。
https://github.com/SchedMD/slurm/tags
$sudomkdir/opt/slurm &&cd/opt/slurm$sudo wget https://github.com/SchedMD/slurm/archive/refs/tags/slurm-23-11-6-1.tar.gz$sudo tar -xf slurm-23-11-6-1.tar.gz
考慮到我們是從頭開(kāi)始構(gòu)建所有內(nèi)容,編譯Slurm將需要幾分鐘時(shí)間。
$cdslurm-slurm-23-11-6-1$sudo ./configure \ --prefix=/opt/slurm/build \ --sysconfdir=/etc/slurm \ --enable-pam \ --with-pam_dir=/lib/aarch64-linux-gnu/security/ \ --without-shared-libslurm \ --with-pmix$sudo make$sudo make contrib$sudo make install
--prefix選項(xiàng)指定了安裝編譯代碼的基礎(chǔ)目錄。我沒(méi)有直接安裝到/usr,而是將其設(shè)置為/opt/slurm/build。原因是在將Slurm安裝在額外的計(jì)算節(jié)點(diǎn)上時(shí),打算利用它來(lái)創(chuàng)建可安裝的包。
3.構(gòu)建Debian包
我使用了fpm工具來(lái)創(chuàng)建編譯代碼的Debian包。這需要安裝一個(gè)額外的包。
$sudo apt ruby-dev$sudo gem install fpm
此工具將創(chuàng)建一個(gè)包文件slurm-23.11_1.0_arm64.deb。值得一提的是,從Slurm 23.11.0開(kāi)始,Slurm包含了構(gòu)建Debian包所需的文件。
$sudo fpm -s dir -t deb -v1.0-n slurm-23.11--prefix=/usr -C /opt/slurm/build.Createdpackage {:path=>"slurm-23.11_1.0_arm64.deb"}
4. 安裝Debian包
接下來(lái),我們通過(guò)dpkg命令安裝此包:
$sudo dpkg-islurm-23.11_1.0_arm64.debPreparing to unpack slurm-23.11_1.0_arm64.deb ...Unpacking slurm-23.11(1.0) over (1.0) ...Setting up slurm-23.11(1.0) ...Processing triggersforman-db(2.11.2-2) ...
我們還必須創(chuàng)建slurm系統(tǒng)用戶,并使用正確的訪問(wèn)權(quán)限初始化所需的目錄。確保slurm用戶存在,并且其用戶ID在集群中同步。請(qǐng)注意,Slurm控制器使用的文件和目錄需要由slurm用戶可讀或可寫(xiě)。此外,日志文件目錄/var/log/slurm和狀態(tài)保存目錄/var/spool/slurm必須可寫(xiě)。
在這里,我將slurm用戶和組ID固定為151。
$sudo adduser --system --group -uid 151 slurm
還通過(guò)執(zhí)行以下命令創(chuàng)建了具有預(yù)期權(quán)限的必要目錄:
$sudomkdir-p /etc/slurm /var/spool/slurm/ctld /var/spool/slurm/d /var/log/slurm$sudochownslurm: /var/spool/slurm/ctld /var/spool/slurm/d /var/log/slurm
Slurm配置
到目前為止,一切進(jìn)展順利。到目前為止,我們已經(jīng)構(gòu)建并安裝了Slurm包。下一步將是配置其各個(gè)組件,并將它們作為服務(wù)運(yùn)行。
1.Slurm數(shù)據(jù)庫(kù)守護(hù)進(jìn)程
我們將設(shè)置Slurm數(shù)據(jù)庫(kù)守護(hù)進(jìn)程(slurmdbd)來(lái)收集每個(gè)作業(yè)的詳細(xì)會(huì)計(jì)信息,并將所有會(huì)計(jì)數(shù)據(jù)存儲(chǔ)在數(shù)據(jù)庫(kù)中。這首先需要在主節(jié)點(diǎn)上創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)服務(wù)器,但理想情況下,它應(yīng)該位于一個(gè)單獨(dú)的節(jié)點(diǎn)上。我選擇了MariaDB,這是一個(gè)與MySQL兼容的開(kāi)源數(shù)據(jù)庫(kù)。你可以使用以下說(shuō)明部署數(shù)據(jù)庫(kù)服務(wù)器:
$ sudo apt install mariadb-server$ sudo mysql-u rootcreatedatabase slurm_acct_db;createuser'slurm'@'localhost';setpasswordfor'slurm'@'localhost'=password('slurmdbpass');grantusageon*.*to'slurm'@'localhost';grantallprivilegesonslurm_acct_db.*to'slurm'@'localhost';flush privileges;exit
之后,我們需要?jiǎng)?chuàng)建/etc/slurm/slurmdbd.conf并添加所需的配置,例如指定認(rèn)證、數(shù)據(jù)庫(kù)服務(wù)器主機(jī)名、日志記錄等。執(zhí)行以下命令以添加配置文件。
$sudo bash -c"cat > /etc/slurm/slurmdbd.conf << EOF#?Authentication infoAuthType=auth/munge
#slurmDBD infoDbdAddr=localhostDbdHost=localhostSlurmUser=slurmDebugLevel=3LogFile=/var/log/slurm/slurmdbd.logPidFile=/run/slurmdbd.pidPluginDir=/usr/lib/slurm
#Database infoStorageType=accounting_storage/mysqlStorageUser=slurmStoragePass=slurmdbpassStorageLoc=slurm_acct_dbEOF"
此文件描述了Slurm數(shù)據(jù)庫(kù)守護(hù)進(jìn)程的配置信息。請(qǐng)注意,它應(yīng)該只位于執(zhí)行slurmdbd的計(jì)算機(jī)上。此外,它必須只能由slurm用戶讀取。
$sudochmod600 /etc/slurm/slurmdbd.conf$sudochownslurm: /etc/slurm/slurmdbd.conf
接下來(lái),我們需要將slurmdbd設(shè)置為systemd服務(wù)。這可以通過(guò)創(chuàng)建/etc/systemd/system/slurmdbd.service來(lái)完成。
$ sudobash -c"cat > /etc/systemd/system/slurmdbd.service << EOF[Unit]Description=Slurm DBD accounting daemonAfter=network.target munge.serviceConditionPathExists=/etc/slurm/slurmdbd.conf
[Service]Type=forkingEnvironmentFile=-/etc/sysconfig/slurmdbdExecStart=/usr/sbin/slurmdbd$SLURMDBD_OPTIONSExecReload=/bin/kill -HUP$MAINPIDPIDFile=/run/slurmdbd.pid
[Install]WantedBy=multi-user.targetEOF"
你現(xiàn)在可以啟用并啟動(dòng)slurmdbd.service,如下所示:
$sudo systemctlenableslurmdbd.service$sudo systemctl start slurmdbd.service
$sudo systemctl | grep slurmdbd slurmdbd.service loaded active running Slurm DBD accounting daemon
如果一切順利,你應(yīng)該看到slurmdbd服務(wù)已啟動(dòng)并正在運(yùn)行。否則,請(qǐng)檢查/var/log/slurm/slurmdbd.log文件或systemd狀態(tài)。
2.Slurm控制器守護(hù)進(jìn)程
Slurm控制器守護(hù)進(jìn)程(slurmctl)協(xié)調(diào)Slurm活動(dòng),是Slurm的中央管理守護(hù)進(jìn)程。它監(jiān)控所有其他Slurm守護(hù)進(jìn)程和資源,接受作業(yè),并為這些作業(yè)分配資源。我們必須創(chuàng)建一個(gè)/etc/slurm/slurm.conf文件。此配置文件定義了Slurm如何與資源交互、管理作業(yè)以及與其他組件通信。它包含各種各樣的參數(shù),并且必須在集群的每個(gè)節(jié)點(diǎn)上保持一致。使用以下命令在終端中創(chuàng)建并添加所需的配置:
$sudo bash -c"cat > /etc/slurm/slurm.conf << EOFClusterName=raspi-hpc-clusterControlMachine=rpnode01SlurmUser=slurmAuthType=auth/mungeStateSaveLocation=/var/spool/slurm/ctldSlurmdSpoolDir=/var/spool/slurm/dSwitchType=switch/noneMpiDefault=pmi2SlurmctldPidFile=/run/slurmctld.pidSlurmdPidFile=/run/slurmd.pidProctrackType=proctrack/cgroupPluginDir=/usr/lib/slurmReturnToService=1TaskPlugin=task/cgroup
#SCHEDULINGSchedulerType=sched/backfillSelectTypeParameters=CR_Core_Memory,CR_CORE_DEFAULT_DIST_BLOCK,CR_ONE_TASK_PER_CORE
#LOGGINGSlurmctldDebug=3SlurmctldLogFile=/var/log/slurm/slurmctld.logSlurmdDebug=3SlurmdLogFile=/var/log/slurm/slurmd.logJobCompType=jobcomp/none
#ACCOUNTINGJobAcctGatherType=jobacct_gather/cgroupAccountingStorageTRES=gres/gpuDebugFlags=CPU_Bind,gresAccountingStorageType=accounting_storage/slurmdbdAccountingStorageHost=localhostAccountingStoragePass=/run/munge/munge.socket.2AccountingStorageUser=slurmAccountingStorageEnforce=limits
#COMPUTE NODESNodeName=rpnode01 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=1800 State=idleNodeName=rpnode02 CPUs=4 Sockets=1 CoresPerSocket=4 ThreadsPerCore=1 RealMemory=1800 State=idle
#PARTITIONNSPartitionName=batch Nodes=rpnode[01-02] Default=YES State=UP DefaultTime=1-0000 DefMemPerCPU=200 MaxTime=30-0000 DefCpuPerGPU=1EOF"
再次創(chuàng)建/etc/systemd/system/slurmctld.service以將slurmctl作為systemd守護(hù)進(jìn)程運(yùn)行。這可以通過(guò)運(yùn)行以下命令來(lái)添加:
$ sudobash -c"cat > /etc/systemd/system/slurmctld.service << EOF[Unit]Description=Slurm controller daemonAfter=network.target munge.serviceConditionPathExists=/etc/slurm/slurm.conf
[Service]Type=forkingEnvironmentFile=-/etc/sysconfig/slurmctldExecStart=/usr/sbin/slurmctld$SLURMCTLD_OPTIONSExecReload=/bin/kill -HUP$MAINPIDPIDFile=/run/slurmctld.pid
[Install]WantedBy=multi-user.targetEOF"
我們現(xiàn)在可以啟用并啟動(dòng)slurmctld.service,如下所示:
$sudo systemctlenableslurmctld.service$sudo systemctl start slurmctld.service
$sudo systemctl | grep slurmctldslurmctld.service loaded active running Slurm controller daemon
3.Slurm節(jié)點(diǎn)守護(hù)進(jìn)程
如果你想將主節(jié)點(diǎn)也用作計(jì)算節(jié)點(diǎn),那么你應(yīng)該設(shè)置Slurm的計(jì)算節(jié)點(diǎn)守護(hù)進(jìn)程(slurmd)。slurmd守護(hù)進(jìn)程必須在每個(gè)計(jì)算節(jié)點(diǎn)上執(zhí)行。它監(jiān)控計(jì)算節(jié)點(diǎn)上運(yùn)行的所有任務(wù),接受作業(yè),啟動(dòng)任務(wù),并在請(qǐng)求時(shí)終止正在運(yùn)行的任務(wù)。此守護(hù)進(jìn)程讀取slurmd.conf以及兩個(gè)額外的文件:cgroup.conf和cgroup_allowed_devices_file.conf。使用以下命令創(chuàng)建所需的兩個(gè)控制組(cgroup)文件:
$ sudobash -c"cat > /etc/slurm/cgroup.conf << EOFConstrainCores=yes?ConstrainDevices=yesConstrainRAMSpace=yesEOF"
$ sudobash -c"cat > /etc/slurm/cgroup_allowed_devices_file.conf << EOF/dev/null/dev/urandom/dev/zero/dev/sda*/dev/cpu/*/*/dev/pts/*/dev/nvidia*EOF"
然后,我們必須再次創(chuàng)建systemd.service文件以將slurmd作為服務(wù)運(yùn)行。
$ sudobash -c"cat > /etc/systemd/system/slurmd.service << EOF[Unit]Description=Slurm node daemonAfter=network.target munge.serviceConditionPathExists=/etc/slurm/slurm.conf
[Service]Type=forkingEnvironmentFile=-/etc/sysconfig/slurmdExecStart=/usr/sbin/slurmd -d /usr/sbin/slurmstepd$SLURMD_OPTIONSExecReload=/bin/kill -HUP$MAINPIDPIDFile=/run/slurmd.pidKillMode=processLimitNOFILE=51200LimitMEMLOCK=infinityLimitSTACK=infinityRestart=on-failureRestartSec=5s
[Install]WantedBy=multi-user.targetEOF"
最后,使用以下命令啟用并啟動(dòng)slurmd服務(wù):
$sudo systemctlenableslurmd.service$sudo systemctl start slurmd.service
$sudo systemctl | grep slurmd slurmd.service loaded active running Slurm node daemon
在這一步,我們已經(jīng)準(zhǔn)備就緒,可以使用Slurm的sinfo命令查看有關(guān)我們的Slurm節(jié)點(diǎn)和分區(qū)的信息:
$sinfoPARTITION AVAIL TIMELIMIT NODES STATE NODELISTbatch* up 30-000 1 idle rpnode01
如果你看到此輸出,則表示你已經(jīng)成功安裝并配置了Slurm。干得好!
Slurm 賬戶記錄
Slurm為每個(gè)執(zhí)行的作業(yè)和作業(yè)步驟收集賬戶信息。它還支持將賬戶記錄直接寫(xiě)入數(shù)據(jù)庫(kù)。出于測(cè)試目的,我們?cè)赟lurm數(shù)據(jù)庫(kù)中定義了一個(gè)集群“raspi-hpc-cluster”和一個(gè)賬戶“compute”,如下所示:
$sudo sacctmgr add cluster raspi-hpc-cluster$sudo sacctmgr add account compute description="Compute account"Organization=home
$ sudo sacctmgrshowaccount Account Descr Org---------- -------------------- -------------------- compute Compute account home rootdefaultroot account root
并將用戶pi與常規(guī)Slurm賬戶關(guān)聯(lián):
$ sudo sacctmgradduserpi account=compute$ sudo sacctmgr modifyuserpisetGrpTRES=cpu=4,mem=1gb$ sudo sacctmgrshowuser User Def Acct Admin---------- ---------- --------- pi compute None root root Administ+
如果一切順利,我們的單節(jié)點(diǎn)Slurm集群現(xiàn)在應(yīng)該已經(jīng)準(zhǔn)備好提交作業(yè)了。讓我們首先顯示有關(guān)可用節(jié)點(diǎn)當(dāng)前狀態(tài)的信息:
$sinfoPARTITION AVAIL TIMELIMIT NODES STATE NODELISTbatch* up 30-000 1 idle rpnode[01]
現(xiàn)在,讓我們執(zhí)行一個(gè)簡(jiǎn)單的Slurm srun命令并檢查輸出。
$srun hostnamerpnode01
這表明我們的作業(yè)作為Slurm作業(yè)成功運(yùn)行,并返回了計(jì)算節(jié)點(diǎn)的主機(jī)名,在這種情況下是rpnode01。
計(jì)算節(jié)點(diǎn)
將我們的Slurm集群擴(kuò)展以包含額外的計(jì)算節(jié)點(diǎn)涉及以下幾個(gè)關(guān)鍵步驟:
1.安裝先決條件庫(kù)和頭文件。
2.從主節(jié)點(diǎn)將/etc/munge/munge.key復(fù)制到計(jì)算節(jié)點(diǎn),將所有者更改為munge用戶,并重啟munge.service。
3.安裝slurm-23.11_1.0_arm64.deb。
4.創(chuàng)建slurm用戶和所需的Slurm目錄。
5.將slurm.conf、cgroup.conf和cgroup_allowed_devices_file.conf文件復(fù)制到/etc/slurm/。
6.啟用并啟動(dòng)slurmd.service。
測(cè)試
讓我們首先使用以下命令將新節(jié)點(diǎn)rpnode02的狀態(tài)更新為idle:
$scontrol update nodename=rpnode02 state=idle
$sinfoPARTITION AVAIL TIMELIMIT NODES STATE NODELISTbatch* up 30-000 2 idle rpnode[01-02]
再次在新節(jié)點(diǎn)上使用以下命令運(yùn)行主機(jī)名作業(yè):
$srun -w rpnode02 hostnamerpnode02
如你所見(jiàn),此作業(yè)在第二個(gè)計(jì)算節(jié)點(diǎn)上執(zhí)行,因此這次返回了主機(jī)名rpnode02。
示例
集群信息
Slurm中的分區(qū)是將集群劃分為邏輯節(jié)點(diǎn)集的一種方式,可用于更有效地管理和分配資源。在這里,我們顯示有關(guān)Slurm中配置的batch分區(qū)的詳細(xì)信息:
$ scontrolshowpartitionPartitionName=batch AllowGroups=ALLAllowAccounts=ALLAllowQos=ALL AllocNodes=ALLDefault=YES QoS=N/A DefaultTime=1-00:00:00DisableRootJobs=NOExclusiveUser=NOGraceTime=0Hidden=NO MaxNodes=UNLIMITED MaxTime=30-00:00:00MinNodes=0LLN=NOMaxCPUsPerNode=UNLIMITED MaxCPUsPerSocket=UNLIMITED Nodes=rpnode[01-02] PriorityJobFactor=1PriorityTier=1RootOnly=NOReqResv=NOOverSubscribe=NO OverTimeLimit=NONEPreemptMode=OFF State=UP TotalCPUs=8TotalNodes=2SelectTypeParameters=NONE JobDefaults=DefCpuPerGPU=1 DefMemPerCPU=200MaxMemPerNode=UNLIMITED TRES=cpu=8,mem=3600M,node=2,billing=8
并顯示rpnode01的狀態(tài):
$ scontrolshownodesNodeName=rpnode01 Arch=aarch64 CoresPerSocket=4 CPUAlloc=0CPUEfctv=4CPUTot=4CPULoad=0.01 AvailableFeatures=(null) ActiveFeatures=(null) Gres=(null) NodeAddr=rpnode01 NodeHostName=rpnode01 Version=23.11.6 OS=Linux6.6.28+rpt-rpi-v8 #1SMP PREEMPT Debian1:6.6.28-1+rpt1 (2024-04-22) RealMemory=1800AllocMem=0FreeMem=297Sockets=1Boards=1 State=IDLE ThreadsPerCore=1TmpDisk=0Weight=1Owner=N/A MCS_label=N/A Partitions=batch BootTime=2024-05-19T13:58:15SlurmdStartTime=2024-05-19T14:20:03 LastBusyTime=2024-05-19T14:26:11ResumeAfterTime=None CfgTRES=cpu=4,mem=1800M,billing=4 AllocTRES= CapWatts=n/a CurrentWatts=0AveWatts=0 ExtSensorsJoules=n/a ExtSensorsWatts=0ExtSensorsTemp=n/a
提交作業(yè)
讓我們?cè)谥髂夸浿袆?chuàng)建一個(gè)簡(jiǎn)單的Slurm批處理文件:
$cat> ~/submit.sh <#SBATCH --job-name=testjob#SBATCH --mem=10mb#SBATCH --ntasks=1#SBATCH --cpus-per-task=2#SBATCH --time=0000
srun sleep 10EOF
現(xiàn)在我們可以提交此作業(yè):
$sbatch submit.shSubmitted batch job 8
你可以在默認(rèn)批處理隊(duì)列中查看提交作業(yè)的狀態(tài):
$ squeue-alSun May1914:26:032024JOBIDPARTITION NAME USER STATE TIMETIME_LIMI NODES NODELIST(REASON) 8 batch testjob pi RUNNING 0:03 1:00 1rpnode01
此作業(yè)正在rpnode01上運(yùn)行,并具有1分鐘的時(shí)間限制。
總結(jié)
如前所述,此高性能計(jì)算集群用作測(cè)試環(huán)境。它目前配備了基本的Slurm和集中存儲(chǔ)功能,但具有未來(lái)擴(kuò)展和增強(qiáng)的潛力。我計(jì)劃撰寫(xiě)后續(xù)文章,涵蓋與高性能計(jì)算集群系統(tǒng)設(shè)置相關(guān)的其他主題,包括用戶會(huì)計(jì)、磁盤(pán)配額、使用環(huán)境模塊和Conda包管理器設(shè)置軟件棧、MPI實(shí)現(xiàn)以及設(shè)置Jupyterhub服務(wù)。
隨時(shí)查看我的GitHub倉(cāng)庫(kù),了解我?guī)啄昵皠?chuàng)建的有關(guān)設(shè)置高性能計(jì)算集群的指南。在該倉(cāng)庫(kù)中,我涵蓋了所提到的高性能計(jì)算集群功能的設(shè)置過(guò)程。請(qǐng)記住,這些信息有些過(guò)時(shí),可能需要進(jìn)行一些調(diào)整才能與當(dāng)前版本一起使用。
-
計(jì)算機(jī)
+關(guān)注
關(guān)注
19文章
7637瀏覽量
90323 -
樹(shù)莓派
+關(guān)注
關(guān)注
121文章
1963瀏覽量
107078
發(fā)布評(píng)論請(qǐng)先 登錄
樹(shù)莓派權(quán)威用戶指南
120個(gè)樹(shù)莓派的集群
樹(shù)莓派4的計(jì)算模組終于上線!

樹(shù)莓派MCU來(lái)了!

樹(shù)莓派鏡像構(gòu)建指導(dǎo)、使用方法和特性介紹
樹(shù)莓派機(jī)器人船構(gòu)建

等待已久,新品上市 | RevPi Connect 4系列:基于樹(shù)莓派CM4計(jì)算模塊的全新工業(yè)樹(shù)莓派

高性能計(jì)算集群的能耗優(yōu)化

評(píng)論