Infinirc
使用 Slurm 提交 HPC 作業的完整流程
使用 Slurm 提交 HPC 作業的完整流程

本篇教學說明如何在高效能運算(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 腳本,裡面包含兩類內容:

  1. 作業資源需求與設定(以 #SBATCH 開頭的行)。
  2. 實際要執行的指令。

這份腳本由使用者透過 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=<分區名稱>
    分區是系統管理員定義的資源群組。常見名稱如 cpugpumaindebug
    若未指定,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:SSHH: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