# Slurm基本概念
晶創主機使用SLURM(Simple Linux Utility for Resource Management)工作排程軟體,以下說明Slurm常用的名詞基本概念:
::::success
1. 計畫代號 (Account):Slurm Account在此系統代表iService計畫代號,提交工作前必須加入iService有效計畫及錢包餘額為正數。
Slurm指令可使用參數 ==-A, --account =<account>== 指定計畫代號(PROJECT_ID)。
```
#SBATCH --account = GOV113080
或是
#SBATCH -A GOV113080
```
2. 節點(Node):Slurm 大致可區分為三個節點角色:
(1) 管理節點 (Head Node):管理Slurm叢集系統、工作與排程等。
(2) 工作派送節點 (Submit Node):供用戶登入提交與管理計算工作的節點,如登入節點。
(3) 計算節點 (Worker Node):工作派送後,實際執行程式運算的節點,如指令`sinfo`的NODELIST欄位就是計算節點清單。
3. 佇列(Partition): 將多個計算節點組成一個集合,若計算節點的硬體配置不同,透過佇列(Partition)可以幫助使用者選擇合適的節點並派送工作進行運算,例如CPU專用佇列與GPU專用佇列。
Slurm指令可使用參數 ==-p, --partition=<partition>== 指定佇列(Partition)。
```
#SBATCH --partition = dev
或是
#SBATCH -p dev
```
4. 工作(Job):工作是在一個或多個計算節點上執行相同的程式。用戶可以通過提交一個工作給SLURM管理節點,然後SLURM管理節點會分配資源給該工作,並在適當的計算節點上執行。
5. 工作識別碼 (Job ID):在Slurm中提交的工作都會被分配一個唯一的識別碼,稱為"job ID"。
++這個ID是由SLURM系統自動產生的,用戶可以使用這個ID來檢查工作的狀態、終止工作或查詢工作的詳細資訊。++
Slurm指令可使用參數 ==-j, --jobs=<job_id>== 指定工作(Job)。
6. 工作名稱 (Job Name):是用戶指定的一個用於識別工作的名稱。工作名稱可以是任何用戶選擇的字串,通常用於方便用戶識別和管理提交的工作。
Slurm指令可使用參數 ==-J, --job-name=<job_name>== 指定工作名稱(Job Name)。
<font color="red">備註:
命名時請盡量不要使用特殊字元 # ' " : # ' : ! . ^ & ? *< > / @ ~ | 等,
\ (反斜線)不會印出來,不接受空格。 </font>
<font color="blue">
job-name是用string來儲存字元。
<br>容許的字元為 A-Z、a-z、0-9、_(底線)、-(連字號)</br>
字串長度限制為128字元。</font>
```
#SBATCH --job-name = test
或是
#SBATCH -J test
```
<!---```
<font錯誤範例
``` --->
7. 工作步驟(Job Steps):一個Job可以包含一至多個工作步驟(Job Steps),每個job step代表一個獨立的子工作。例如,一個job可能需要進行資料預處理、模型訓練和後處理等多個步驟。在sbatch腳本中或在salloc的shell中,一個srun指令就代表一個工作步驟。
8. 任務 (Tasks):一個job step可以包含一個或多個tasks,每個task代表一個要在計算節點上執行的工作。在平行計算中,tasks通常用於執行同一個任務的多個實例,從而加速計算的進行。
Slurm指令可使用參數 ==-n, --ntasks=<number>== 指定任務(Tasks)數量。++不限定在幾個節點(node)上。++
```
#SBATCH --ntasks=20 # Total number of tasks requested
或是
#SBATCH -n 20
```
9. 任務資源 (Task Resource):指Job在計算節點上執行時所需的資源配置,包括節點數量、每個任務使用的CPU/GPU核心數量和記憶體大小等。以下是幾個與任務資源相關的SLURM常用參數:
(1)==-N, --nodes=<minnodes> \[-maxnodes\]==:這個參數用於指定Job所需的計算節點數量。<minnodes>是作業所需的最小節點數量,而\[-maxnodes\]是作業所需的最大節點數量。如果只指定了最小節點數量,則Job將在指定的節點數上執行;如果同時指定了最大節點數量,則Slurm將嘗試在節點數量的範圍內動態調整作業的資源分配。
++節點數量根據佇列partition來分類,一個計算節點最多112個cpu核心,依此來判斷你需要哪一個partition。++
(2) ==-c, --cpus-per-task==:這個參數用於指定每個任務(task)所使用的CPU核心數量,當使用多執行緒時才需要設定,預設值為1。透過這個參數,++可以控制每個任務在節點上可使用的CPU核心數。++
(3) ==--ntasks-per-node\=<ntasks>==:用來指定每個節點上執行的任務數量。透過這個參數,您可以控制每個節點上平行計算的任務數量。若不指定此參數,則任務數量預設值為1,最大值為計算節點的可用CPU核心數。
(4) ==--gres=gpu:<num>==:用於指定Job所需GPU數量的參數,在此系統中只適用於特定的佇列(Partition)。
<!--
```
#SBATCH --nodes=2 # Total number of nodes requested
#SBATCH --ntasks-per-node=20 # Maximum number of tasks on each node
---
備註:上面範例和下面範例所需要的資源不太相同。
上面是每個節點跑80的task,兩個節點分別跑80個task。
下面是要求跑160個task,沒有限制一個node跑幾個task,可能會依照當時排程系統的資源,舉例一個節點跑滿112個task,另一個節點跑48個task。
#SBATCH -N 2 # Total number of nodes requested
#SBATCH -n 160 # Total number of mpi tasks requested
```
-->
10. 最大執行時間 (Wall Time):指Job的最大執行時間,也就是Job可以在計算節點上運行的時間限制。由Slurm用來限制作業運行時間,以確保系統資源的有效利用和作業的及時完成。
每個佇列(Partition)皆有限制最大執行時間(Wall Time),提交Job時,可使用參數 ==-t, --time=<time>== 指定該Job的最大執行時間,可指定該Job的最大執行時間,但不能超過佇列(Partition) 預設的最大執行時間(Wall Time)。
時間限制 (days-hrs:min:sec) 可以用不同的單位表示,例如分鐘(time=30表示30分鐘)、小時(time=2:00:00表示2小時)或者天(time=1-00:00:00表示1天)。++如果作業在時間限制內沒有完成,系統將強制終止作業的執行。++
Slurm指令可使用參數 ==-t, --time=<time>== 指定該Job的最大執行時間。
```
#SBATCH --time=2:00:00 # time limit 2 hours
或是
#SBATCH -t 2:00:00
```
11. 寄信通知(mail-type)和收信者(mail-user):五種mail-type(NONE, BEGIN, END, FAIL, ALL)會觸發系統寄信,可以根據你想收到的通知去做選擇。
Slurm指令可使用參數 ==--mail-type=<mail-type>== 和 ==--mail-user\=<user@mail.com.tw>== 指定收信者信箱並在特定事件發生時寄出信件。
<font color='red'>備註: 請使用寄信的方式來監控job的狀況!</font>
```
#SBATCH --mail-type=END,BEGIN # Send the mail when the job starts and finishes.
#SBATCH --mail-user=user@gmail.com.tw
```
:::danger
請勿利用watch查看squeue,頻繁查詢排隊會增加排程系統負載。
建議使用派送腳本方式來通知job完成與否。
```
#SBATCH --mail-type=END,FAIL # Mail events (NONE, BEGIN, END, FAIL, ALL)
#SBATCH --mail-user=user@example.com # Where to send mail. Set this to your email address
```
<!--
若有特殊需求,請告知原因或將每個查詢指令間隔延長至平均30秒以上( watch -n 30 )。-->
:::
12. 節點狀態 (Node State):下表列出==sinfo===指令中”STATE”欄位常見的狀態說明。
| 節點狀態 | 描述 |
|-|-|
| idle | 節點處於空閒狀態,沒有任何Job正在運行或排隊等待執行 |
| alloc | 節點已被分配給一個Job,但Job尚未開始執行 |
| mix | 節點同時包含了idle和alloc狀態的資源 |
| comp | 節點上的工作已完成,正在進行清理動作 |
| drain | 節點處於停用狀態,暫時不可用於執行作業 |
| down | 節點處於故障狀態,無法正常工作 |
| fail | 節點上的一個或多個核心或其他組件發生了錯誤或失敗 |
| unknown | 節點的狀態未知,系統無法確定其當前的狀態 |
13. 工作狀態 (Job State):下表列出==sacct==指令中”STATE”欄位常見的狀態說明。
| 工作狀態 | 描述 |
|-|-|
| COMPLETED | 工作已成功完成 |
| FAILED | 工作執行失敗 |
| CANCELLED | 工作被取消 |
| TIMEOUT | 工作因超時而終止 |
| RUNNING | 工作正在執行中 |
| PENDING | 工作正在等待資源分配 |
| COMPLETING | 工作已完成但正在進行清理工作 |
| NODE_FAIL | 工作由於計算節點失敗而終止 |
| SUSPENDED | 工作處於暫停狀態,等待恢復執行 |
| REQUEUED | 工作被重新排隊等待執行 |
::::