계산 작업 올리기

최초 게시일: 2021-05-02 / 최근 수정일: 2023-10-01


계산 작업은 프론트엔드 서버 gmunu.kasi.re.kr에서 계산 작업 명령어를 통해 실행한다. gmunu 서버는 Slrum 작업 관리를 사용한다. 계산 작업을 올리기 위해서는 아래의 명령어를 실행한다.

$ sbatch your_jobscript

여기서 your_jobscript는 계산 작업을 올리기 위한 파일로 주요 사용하는 옵션은 아래 표로 정리해 두었다.

옵션 설명
--job-name 작업 이름.
--partition 파티션 이름. 현재 gmunu 서버는 normal 파티션만 존재한다.
--time 계산 시간. 날짜-시간:분:초 형식으로 작성.
--nodes 계산에 총 필요한 노드 수.
--ntasks 계산에 필요한 총 MPI task 수.
--cpus-per-task 각 MPI task 당 필요한 cpu 수.
--output stdout 파일 명
--error stderr 파일 명
--exclusive 계산 작업이 노드를 점유하고 있을때 계산하지 않고 남아 있는 cpu가 있더라도 작업이 들어오지 못하게 함
--chdir 계산이 일어나는 디렉토리와 잡을 올리는 디렉토리가 다를 경우 계산 디렉토리 지정

여기에서 --nodes, --ntasks, --cpus-per-task 옵션이 혼동 될 수 있어 몇가지 예를 들면 아래와 같다.

  • 1개의 노드에서 MPI를 사용하지 않고 OpenMP로 병렬화 해 128 cpu를 모두 이용하는 경우
--nodes = 1
--ntasks = 1
--cpus-per-task = 128
  • 2개의 노드에서 MPI로만 병렬화 해 총 256 cpu를 모두 이용하는 경우
--nodes = 2
--ntasks = 256
--cpus-per-task = 1
  • 2개의 노드에서 MPI와 OpenMP로 모두 병렬화해 총 32개의 MPI 작업과 (노드당 16개 MPI task) 각각의 MPI 작업에서 OpenMP 병렬화로 8개의 cpu를 사용해 총 256 cpu를 (32 MPI tasks x 8 OpenMP = 256) 모두 이용하는 경우
--nodes = 2
--ntasks = 32
--cpus-per-task = 8

더 자세한 내용은 gmunu에 접속 후 아래 내용을 입력하면 자세한 옵션이 표시된다.

$ man sbatch

단일노드 openmp 병렬화, MPI 병렬화, openmp + MPI 하이브리드 병렬화에 따라 잡스크립트 파일 내용이 달라진다. 아래 내용은 세가지 방법에 대한 잡스크립트 예시로 파일에 복사 붙여넣기 하여 사옹하면 된다.

 

Openmp 병렬 코드
#!/bin/bash
#SBATCH --job-name OpenMP_job
#SBATCH --partition normal
#SBATCH --time 7-00:00:00
#SBATCH --nodes 1
#SBATCH --ntasks 1
#SBATCH --cpus-per-task 128
#SBATCH --output OpenMP_job.o%j
#SBATCH --error OpenMP_job.e%j

module load gcc/12.1.0 # 컴파일시 사용한 모든 모듈을 부른다.
export OMP_NUM_THREADS=128 # 사용할 cpu 갯수 (--cpus-per-task 값과 같아야 함.)

echo "Working directory"
pwd
echo "List of Modules"
module list

echo "Starting"
date
srun ./OpenMP_job_executable

echo "Stopping"
date
MPI 병렬 코드
#!/bin/bash
#SBATCH --job-name MPI_job
#SBATCH --partition normal
#SBATCH --time 7-00:00:00
#SBATCH --nodes 2
#SBATCH --ntasks 256
#SBATCH --cpus-per-task 1
#SBATCH --output MPI_job.o%j
#SBATCH --error MPI_job.e%j

module load gcc/12.1.0 openmpi/4.1.2 # 컴파일시 사용한 모든 모듈을 부른다.

echo "Working directory"
pwd
echo "List of Modules"
module list

echo "Starting"
date
srun --mpi=pmi2 ./MPI_job_executable

echo "Stopping"
date
MPI + Openmp 병렬 코드
#!/bin/bash
#SBATCH --job-name MPI_OpenMP_job
#SBATCH --partition normal
#SBATCH --time 7-00:00:00
#SBATCH --nodes 2
#SBATCH --ntasks 32
#SBATCH --cpus-per-task 8
#SBATCH --output MPI_OpenMP_job.o%j
#SBATCH --error MPI_OpenMP_job.e%j

module load gcc/12.1.0 openmpi/4.1.2 # 컴파일시 사용한 모든 모듈을 부른다.
export OMP_NUM_THREADS=8 # OpenMP에 사용할 cpu 갯수 (--cpus-per-task 값과 같아야 함.)

echo "Working directory"
pwd
echo "List of Modules"
module list

echo "Starting"
date
srun --mpi=pmi2 ./MPI_OpenMP_job_executable

echo "Stopping"
date

주의사항

  • 컴파일시 사용한 모듈을 계산 작업 스크립트에도 꼭 넣어 주어야 한다.
  • 위 예제는 계산 작업이 일어나는 디렉토리에서 계산 작업을 올릴 경우에 대한 스크립트이다. 두 디렉토리가 다를경우 --chdir 옵션을 이용해 디렉토리를 지정해 주어야 한다.

그 외 다양한 명령어 정리

  • 제출된 작업 확인
$ squeue
  • 제출된 작업 삭제: JOBID는 작업 제출시 표시되고 squeue 명령어를 통해 확인 가능
$ scancel JOBID
  • 파티션 목록 확인
$ sinfo

PARTITION AVAIL  TIMELIMIT  NODES  STATE NODELIST 
normal*      up   infinite      1  down* node3 
normal*      up   infinite      2   idle node[1-2] 
  • 파티션 세부 정보 확인 (현재 normal 파티션만 존재)
$ scontrol show partition

PartitionName=normal
   AllowGroups=ALL AllowAccounts=ALL AllowQos=ALL
   AllocNodes=ALL Default=YES QoS=N/A
   DefaultTime=NONE DisableRootJobs=NO ExclusiveUser=NO GraceTime=0 Hidden=NO
   MaxNodes=UNLIMITED MaxTime=UNLIMITED MinNodes=0 LLN=NO MaxCPUsPerNode=UNLIMITED
   Nodes=node[1-3]
   PriorityJobFactor=1 PriorityTier=1 RootOnly=NO ReqResv=NO OverSubscribe=EXCLUSIVE
   OverTimeLimit=NONE PreemptMode=OFF
   State=UP TotalCPUs=320 TotalNodes=3 SelectTypeParameters=NONE
   JobDefaults=(null)
   DefMemPerNode=UNLIMITED MaxMemPerNode=UNLIMITED