Slurm 是一個專門拿來做分散式平行運算的平台,已被各式超級運算電腦群集採用[1]。跟 Hadoop 其實有點像,但是我個人感覺是 Slurm 好用太多,更穩定更快速,而且不用會 Java…XD
最近剛好有機會需要建立以及管理一個 Slurm Cluster,就想說來記錄一下過程以及一些雷。
先來看一張 Slurm 架構的圖,基本上最重要的兩個東西就是 (1) Slurm Controller (slurmctld) 跟 (2) Slurm Compute Node (slurmd),Controller 是拿來分配任務用的,他管理所有 Compute Node,負責決定哪個任務該去哪個 Node 執行,而 Compute Node 就是真的會執行任務的機器。
所以要建置一個 Slurm Cluster,最少要弄一個 Controller 跟多個 Compute Nodes,至於其他像是 slurmdbd 等等,就並不是必需的東西。
Preparation
在開始安裝 Controller 跟 Compute Node 之前,要先準備一些事情,
- 需要安裝
munge
,透過apt-get install libmunge-dev libmunge2 munge
即可。 - 需要創一個
slurm
帳號跟一個munge
帳號,並且要在所有機器上都有這些帳號 (uid 也必須一致)。
munge
是 slurm 拿來做 Authentication 的組件。
1 | # Create a slurm user, and change it to some id, the is must same across nodes. |
Setup Slurm Controller
下載原始碼來編譯然後安裝
1 | cd /tmp; wget https://download.schedmd.com/slurm/slurm-18.08.2.tar.bz2; tar xvjf slurm-18.08.2.tar.bz2; cd slurm-18.08.2/ |
雖然 apt-get install slurm
有東西,但那個不是對的…
安裝好以後,可以透過一個網頁來設定基本的 config 檔,預設位置在 /usr/share/doc/slurmctld/slurm-wlm-configurator.html
,設定好以後存檔並放至 /etc/slurm-llnl/slurm.conf
。記得更改權限。然後就可以啟用。
1 | # set slurmctld & slurmdbd auto start via systemd (only for the controller) |
Setup Slurm Compute Nodes
Slurm Compute Node 也可以透過 apt
安裝,但是由於我需要使用 slurm 的一些 api,所以這部分會使用從 source code 建置。
先安裝 munge
,改 user id 以及複製 munge key:
1 | # Copy munge key from slurm controller |
接下來先下載 slurm source code,並且 build
1 | # Install slurm |
到此基本完成 Slurm Cluster 的設定,可以透過一些指令來檢查 slurm 的狀態。
sinfo: 會顯示目前 cluster nodes 的狀態
1 | PARTITION AVAIL TIMELIMIT NODES STATE NODELIST |
squeue: 顯示目前正在執行/等待執行的任務
1 | JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) |
scancel: 取消任務
還有很多其他指令,可以看這張 Cheat sheet。
Some Common Issues
使用的過程中總是會遇到一些奇奇怪怪的問題,這邊就列舉一些我常見的:
Zero Bytes were transmitted or received
在使用 slurm 相關的指令時噴出的錯誤。
這個基本上是因為 Authentication 出錯,把所有 nodes 的 munge 重啟就會解決。
Slurm job stock in CG state
有時候會發現有一些 Job 就是一直卡在 Completing (CG state),這時候把那個 node 設為 down 再設為 resume 就會消失了。
1 | $ scontrol update nodename=research04 state=down reason=job_stuck; |
Invalid job credential
這表示有些 node 沒有 slurm, munge user,或者他們的 uid 不一致,解決方法就是把他們設為一致。