<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` | 查看所有支援的參數與選項 |