<div style="text-align: right; background-color: #f5f5f5; padding: 4px 12px; border-radius: 5px; display: inline-block; float: right; font-size: 1.4rem;">
Last Updated:2025/07/01
</div>
# Slurm 簡介
本章節所有指令皆需於「登入節點」執行,請參閱 [登入節點操作說明](https://man.twcc.ai/@f1-manual/login_node) 以確認正確的連線方式。
<br>
[TOC]
<br>
## 查詢計畫錢包資訊
在提交 Slurm 作業之前,<font color="#f00">**請先確認您已加入有效的計畫代號(`PROJECT_ID`),並確保對應的 iService 計畫錢包(`SU_BALANCE`)餘額為正數。**</font> 否則,系統將無法成功排程您的工作。
可使用 ==`wallet`== 指令查詢當前帳戶所屬的計畫與可用配額:
```
[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
```
<br>
## Slurm 基本概念
創進一號採用 SLURM(Simple Linux Utility for Resource Management)作為作業排程系統。
以下將說明在 HPC 環境中常見的 SLURM 名詞與基本觀念:
### **1. 計畫代號(Account)**
- Slurm 的 Account 代表 iService 計畫代號。提交作業前,請務必加入有效計畫,且該計畫錢包(SU_BALANCE)餘額為正數。
<div style="border: 1.5px solid #B7B7B7; padding: 1rem 1rem; border-radius: 5px; color: #333;">
🔗 <strong>詳細流程請參閱</strong>
<a href="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" target="_blank" style="color: #007ACC;">
查詢計畫代號教學
</a>
</div>
<br>
- Slurm指令可使用參數 <font color="blue">**-A, --account = <account> == 指定計畫代號(PROJECT_ID)**</font>
例如:```#SBATCH --account = CHC199166``` 或是 ```#SBATCH -A CHC199166```
<br>
### **2. 節點(Node)**
節點類型包含:
- 管理節點(Head Node):管理Slurm叢集系統、工作與排程等。
- 工作派送節點(Submit Node):提供用戶提交與管理計算工作的節點,如登入節點。
- 計算節點(Worker Node):工作派送後,實際執行程式運算的節點,如指令`sinfo`的 NODELIST 欄位就是計算節點清單。
<br>
### **3. 佇列(Partition)**
- 由多個計算節點所組成的資源集合。根據計算節點的硬體資源不同,系統會將其劃分為不同佇列,以協助使用者選擇適當的資源進行運算。
<div style="border: 1.5px solid #B7B7B7; padding: 1rem 1rem; border-radius: 5px; color: #333;">
🔗 <strong>詳細流程請參閱</strong>
<a href="https://man.twcc.ai/@f1-manual/partition" target="_blank" style="color: #007ACC;">
查詢佇列(partition)教學
</a>
</div>
<br>
- Slurm指令可使用參數 <font color="blue">**-p, --partition = <partition> == 指定佇列(Partition)**</font>
例如:```#SBATCH -p = development``` 或是 ```#SBATCH --partition development ```
<br>
### **4. 工作(Job)**
- 工作代表一項在單一或多個計算節點上執行相同的計算任務。
- 使用者提交 Job 後,SLURM 會根據指定資源自動分配適當節點執行該任務。
<br>
### **5. 工作識別碼 (Job ID)**
- 提交成功至 SLURM 的工作都會有一個唯一的識別碼(Job ID),由系統自動分配。
- 使用者可利用此 ID 來檢查 Job 狀態、終止特定 Job、查詢 Job 詳細資訊。
- Slurm指令可使用參數 <font color="blue">**-j, --jobs = <job_id> == 指定工作(Job)**</font>
<br>
### **6. 工作名稱 (Job Name)**
- 是用戶自定義的工作名稱,用以識別與管理提交的作業,協助使用者快速定位特定任務。
- Job-name 是用 string 來儲存字元。
- Slurm指令可使用參數 <font color="blue">**-J, --job-name = <job_name> == 指定工作名稱(Job Name)**</font>
例如:```#SBATCH -J = test``` 或是 ```#SBATCH --job-name test```
:::warning
<i class="fa fa-bullhorn" aria-hidden="true"></i> **備註**:
- 僅允許以下字元 `A-Z`、`a-z`、`0-9`、`_`(底線)、`-`(連字號)
- 禁用符號 `#`、`'`、`"`、`:`、`!`、`.`、`^`、`&`、`?`、`*`、`<`、`>`、`/`、`@`、`~`、`|`
- 不可包含空格或反斜線 `\`(會被忽略)
- 最長限制為 128 個字元
:::
<br>
### **7. 工作步驟(Job Steps)**
- 一個 Job 可以包含一個或多個工作步驟(Job Steps),每個步驟代表一個獨立的子工作,對應不同的計算任務。 例如:資料預處理 → 模型訓練 → 結果分析,可視為同一個 Job 中的三個 Job Step。
- 在 `sbatch` 腳本或 `salloc` 的 shell 中,每一條 `srun` 指令即代表一個工作步驟。
<br>
### **8. 任務 (Tasks)**
- 每個 Job Step 可包含一個或多個任務(Task),每個 Task 表示在計算節點上實際執行的一個工作實例。
- 在平行計算時,透過多個 Task 可加速同一任務的執行。
- Slurm指令可使用參數 <font color="blue">**--n, --ntasks = <number> == 指定任務(Tasks)數量**</font>
例如:```#SBATCH -n 200``` 或是 ```#SBATCH --ntasks=200 #Total number of tasks requested```
- 任務總數與節點數並無固定關聯,Slurm 將依資源排程情況自動配置。
<br>
### **9. 任務資源 (Task Resource)**
當提交 Job 至 Slurm 時,可透過以下參數指定每個任務的需求,以利排程系統進行資源配置:
**(1)指定 Job 所需的計算節點數量** <font color="blue"> **-N, --nodes = <minnodes> \[-maxnodes\]**</font>
- 若僅指定最小節點數(`--nodes=<minnodes>`),Slurm 將固定使用該數量的節點執行作業。
- 若同時指定最小與最大節點數(`--nodes=<minnodes>-<maxnodes>`),Slurm 將在節點數量的範圍內動態調整作業的資源分配。
- 計算節點之資源配置根據所選用的佇列(Partition)來分類。
- 每個計算節點最多提供 **112 顆 CPU 核心**,請根據所需的核心數量與應用程式特性選擇對應的 Partition。
**(2)指定每個任務使用的 CPU 核心數量** <font color="blue"> **-c, --cpus-per-task**</font>
- 常用於需要多執行緒處理的程式,預設值為 1。
- 使用此參數可以有效提升運算效率,控制每個任務在節點上可使用的CPU核心數。
**(3)指定每個節點上要執行的任務數量** <font color="blue"> **--ntasks-per-node \= <ntasks>**</font>
- 使用此參數,使用者可以控制每個節點上平行計算的任務數量。
- 若不指定此參數,系統預設每個節點僅執行 1 個任務;而最大任務數量則受限於節點上可用的 CPU 核心數。
- 創進一號每個計算節點上最多可支援 **112 顆 CPU 核心**,因此任務數量上限為 112。
**(4)指定 Job 所需的 GPU 數量** <font color="blue"> **--gres = gpu:<num>**</font>
- 創進一號系統中,GPU 資源僅開放於部分支援 GPU 的佇列(Partition)。請參考文件 [**Slurm 佇列 (Partition)**](https://man.twcc.ai/@f1-manual/partition) 以確認佇列與 GPU 配置的對應情形
- 範例說明 1:將分配跑 2 個節點,每個節點執行 80 個任務
```
#SBATCH --nodes=2 # Total number of nodes requested
#SBATCH --ntasks-per-node=80 # Maximum number of tasks on each node
```
- 範例說明 2:將要求跑 2 個節點,但沒有限制一個節點執行幾個任務,根據當前可用資源,自行調整每個節點的任務分配(例如:節點 A 執行滿載 112 個任務;節點 B 執行剩下 48 個任務)
```
#SBATCH -N 2 # Total number of nodes requested
#SBATCH -n 160 # Total number of mpi tasks requested
```
<br>
<br>
### **10. 最大執行時間 (Wall Time)**
- 指 Job 在計算節點上允許執行的最長時間。Slurm 使用此參數來限制作業運行時間,確保系統資源被有效利用和作業的及時完成。
- 每個佇列(Partition)皆有其預設的最大執行時間限制,提交作業時應設定不超過該限制的值,如需查詢各佇列的預設上限,請參考 [Slurm 佇列 (Partition)](https://man.twcc.ai/@f1-manual/partition)。
- 可使用參數 <font color="blue"> **--t, --time=<time>**</font> 來指定作業的最大執行時間。
例如:```#SBATCH --time=2:00:00 #time limit 2 hours``` 或是 ```#SBATCH -t 2:00:00```
:::warning
<i class="fa fa-bullhorn" aria-hidden="true"></i> **備註**:
時間限制 (days-hrs:min:sec) 支援不同單位表示,若在作業時間限制內沒有完成,系統將強制終止作業的執行。
- **分鐘**:`--time=30` 表示 30 分鐘
- **小時:分鐘:秒**:`--time=2:00:00` 表示 2 小時
- **天-小時:分鐘:秒**:`--time=1-00:00:00` 表示 1 天
:::
<br>
### **11. 寄信通知(Mail Type)與收信者(Mail User)**
- 在特定事件發生時透過電子郵件通知用戶作業狀態,便於監控作業的進程與結果。
- Slurm指令可使用參數 <br><font color="blue"> **--mail-type = <mail-type>** </font> 設定觸發寄信的條件<br> <font color="blue"> **--mail-user = <user@mail.com.tw>** </font> 設定接收通知的電子郵件地址
```
#SBATCH --mail-type=END,BEGIN # Send the mail when the job starts and finishes.
#SBATCH --mail-user=user@gmail.com.tw
```
<font color="red">➤ **請善用寄信通知來追蹤與監控 Job 狀況,以便及時處理可能發生的錯誤或異常。**</font>
:::info
<i class="fa fa-exclamation-circle" aria-hidden="true"></i> **常用的寄信通知類型:**
| 類型 | 說明 |
|--------|---------------------------------|
| **NONE** | 不寄送任何通知 |
| **BEGIN** | 作業開始執行時寄信 |
| **END** | 作業正常結束時寄信 |
| **FAIL** | 作業失敗時寄信 |
| **ALL** | 包含 BEGIN、END、FAIL 所有狀況 |
:::
<br>
### **12. 服務品質 (QOS)**
- 在 Slurm 作業排程系統中,允許使用者針對作業的優先權與資源限制機制來進行調整。
- 本系統提供兩種關鍵方式影響計算工作:(1)提高排隊優先權、(2)延長計算工作時間。
- 可使用參數 <font color="blue"> **--qos=<qos>** </font> 指定該 Job 要使用哪一個 QOS 服務設定,**此參數功能需先經過申請,預設上無需加入此參數**。
```
#SBATCH --partition=ct112
#SBATCH --qos=express
```
<br>
### **13. 節點狀態 (Node State)**
在 Slurm 排程系統中,透過 `sinfo` 指令可查詢各個節點的狀態。
:::info
<i class="fa fa-exclamation-circle" aria-hidden="true"></i> **節點狀態欄位說明表:**
| 節點狀態 | 描述 |
|-|-|
| `idle` | 節點處於空閒狀態,尚未被任何 Job 佔用或排程等待執行 |
| `alloc` | 節點已被分配給某個 Job,但該 Job 可能尚未開始執行 |
| `mix` | 節點部分資源已分配(`alloc`),部分仍為空閒(`idle`) |
| `comp` | 節點上的作業已完成,正在進行作業清除與釋放資源動作 |
| `drain` |節點處於停用狀態,暫時無法接受作業排程|
| `down` | 節點故障或離線,無法正常運作與提供資源 |
| `fail` | 節點偵測到一個或多個(如 CPU、其他組件)發生故障 |
| `unknown` | 系統無法辨識節點的狀態 |
:::
<br>
### **14. 工作狀態 (Job State)**
在 Slurm 排程系統中,透過 `sacct` 指令可查詢 Job 的歷史執行狀態。
:::info
<i class="fa fa-exclamation-circle" aria-hidden="true"></i> **工作狀態欄位說明表:**
| 工作狀態 | 描述 |
|-|-|
| `COMPLETED` | 工作已成功執行並完成 |
| `FAILED` | 工作在執行過程中失敗終止 |
| `CANCELLED` | 工作在執行前或執行中被取消 |
| `TIMEOUT` | 工作超過所設定的最大執行時間而被系統強制終止 |
| `RUNNING` | 工作目前正在計算節點上執行中 |
| `PENDING` | 工作尚未執行,正在等待資源分配與排程 |
| `COMPLETING` | 工作執行結束,系統正在執行清理作業 |
| `NODE_FAIL` | 工作因計算節點失敗導致異常終止 |
| `SUSPENDED` | 工作暫時被中斷,等待恢復執行 |
| `REQUEUED` | 工作被重新排入佇列等待執行 |
:::
<br>
---
<br>
## Slurm 常用指令與參數
:::info
<i class="fa fa-exclamation-circle" aria-hidden="true"></i> **常用指令與功能說明表:**
<tr>
<td></td>
<td></td>
</tr>
<table>
<tr>
<td>指令</td>
<td>功能說明</td>
</tr>
<tr>
<td><code>sinfo</code></td>
<td>查詢目前佇列(Partition)清單與各節點狀態。</td>
</tr>
<tr>
<td><code>squeue</code></td>
<td > 查詢目前系統中所有已提交的 Job 狀態。</td>
</tr>
<tr>
<td><code>sbatch</code></td>
<td>建議使用指令,以 <code>batch</code>方式提交 Job,適合多節點運算。<br>必須指定 <code>--account = <PROJECT_ID></code></td>
</tr>
<tr>
<td><code>srun</code></td>
<td> 直接提交並執行 Job,需等待指令執行完成,適合進行程式除錯,能即時查看輸出結果。</td>
</tr>
<tr>
<td><code>salloc</code></td>
<td>提交互動式 Job,自動開啟一個 Shell,離開該 Shell 即自動終止作業。<br>可直接登入被分配的計算節點,適用於開發與除錯情境。
<br>必須指定 <code>--account = <PROJECT_ID></code></td>
</tr>
<tr>
<td><code>squeue</code></td>
<td>查詢目前已提交的 Job 狀態。</td>
</tr>
<tr>
<td><code>scontrol</code></td>
<td>查詢執行中 Job 的詳細資訊,包括分配的 CPU、記憶體與節點資源。</td>
</tr>
<tr>
<td><code>scancel</code></td>
<td>終止指定的 Job。</td>
</tr>
<tr>
<td><code>sacct</code></td>
<td>查詢帳號執行過的 Job 與各 Job Step 歷史紀錄。<br>若未指定時間,預設顯示過去 24 小時內之 Job 清單。</td>
</tr>
</table>
:::
<font color="red">➤ 若登入節點發生當機,使用 `salloc` 指令提交 Job 可能會導致中斷或除錯訊息遺失。因此,除非進行除錯或開發用途,**建議預先編輯 Job Script,並以** `sbatch` **指令提交計算工作**,以確保作業穩定執行。</font>
<br>
<div style="border-bottom: 1px solid #ccc; text-align: center; line-height: 0; margin: 2rem 0;">
<span style="background: #fff; padding: 0 10px; font-size: 18px; color: #555;"> <code>sinfo</code> 查詢目前佇列清單與各節點狀態
</span>
</div>
<br>
| 指令參數 | 說明 |
|-|-|
| `sinfo` | 查看所有 Partition 及節點狀態資訊 |
| `sinfo --states = idle` | 僅顯示目前處於 (idle) 狀態的節點 |
| `sinfo --partition = <partition>` | 查看指定 Partition 的節點資訊 |
| `sinfo -N -l` | 查詢節點狀態 |
| `sinfo --help` | 查看所有參數與使用說明 |
<br>
<div style="border-bottom: 1px solid #ccc; text-align: center; line-height: 0; margin: 2rem 0;">
<span style="background: #fff; padding: 0 10px; font-size: 18px; color: #555;"> <code>squeue</code> 查詢目前系統中所有已提交的 Job 狀態
</span>
</div>
<br>
| 指令參數 | 說明 |
|-|-|
| `squeue` | 查看已提交的 Job 狀態資訊 |
| `squeue -j <job_id>` | 查詢指定 Job ID 的詳細狀態 |
| `squeue -l` | 顯示詳細的 Job 資訊 |
| `squeue --state = <state>` | 查看指定狀態的 Job<br>常見指令:`R`(Running)、`PD`(Pending) |
| `squeue --help` | 查看所有選項與用法說明 |
<br>
<div style="border-bottom: 1px solid #ccc; text-align: center; line-height: 0; margin: 2rem 0;">
<span style="background: #fff; padding: 0 10px; font-size: 18px; color: #555;"> <code>scontrol</code> 查詢執行中 Job 的詳細資訊
</span>
</div>
<br>
| 指令參數 | 說明 |
|-|-|
| `scontrol show job <job_id>` | 顯示指定 Job 的詳細狀態與資源分配 |
| `scontrol show node <node>` | 顯示指定計算節點(Node)詳細的可用資源與目前狀態 |
<br>
<div style="border-bottom: 1px solid #ccc; text-align: center; line-height: 0; margin: 2rem 0;">
<span style="background: #fff; padding: 0 10px; font-size: 18px; color: #555;"> <code>scancel</code> 終止指定的 Job
</span>
</div>
<br>
| 指令參數 | 說明 |
|-|-|
| `scancel <job_id>` | 刪除 Job |
| `scancel -i -u $UID` | 互動式詢問並選擇刪除該用戶的 Job |
<br>
<div style="border-bottom: 1px solid #ccc; text-align: center; line-height: 0; margin: 2rem 0;">
<span style="background: #fff; padding: 0 10px; font-size: 18px; color: #555;"> <code>sacct</code> 查詢帳號執行過的 Job 和資源歷史紀錄
</span>
</div>
<br>
| 指令參數 | 說明 |
|-|-|
| `sacct` | 列出過去 24 小時內結束的 Job 清單 |
| `sacct -j <job_id>` | 列出指定已結束 Job |
| `sacct --starttime $(date -d "7 days ago" +%Y-%m-%d)` | 查詢過去 7 天內已完成 Job 記錄 |
| `sacct --help` | 查看所有支援的參數與選項 |