
本篇教學說明如何在高效能運算(HPC)環境中使用 Slurm 排程系統提交與管理批次作業,包含指令操作、#SBATCH 參數設定、作業佇列查詢、輸出檔管理與效能建議,協助使用者建立標準化的 HPC 作業流程。
發佈於 星期三,十一月 12 2025
Slurm 批次作業提交與資源使用教學
Slurm(Simple Linux Utility for Resource Management)是一套廣泛使用於高效能運算(HPC, High Performance Computing)環境中的開源工作排程系統。
它的主要功能是分配叢集中的計算資源(節點、CPU、GPU、記憶體等),並管理使用者提交的任務(jobs)。
透過 Slurm,使用者無需直接登入計算節點,而是將作業提交至系統,由排程器負責分配與執行。
在多使用者的計算叢集環境中,Slurm 是核心元件之一。它能同時處理大量任務佇列,根據各分區(partition)的設定與資源狀況,動態排程執行作業。
這種設計讓所有使用者能公平且高效地共享運算資源,同時維持系統穩定性。
批次作業的運作原理
Slurm 中的「批次作業」是最常見的使用方式。
使用者撰寫一份 shell 腳本,裡面包含兩類內容:
- 作業資源需求與設定(以
#SBATCH開頭的行)。 - 實際要執行的指令。
這份腳本由使用者透過 sbatch 提交,系統將它放入排程佇列中,等待資源可用後自動執行。
整個流程中,使用者不需要持續連線,只要稍後查看結果即可。
範例如下:
#!/bin/bash
#SBATCH --job-name=mpi_matmul
#SBATCH --output=mpi_matmul_%j.out
#SBATCH --error=mpi_matmul_%j.err
#SBATCH --partition=cpu
#SBATCH --nodes=1
#SBATCH --ntasks=4
#SBATCH --cpus-per-task=1
#SBATCH --mem=4G
#SBATCH --time=00:10:00
echo "Job started at $(date)"
echo "Running on nodes: $SLURM_NODELIST"
echo "Number of MPI processes: $SLURM_NTASKS"
module load mpi
mpirun -np $SLURM_NTASKS ./matrix_mpi 1000
echo "Job finished at $(date)"
這段腳本可直接提交給 Slurm:
sbatch mpi_matmul_job.sh
系統會回傳一個作業編號(Job ID),例如:
Submitted batch job 3124
之後可以使用 squeue 查詢進度:
squeue -u $USER
當作業完成後,輸出會被寫入 mpi_matmul_<jobid>.out 檔案中。
指令與參數說明
每一行 #SBATCH 開頭的語句稱為「directive」,它告訴 Slurm 這個作業需要什麼資源。
常見的設定如下:
-
--job-name=<名稱>
為作業指定名稱,方便在佇列中辨識。 -
--output=<檔案>
設定標準輸出結果的輸出檔案,可使用%j代表 Job ID。 -
--error=<檔案>
指定錯誤輸出檔案,若省略則與--output相同。 -
--partition=<分區名稱>
分區是系統管理員定義的資源群組。常見名稱如cpu、gpu、main、debug。
若未指定,Slurm 會使用標記為Default=YES的分區。 -
--nodes=<節點數>
指定使用的節點數量。一個節點通常對應一台伺服器。 -
--ntasks=<任務數>
指定作業中啟動的 MPI 任務數(processes)。 -
--cpus-per-task=<核心數>
每個任務使用的 CPU 核心數,常見於 OpenMP 程式。 -
--mem=<大小>或--mem-per-cpu=<大小>
設定作業需要的記憶體容量。例如--mem=8G或--mem-per-cpu=2G。 -
--time=<限制>
指定最長執行時間,上限超過設定會被自動中止。
格式可為D-HH:MM:SS或HH:MM:SS。 -
--gres=gpu:<數量>
在 GPU 分區中使用時,請求 GPU 資源。例如--gres=gpu:1。
這些選項能靈活組合,以滿足不同應用的需求。
例如,針對 2 節點、8 個 MPI 任務的作業:
#SBATCH --nodes=2
#SBATCH --ntasks=8
#SBATCH --partition=cpu
#SBATCH --time=01:00:00
資源使用與排程觀念
Slurm 的排程器會根據系統資源現況與分區政策進行分配。
不同分區可能有不同用途,例如:
cpu:一般運算節點。gpu:含有 GPU 的節點。debug:除錯測試用,執行時間短。long:允許長時間任務。interactive:提供互動式運算。
每個分區會有各自的時間上限與優先權。
若使用者未明確指定,系統會自動選擇預設分區(通常名稱後面帶有 *)。
範例:
sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
cpu* up 7-00:00:00 4 idle node[01-04]
gpu up 3-00:00:00 2 idle node[05-06]
debug up 00:30:00 1 idle node07
常見使用指令
| 指令 | 功能 |
|---|---|
sinfo | 查詢分區與節點狀態 |
squeue | 顯示目前排隊與執行的作業 |
squeue -u <username> | 只顯示特定使用者的作業 |
scontrol show job <jobid> | 顯示指定作業的詳細資訊 |
scancel <jobid> | 取消作業 |
sacct | 查詢已完成作業的歷史紀錄 |
srun | 直接啟動互動式作業(即時執行) |
互動式使用方式範例:
srun --partition=cpu --ntasks=4 --time=00:20:00 --pty bash
這會在可用節點上啟動一個互動工作環境,離開時輸入 exit。
作業腳本實例
單節點多核心任務
#!/bin/bash
#SBATCH --job-name=omp_test
#SBATCH --output=omp_test.out
#SBATCH --partition=cpu
#SBATCH --cpus-per-task=8
#SBATCH --time=00:30:00
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
./openmp_program
多節點 MPI 任務
#!/bin/bash
#SBATCH --job-name=mpi_job
#SBATCH --output=mpi_job.out
#SBATCH --partition=cpu
#SBATCH --nodes=2
#SBATCH --ntasks=8
#SBATCH --time=01:00:00
mpirun -np $SLURM_NTASKS ./matrix_mpi 2000
GPU 任務
#!/bin/bash
#SBATCH --job-name=gpu_train
#SBATCH --output=gpu_train.out
#SBATCH --partition=gpu
#SBATCH --gres=gpu:1
#SBATCH --time=02:00:00
nvidia-smi
python3 train_model.py
作業監控與結果分析
在作業執行過程中,可隨時使用 squeue 查詢狀態。
欄位說明如下:
| 欄位 | 說明 |
|---|---|
JOBID | 作業編號 |
PARTITION | 分區名稱 |
NAME | 作業名稱 |
USER | 使用者名稱 |
ST | 狀態(R=Running, PD=Pending) |
TIME | 執行時間 |
NODES | 使用節點數 |
NODELIST(REASON) | 節點列表或等待原因 |
例如:
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
3124 cpu* mpi_test alice R 0:31 1 node03
3125 gpu train bob PD 0:00 1 (Priority)
作業完成後,可用 sacct 查詢歷史紀錄:
sacct -j 3124 --format=JobID,JobName,Partition,Elapsed,State
結語
Slurm 是現今 HPC 系統的標準排程平台。
透過編寫清晰的批次腳本並正確設定 #SBATCH 參數,使用者可以高效利用叢集資源,完成並行計算、深度學習訓練與科學模擬等工作。
#SBATCH --partition=cpu 是最常見的設定之一,它代表該作業將在純 CPU 節點上執行。
熟悉各分區的特性、作業生命週期與常用指令,是有效操作 HPC 系統的基礎。
HPC
Linux


