# Slurm簡介
++本章節所有指令皆需進入”登入節點”執行,請參考[登入節點](https://man.twcc.ai/@f1-manual/login_node)的連線操作方式。++
[TOC]
## 查詢計畫錢包資訊
:::success
提交計算工作前,請先確認計畫代號(PROJECT_ID)與iService 計畫錢包(SU_BALANCE)的餘額,<font color="#f00">必須加入有效計畫且錢包餘額為正數才能成功派送您的計算工作</font>,請使用 ==wallet== 指令確認計畫代號(PROJECT_ID)與iService 計畫錢包(SU_BALANCE) 餘額:
```
[user@ilgn01]$ wallet
INFO: If you belong to many projects, it may take up to 5 seconds or more.
INFO: Specifying a project should be faster. `wallet $PROJECT_ID`
PROJECT_ID: GOVXXXXXX, PROJECT_NAME: XXX計畫, SU_BALANCE: 2024
```
:::
## Slurm基本概念
:::success
創進一號使用SLURM(Simple Linux Utility for Resource Management)工作排程軟體,以下說明Slurm常用的名詞基本概念:
1. 計畫代號 (Account):Slurm Account在創進一號代表iService計畫代號,提交工作前必須加入iService有效計畫及錢包餘額為正數。 [查詢計畫代號教學](https://man.twcc.ai/@f1-manual/iService#%E8%A8%88%E7%95%AB%E7%B3%BB%E7%B5%B1%E4%BB%A3%E8%99%9F%E6%9F%A5%E8%A9%A2)
Slurm指令可使用參數 ==-A, --account =<account>== 指定計畫代號(PROJECT_ID)。
```
#SBATCH --account = CHC199166
或是
#SBATCH -A CHC199166
```
2. 節點(Node):Slurm 大致可區分為三個節點角色:
(1) 管理節點 (Head Node):管理Slurm叢集系統、工作與排程等。
(2) 工作派送節點 (Submit Node):供用戶登入提交與管理計算工作的節點,如登入節點。
(3) 計算節點 (Worker Node):工作派送後,實際執行程式運算的節點,如指令`sinfo`的NODELIST欄位就是計算節點清單。
3. 佇列(Partition): 將多個計算節點組成一個集合,若計算節點的硬體配置不同,透過佇列(Partition)可以幫助使用者選擇合適的節點並派送工作進行運算,例如CPU專用佇列與GPU專用佇列。 [查詢佇列(partition)教學](https://man.twcc.ai/@f1-manual/slurm_instructions#Slurm%E4%BD%87%E5%88%97-Partition)
Slurm指令可使用參數 ==-p, --partition=<partition>== 指定佇列(Partition)。
```
#SBATCH --partition = development
或是
#SBATCH -p development
```
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)。
job-name是用string來儲存字元。
<font color="red">備註:
命名時請盡量不要使用特殊字元 # ' " : # ' : ! . ^ & ? *< > / @ ~ | 等,
\ (反斜線)不會印出來,不接受空格。 </font>
容許的字元為 A-Z、a-z、0-9、_(底線)、-(連字號)
字串長度限制為128字元。
```
#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=200 # Total number of tasks requested
或是
#SBATCH -n 200
```
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核心數。
++一個計算節點最多112個cpu核心,上限不能超過112。++
(4) --gres=gpu:<num>:用於指定Job所需GPU數量的參數,在創進一號中只適用於特定的佇列(Partition),請參考此頁面[Slurm佇列 (Partition)](https://man.twcc.ai/@f1-manual/slurm_instructions)的資訊。
```
#SBATCH --nodes=2 # Total number of nodes requested
#SBATCH --ntasks-per-node=80 # 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時,可指定該Job的最大執行時間,++但不能超過佇列(Partition) 預設的最大執行時間(Wall Time)++,請參考此頁面[Slurm佇列 (Partition)](https://man.twcc.ai/@f1-manual/slurm_instructions)的資訊。
Slurm指令可使用參數 -t, --time=<time> 指定該Job的最大執行時間。
時間限制 (days-hrs:min:sec) 可以用不同的單位表示,例如分鐘(time=30表示30分鐘)、小時(time=2:00:00表示2小時)或者天(time=1-00:00:00表示1天)。++如果作業在時間限制內沒有完成,系統將強制終止作業的執行。++
```
#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
```
12. 服務品質 (QOS): 本系統提供兩種關鍵方式影響計算工作: (1)提高排隊優先權、(2)延長計算工作時間。
Slurm指令可使用參數 --qos=<qos> 指定該Job要使用哪一個QOS服務設定。此參數功能需先經過申請,預設上無需加入此參數。
13. 節點狀態 (Node State):下表列出`sinfo`指令中”STATE”欄位常見的狀態說明。
| 節點狀態 | 描述 |
|-|-|
| idle | 節點處於空閒狀態,沒有任何Job正在運行或排隊等待執行 |
| alloc | 節點已被分配給一個Job,但Job尚未開始執行 |
| mix | 節點同時包含了idle和alloc狀態的資源 |
| comp | 節點上的工作已完成,正在進行清理動作 |
| drain | 節點處於停用狀態,暫時不可用於執行作業 |
| down | 節點處於故障狀態,無法正常工作 |
| fail | 節點上的一個或多個核心或其他組件發生了錯誤或失敗 |
| unknown | 節點的狀態未知,系統無法確定其當前的狀態 |
14. 工作狀態 (Job State):下表列出`sacct`指令中”STATE”欄位常見的狀態說明。
| 工作狀態 | 描述 |
|-|-|
| COMPLETED | 工作已成功完成 |
| FAILED | 工作執行失敗 |
| CANCELLED | 工作被取消 |
| TIMEOUT | 工作因超時而終止 |
| RUNNING | 工作正在執行中 |
| PENDING | 工作正在等待資源分配 |
| COMPLETING | 工作已完成但正在進行清理工作 |
| NODE_FAIL | 工作由於計算節點失敗而終止 |
| SUSPENDED | 工作處於暫停狀態,等待恢復執行 |
| REQUEUED | 工作被重新排隊等待執行 |
:::
## Slurm常用指令與參數
:::success
<tr>
<td></td>
<td></td>
</tr>
<table>
<tr>
<td>指令</td>
<td>功能說明</td>
</tr>
<tr>
<td>sinfo</td>
<td>查詢佇列(Partitiond)清單與節點狀態 </td>
</tr>
<tr>
<td>squeue</td>
<td > 查詢已提交的Job狀態</td>
</tr>
<tr>
<td>sbatch</td>
<td>(建議)以batch方式提交Job,適合多節點運算。<br>必須指定--account=<PROJECT_ID></br></td>
</tr>
<tr>
<td> srun</td>
<td> 提交Job,直接執行指令且需等待指令執行完成,適合需即時查看輸出的程式除錯工作。</td>
</tr>
<tr>
<td>salloc</td>
<td>提交互動式Job,自動產生一個Shell,離開Shell後Job將自動終止,亦可直接登入Job分配的計算節點,適合用於計算程式開發與除錯工作。
<br>必須指定 --account=<PROJECT_ID></PROJECT_ID></br>
</td>
</tr>
<tr>
<td>squeue</td>
<td>查詢已提交的Job狀態</td>
</tr>
<tr>
<td>scontrol</td>
<td>查詢執行中Job的詳細資訊,如CPU、Memory與節點分配數量</td>
</tr>
<tr>
<td>scancel</td>
<td>停止Job</td>
</tr>
<tr>
<td>sacct</td>
<td>列列出帳號以往執行過的Job與Job steps。若沒指定時間,預設查詢過去24小時的Job清單。</td>
</tr>
</table>
<font color="#f00"> 備註: 萬一登入節點當機時,線上原本使用 ==salloc== 指令提交 job 可能會造成計算中斷或除錯訊息遺失,因此除了除錯或開發用途之外,建議先編輯好job script,然後使用 ==sbatch== 指令提交計算工作。
</font>
1. sinfo
| 指令參數 | 說明 |
|-|-|
| sinfo | 查看partition與節點資訊 |
| sinfo --states=idle | 查看可用(idle)節點資訊 |
| sinfo --partition=<partition> | 查看特定partition資訊 |
| sinfo -N -l | 查詢節點狀態 |
| sinfo --help | 查看所有選項 |
2. squeue
| 指令參數 | 說明 |
|-|-|
| squeue | 查看已提交的Job狀態資訊 |
| squeue -j <job_id> | 查看特定Job資訊 |
| squeue -l | 查看細節資訊 |
| squeue --state=<state> | 查看特定狀態的Job。常用的state有:R(Running)、PD(Pending) |
| squeue --help | 查看所有的選項 |
3. scontrol
| 指令參數 | 說明 |
|-|-|
| scontrol show job <job_id> | 查看排隊或正在運行的Job詳細資訊 |
| scontrol show node <node> | 查看計算節點可用資源規格 |
4. scancel
| 指令參數 | 說明 |
|-|-|
| scancel <job_id> | 刪除Job |
| scancel -i -u $UID | 互動式詢問刪除用戶自己的Job |
5. sacct
| 指令參數 | 說明 |
|-|-|
| sacct | 列出過去24小時內結束的Job清單 |
| sacct -j <job_id> | 列出指定的已結束Job |
| sacct --starttime $(date -d "7 days ago" +%Y-%m-%d) | 列出過去7天內結束的Job清單 |
| sacct --help | 查看所有的選項 |
:::
<!---<font color="red">
shell 適用c語言編寫。
容許的字元為 A-Z、a-z、0-9、底線、連字號。
不接受空格。
開頭不可以 # ' :
開頭可以 , ! . ^ & ? * < > / @ ~
' " 單一個部型 雙夾住字元可以
\ 反斜線會消失
長度限制 256個位元
- **Allowed Characters**: Generally, you should use alphanumeric characters, underscores (_), and hyphens (-). Special characters like `#` or spaces should be avoided or used with caution as they might cause issues.
- **Length**: Some SLURM implementations may have a maximum length for job names, typically around 256 characters.
</font>--->