NYCU CSIT HPC service
Access login node
ssh <username>@hpclogin[01-03].cs.nycu.edu.tw
Setup environment
Note
- 若課程有任何軟體需求,請助教來信告知
- 建議使用 bash
若助教有先告知課程軟體需求,會根據需求產生對應套件環境。
Example
以「平行程式設計」課程作範例,課程環境名稱為 pp。
本 HPC 服務使用 lmod 來管理軟體環境,使用者可以透過 module 指令來載入課程環境。
$ module load pp
想退出環境可以使用:
$ module unload pp
重新登入之後,本來啟用的環境不會保留,如果想要每次登入都自動載入環境,可以將 module load pp 加入到 .bashrc 中。
Using lmod on fish
預設情況下,Lmod 會自動支援 bash、zsh、tcsh 等 shell,但 fish shell 需要手動啟用相應初始化設定。
若你使用 fish shell,請在你的個人設定檔中加入以下內容:
nano ~/.config/fish/config.fish
在檔案中加入這一行:
source /usr/share/lmod/lmod/init/fish
儲存後重新啟動一個新的 fish session,或執行:
source ~/.config/fish/config.fish
即可啟用 module 指令
Submit job
Caution
- 無法直接使用
srun指令是正常的,請使用sbatch指令用腳本發送 job- 須確保程式中讀寫的檔案以及程式本身在 NFS 中,否則會執行異常或看不到結果
To simply put, just prepare your job script, then use sbatch <script name>.sh to submit job
Examples
Submit a MPI job
- 準備好程式
-
mpi.cpp
#include <mpi.h>
#include <stdio.h>
int main(int argc, char** argv) {
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
char processor_name[MPI_MAX_PROCESSOR_NAME];
int name_len;
MPI_Get_processor_name(processor_name, &name_len);
printf("Hello world from processor %s, rank %d out of %d processors\n",
processor_name, world_rank, world_size);
MPI_Finalize();
}
- 在 Login node 上編譯
user@login01:~$ mpic++ mpi.cpp
- 準備好 sbatch script,在 Login node 上發 job
user@login01:~$ sbatch test.sh
-
test.sh
#!/bin/bash
#SBATCH -A general # Account name (可透過 sshare 查看)
#SBATCH -p class_nodes # Partition name (可透過 sinfo 查看 partition)
#SBATCH -n 3 # Number of MPI tasks (i.e. processes)
#SBATCH -c 1 # Number of cores per MPI task
#SBATCH -N 3 # Maximum number of nodes to be allocated
#SBATCH -t 00:05:00 # (--time) Wall time limit (days-hrs:min:sec)
# 還有很多其他參數,可參考官方文件(https://slurm.schedmd.com/sbatch.html)
export PMIX_MCA_psec="^munge"
srun --mpi=pmix ./a.out
-
可以透過
squeue查看 job 排隊/運行狀況,或是用sacct查看以往的 job (包含剛剛發出的) -
完成後,可以在家目錄看到
slurm-<job id>.out的文字檔,可以直接查看結果
user@login01:~$ cat slurm-74.out
Hello world from processor cmpt001.hpc.cc.cs.nctu.edu.tw, rank 0 out of 3 processors
Hello world from processor cmpt002.hpc.cc.cs.nctu.edu.tw, rank 1 out of 3 processors
Hello world from processor cmpt003.hpc.cc.cs.nctu.edu.tw, rank 2 out of 3 processors
Submit a job using GPU
Take cuda-samples for example.
-
Prepare your code
user@login01:~$ git clone https://github.com/NVIDIA/cuda-samples.git -
Compile it
cd cuda-samples/Samples/1_Utilities/deviceQuery && cmake . && make -
Prepare sbatch script
test.sh
#!/bin/bash
#SBATCH -A general # Account name (可透過 sshare 查看)
#SBATCH -p class_nodes # Partition name (可透過 sinfo 查看 partition)
#SBATCH -N 1 # Maximum number of nodes to be allocated
#SBATCH --gres=gpu:1 # specify GPU number
# 還有很多其他參數,可參考官方文件(https://slurm.schedmd.com/sbatch.html)
export LD_PRELOAD=/lib/x86_64-linux-gnu/libcuda.so.1 # for CUDA driver API
./deviceQuery
- 透過
sbatch發送 job
user@login01:~/cuda-samples/Samples/1_Utilities/deviceQuery$ sbatch test.sh
之後一樣會在當前目錄看到 slurm-<job id>.out 的文字檔,可以直接查看結果
Cancel job
為避免一個使用者發出大量 job 佔據大多資源,所以有限制一個使用者同時就只能發一個 job。若上個 job 發錯,想要發新的 job 就需要 cancel 上個 job
scancel -u <your username>
Apptainer 使用說明
Apptainer 是由 Singularity 分支出的 rootless container 專案,因為被 Linux Foundation 納入維護,所以選擇使用它而非 singularity-ce(community edition)。
Apptainer setup
Apptainer 已透過 Spack 安裝於系統中,透過lmod啟用環境後即可直接使用:
ml container
# check apptainer command existence
apptainer --version
使用者無需自行安裝。
建立 Apptainer Image
Build image(使用 definition file)
apptainer build <image>.sif <definition>.def
Pull image(從 Docker Hub)
Apptainer 可直接讀取 Docker Hub image 並轉為 .sif:
# 這會輸出ubuntu_20.04.sif
apptainer pull docker://ubuntu:20.04
或指定輸出檔名:
apptainer pull <filename>.sif docker://ubuntu:20.04
Apptainer Definition File(.def)說明
一個標準的 .def 檔通常包含以下區段:
-
Header
定義映像檔來源。- Bootstrap: 來源類型 (如 docker, library, localimage)。
- From: 具體的映像檔名稱 (如 ubuntu:20.04, debian:bullseye-slim)。
-
%environment- 執行時機:每次執行容器(run / exec / shell)
- 用途:設定環境變數(PATH、LD_LIBRARY_PATH)
-
%post- 執行時機:Build image 過程中
- 權限:容器內具有 root 權限
- 用途:安裝套件、編譯程式
-
%runscript- 執行時機:
apptainer run <image>.sif - 用途:容器預設執行指令(類似 Docker ENTRYPOINT)
- 執行時機:
Example usage
1. OSU Micro-Benchmarks(MPI)
Build image
- Definition file:
osu.def
Bootstrap: docker
From: debian:12-slim
%environment
export PMIX_MCA_gds=^ds12
export PMIX_MCA_psec=^munge
export OSU_DIR=/opt/libexec/osu-micro-benchmarks/mpi
%post
apt-get -y update && \
DEBIAN_FRONTEND=noninteractive apt-get -y install \
build-essential libopenmpi-dev wget
cd /root
wget https://mvapich.cse.ohio-state.edu/download/mvapich/osu-micro-benchmarks-7.5-1.tar.gz
tar -xzf osu-micro-benchmarks-7.5-1.tar.gz
cd osu-micro-benchmarks-7.5-1
./configure --prefix=/opt CC=/usr/bin/mpicc CXX=/usr/bin/mpicxx
make -j6 && make install
%runscript
echo "Rank ${SLURM_PROCID} - Running: ${OSU_DIR}/$*"
exec ${OSU_DIR}/$*
在 login node 執行
apptainer build osu.sif osu.def
查看容器內檔案系統
想確認 OSU_DIR 底下有什麼可以透過 apptainer exec <image> <command> 去查看容器內部的檔案系統。
apptainer exec osu.sif ls -R /opt/libexec/osu-micro-benchmarks/mpi
在 Slurm 環境中執行
範例:OSU Micro-Benchmarks(MPI)執行腳本
-
run_osu.sh
#!/bin/bash
#SBATCH --job-name=osu_test
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=1
#SBATCH --output=osu_bw.out
#SBATCH --partition=class_nodes
IMAGE="osu.sif"
srun --mpi=pmix apptainer run $IMAGE pt2pt/osu_bw
在 login node 執行
sbatch run_osu.sh
2. CUDA Sample: deviceQuery (GPU)
Build image
- Definition file:
sample.def
Bootstrap: docker
From: nvidia/cuda:12.8.1-base-ubuntu24.04
%post
sed -i 's|http://archive.ubuntu.com/ubuntu/|http://ubuntu.cs.nycu.edu.tw/ubuntu/|g' /etc/apt/sources.list.d/ubuntu.sources
apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get -y install wget cmake make unzip cuda-compiler-12.8
apt-get clean autoclean && apt-get autoremove --yes && rm -rf /var/lib/apt/lists/*
cd /opt
wget https://github.com/NVIDIA/cuda-samples/archive/refs/heads/master.zip
unzip master.zip
cd cuda-samples-master
cd Samples/1_Utilities/deviceQuery
cmake .
make -j$(nproc)
rm /opt/master.zip
在 login node 執行
apptainer build sample.sif sample.def
在 Slurm 環境中執行
於 login node 下 sbatch sample.sh 指令
-
sample.sh
#!/bin/bash
#SBATCH -A <account> # specify your account name
#SBATCH -p class_nodes
#SBATCH -N 1
#SBATCH --gres=gpu:1
#apptainer exec --nv sample.sif nvidia-smi
apptainer exec --nv sample.sif /opt/cuda-samples-master/Samples/1_Utilities/deviceQuery/deviceQuery
3. PyTorch with CUDA (GPU)
Build image
- Definition file:
torch.def
Bootstrap: docker
From: nvidia/cuda:12.8.1-base-ubuntu24.04
%post
sed -i 's|http://archive.ubuntu.com/ubuntu/|http://ubuntu.cs.nycu.edu.tw/ubuntu/|g' /etc/apt/sources.list.d/ubuntu.sources
apt-get -y update && DEBIAN_FRONTEND=noninteractive apt-get -y install python3 python3-pip
apt-get clean autoclean && apt-get autoremove --yes && rm -rf /var/lib/apt/lists/*
pip3 install --no-cache-dir torch torchvision --break-system-packages
在 login node 執行
apptainer build torch.sif torch.def
在 Slurm 環境中執行
於 login node 下 sbatch pytorch.sh 指令
-
pytorch.sh
#!/bin/bash
#SBATCH -A <account> # specify your account name
#SBATCH -p class_nodes
#SBATCH -N 1
#SBATCH --gres=gpu:nvidia_geforce_rtx_5050:1
apptainer exec --nv torch.sif python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0));"