스케줄러(SLURM)를 통한 작업 실행
Neuron 시스템의 작업 스케쥴러는 SLURM을 사용합니다. 이 장에서는 SLURM을 통해 작업 제출하는 방법 및 관련 명령어들을 소개합니다. SLURM에 작업 제출을 위한 작업 스크립트 작성법은 [별첨1]과 작업스크립트 파일 작성 예시를 참고 부탁드립니다.
※ 사용자 작업은 /scratch/$USER 에서만 제출 가능합니다.
가. 큐 구성
cas_v100nv_8
gpu[01-02,04-05]
12
10
32
32/8
cas_v100nv_4
gpu[06-08]
8
4
12
40/4
cas_v100_4
gpu[10-20]
20
10
44
40/4
cas_v100_2
gpu[25-26,29]
12
6
6
32/2
amd_a100_4
gpu[44,45]
2
2
8
64/4
amd_a100nv_8
gpu[33-35, 49-43]
20
10
88
64/8
eme_h200nv_8
gpu[46,50]
4
2
16
96/8
gh200_1
gpu[51-52]
12
6
2
72/1
amd_h200nv_8
gpu[53-56]
4
2
32
96/8
amd_h100_2
gpu[57-58]
2
1
4
48/2
cpu
cpu[01-06]
8
4
-
48/-
bigmem
bigmem01
8
4
-
48/-
bigmem
bigmem02
8
4
-
56/-
bigmem
bigmem03
8
4
-
24/-
bigmem
bigmem04
8
4
-
48/-
기본wall clock time 시간: 2일 (48시간)
jupyter.ksc.re.kr 에서 submit 되는 jupyter 작업의 wall clock time은 24시간
인터렉티브 작업의 wall clock time은 8시간
모든 큐(파티션)에서 작업 할당은 공유 노드 정책(하나의 노드에 복수개 작업 동시 수행 가능)이 적용됩니다.(22.03.17. 이후) - 자원 활용의 효율성을 위해 기존 배타적 노드 정책에서 공유 노드 정책으로 변경되었습니다.
작업 큐(파티션)
일반사용자가 사용할 수 있는 파티션은 jupyter, cas_v100nv_8, cas_v100nv_4, cas_v100_4, cas_v100_2, amd_a100nv_8, skl, bigmem, eme_h200nv_8, gh200_1 으로 구성되어 있습니다. (sinfo 명령으로 노드 수, 최대 작업 실행 시간, 노드 리스트 확인 가능)
gh200_1 파티션의 계산노드는 AArch64 아키텍처로 로그인 노드 및 다른 계산노드의 바이너리 실행 시 오류가 발생하며 ARM_ 접두어가 붙은 전용 module을 사용하여야 합니다.
작업 제출 개수 제한
사용자별 최대 제출 작업 개수 : 초과하여 작업을 제출한 경우 제출 시점에 에러 발생합니다.
사용자별 최대 실행 작업 개수 : 초과하여 작업을 제출한 경우 이전 작업이 끝날 때까지 기다립니다.
리소스점유제한
작업별 최대 노드 점유 개수 : 초과하여 작업을 제출한 경우 작업이 실행되지 않습니다. 사용자의 실행 중인 여러 작업이 한 시점에 점유하고 있는 노드 개수와는 무관합니다.
사용자별 최대 GPU 점유 개수 : 사용자별 총 GPU 점유 개수를 제한하는 설정으로 초과하는 경우 이전 작업이 끝날 때까지 기다립니다. 사용자의 실행 중인 여러 작업이 한 시점에 점유하고 있는 GPU 개수를 제한합니다.
※ 노드 구성/파티션은 시스템 사용량에 따라 시스템 운영 중에 조정될 수 있습니다.
나. 작업 제출 및 모니터링
1. 기본명령어 요약
명령어
내용
$ sbatch [옵션..] 스크립트
작업 제출
$ scancel 작업ID
작업 삭제
$ squeue
작업 상태 확인
$ smap
작업 상태 및 노드 상태 그래픽으로 확인
$ sinfo [옵션..]
노드 정보 확인
※ sinfo --help 명령어를 이용하여 sinfo의 옵션을 확인하실 수 있습니다.
※ Neuron 시스템 사용자 편익 증대를 위한 자료 수집의 목적으로, 아래와 같이 SBATCH 옵션을 통한 사용 프로그램 정보 작성을 의무화 합니다. 즉, 사용하는 어플리케이션에 맞게 SBATCH의 --comment 옵션을 아래 표를 참조하여 반드시 기입한 후 작업을 제출해야 합니다.
※ 딥러닝 또는 기계학습을 위한 application을 사용하시는 경우 tensorflow, caffe, R, pytorch 등으로 구체적으로 명시해주시기 바랍니다.
※ 어플리케이션 구분을 추가는 주기적으로 수집된 사용자 요구에 맞추어 진행됩니다. 추가를 원하시면 consult@ksc.re.kr로 해당 어플리케이션에 대한 추가 요청을 해주시기 바랍니다.
[Application 별 SBATCH 옵션 이름표]
Application종류
SBATCH 옵션 이름
Application종류
SBATCH 옵션 이름
Charmm
charmm
LAMMPS
lammps
Gaussian
gaussian
NAMD
namd
OpenFoam
openfoam
Quantum Espresso
qe
WRF
wrf
SIESTA
siesta
in-house code
inhouse
Tensorflow
tensorflow
PYTHON
python
Caffe
caffe
R
R
Pytorch
pytorch
VASP
vasp
Sklearn
sklearn
Gromacs
gromacs
그 외 applications
etc
2. 배치 작업 제출
sbatch 명령을 이용하여 “sbatch {스크립트 파일}” 과 같이 작업을 제출 합니다.
$ sbatch [UserJob.script] 작업 진행 확인 할당 받은 노드에 접속하여 작업 진행 여부를 확인할 수 있습니다.
1) squeue 명령어로 진행 중인 작업이 할당된 노드명(NODELIST)을 확인
$ squeue -u [userID]
JOBID PARTITION NAME USER STATE TIME TIME_LIMI NODES NODELIST(REASON)
99792 cas_v100_4 ior userID RUNNING 0:12 5:00:00 1 gpu252) ssh 명령을 이용하여 해당 노드에 접속
$ ssh gpu25 3) 계산노드에 진입하여 top 또는 nvidia-smi 명령어를 이용하여 작업 진행 여부 조회 가능
※ 2초 간격으로 GPU 사용률을 모니터링 하는 예제입니다.
$ nvidia-smi -l 2작업 스크립트 파일 작성 예시입니다.
SLURM에서 배치 작업을 수행하기 위해서는 SLURM 키워드들을 사용하여 작업 스크립트 파일을 작성해야 합니다.
※ ‘[별첨1] 작업스크립트 파일 주요 키워드’를 참조바랍니다.
※ 기계학습 프레임워크 Conda 활용은 부록 Conda 가이드를 참조바랍니다.
SLURM 키워드
#SBATCH –J
작업명 지정
#SBATCH --time
최대 작업 수행 시간 지정
#SBATCH –o
작업 로그 파일명 지정
#SBATCH –e
에러 로그 파일명 지정
#SBATCH –p
사용할 파티션 지정
#SBATCH --comment
사용할 애플리케이션명
#SBATCH -–nodelist=(노드 리스트)
작업을 수행할 노드 지정
#SBATCH -–nodes=(노드 수)
작업을 수행할 노드 수 지정
#SBATCH --ntasks-per-node=(프로세스 수)
노드 당 수행될 프로세스 수 지정
#SBATCH --cpus-per-task=(cpu core 수)
프로세스 당 할당될 cpu core 수
#SBATCH --cpus-per-gpu=(cpu core 수)
GPU 당 할당될 cpu core 수
#SBATCH --exclusive
노드를 전용으로 사용하기 위한 옵션
뉴론 공유 노드 정책에서 메모리 할당량 설정 뉴론 시스템 자원 활용의 효율성 및 사용자의 안정적인 작업 수행을 위하여 아래와 같이 메모리 할당량이자동 조절됩니다.
memory-per-node = ntasks-per-node * cpus-per-task * (단일 노드 메모리 가용량의 95% / 단일 노드 총 core 수)※ '--exclusive 옵션 사용시에 단일 노드 메모리 가용량의 95%가 작업에 할당되며, 노드를 전용으로 사용할 수 있습니다. 단, 전용으로 사용가능한 노드가 확보될 때까지 대기 시간이 길어질 수 있습니다.
뉴론 공유 노드 정책에서 GPU 당 CPU core 할당 개수 설정 GPU 어플리케이션의 안정적인 수행을 위해 노드당 CPU core 개수를 GPU에 비례하여 아래와 같이 기본 할당됩니다. (메모리 용량도 자동으로 설정, 참조: 뉴론 공유 노드 정책에서 메모리 할당량 설정)
cpus-per-gpu = node의 총 core 수 / node의 총 GPU 수 * 요청 GPU 수(--gres=gpu:x)※ 메모리 요구량 추가로 필요한 경우 기본 할당된 cpus-per-gpu 수 보다 크게 자원을 요청하여 메모리 할당량을 확보할 수 있습니다.
CPU Serial 프로그램
#!/bin/sh
#SBATCH -J Serial_cpu_job
#SBATCH -p skl
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --comment xxx #Application별 SBATCH 옵션 이름표 참고
export OMP_NUM_THREADS=1
module purge
module load intel/19.1.2
srun ./test.exe
exit 0※ 1노드 점유, 순차 사용 예제
CPU OpenMP 프로그램
#!/bin/sh
#SBATCH -J OpenMP_cpu_job
#SBATCH -p skl
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=10
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --comment xxx #Application별 SBATCH 옵션 이름표 참고
export OMP_NUM_THREADS=10
module purge
module load intel/19.1.2
mpirun ./test_omp.exe
exit 0※ 1노드 점유, 노드 당 10스레드 사용 예제
CPU MPI 프로그램
#!/bin/sh
#SBATCH -J MPI_cpu_job
#SBATCH -p skl
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --comment xxx #Application별 SBATCH 옵션 이름표 참고
module purge
module load intel/19.1.2 mpi/impi-19.1.2
mpirun ./test_mpi.exe※ 2노드 점유, 노드 당 4 프로세스(총 8 MPI 프로세스) 사용 예제
CPU Hybrid (OpenMP+MPI) 프로그램
#!/bin/sh
#SBATCH -J hybrid_cpu_job
#SBATCH -p skl
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=2
#SBATCH --cpus-per-task=10
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --comment xxx #Application별 SBATCH 옵션 이름표 참고
module purge
module load intel/19.1.2 mpi/impi-19.1.2
export OMP_NUM_THREADS=10
mpirun ./test_mpi.exe※ 1노드 점유, 노드 당 2 프로세스, 프로세스 당 10 스레드(총 2 MPI 프로세스, 20 OpenMP 스레드) 사용 예제
GPU Serial 프로그램
#!/bin/sh
#SBATCH -J Serial_gpu_job
#SBATCH -p cas_v100_4
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --gres=gpu:1 # using 2 gpus per node
#SBATCH --comment xxx #Application별 SBATCH 옵션 이름표 참고
export OMP_NUM_THREADS=1
module purge
module load intel/19.1.2 cuda/11.4
srun ./test.exe
exit 0※ 1노드 점유, 순차 사용 예제
GPU OpenMP 프로그램
#!/bin/sh
#SBATCH -J openmp_gpu_job
#SBATCH -p cas_v100_4
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=10
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --gres=gpu:2 # using 2 gpus per node
#SBATCH --comment xxx #Application별 SBATCH 옵션 이름표 참고
export OMP_NUM_THREADS=10
module purge
module load intel/19.1.2 cuda/11.4
srun ./test_omp.exe
exit 0※ 1노드 점유, 노드 당 10스레드 2GPU 사용 예제
GPU MPI 프로그램
#!/bin/sh
#SBATCH -J mpi_gpu_job
#SBATCH -p cas_v100_4
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=4
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --gres=gpu:2 # using 2 gpus per node
#SBATCH --comment xxx #Application별 SBATCH 옵션 이름표 참고
module purge
module load intel/19.1.2 cuda/11.4 cudampi/mvapich2-2.3.6
srun ./test_mpi.exe※ 2노드 점유, 노드 당 4 프로세스(총 8 MPI 프로세스), 노드당 2GPU 사용 예제
GPU MPI 프로그램 - 1 node의 모든 CPU를 점유하는 실행예제
#!/bin/sh
#SBATCH -J mpi_gpu_job
#SBATCH -p cas_v100_4
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=40
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --gres=gpu:2
#SBATCH --comment xxx
module purge
module load intel/19.1.2 cuda/11.4 cudampi/mvapich2-2.3.6
srun ./test_mpi.exe※ cas_v100_4 1개 노드 모든 core 점유, 2GPU 사용 예제
GPU MPI 프로그램 - 1 node CPU의 절반만 점유하는 실행 예제
#!/bin/sh
#SBATCH -J mpi_gpu_job
#SBATCH -p cas_v100nv_8
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=16
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --gres=gpu:4
#SBATCH --comment xxx
module purge
module load intel/19.1.2 cuda/11.4 cudampi/mvapich2-2.3.6
srun ./test_mpi.exe※ cas_v100nv_8 1개 노드의 절반 core 점유, 4 GPU 사용 예제
※ 파티션별 총 core 수는 스케줄러(SLURM)를 통한 작업 실행 > 가. 큐 구성 > Total CPU core 수 참고 바랍니다.
많은 메모리 할당이 필요한 프로그램 실행 예제
#!/bin/sh
#SBATCH -J mem_alloc_job
#SBATCH -p cas_v100_4
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=40
#SBATCH -o %x_%j.out
#SBATCH -e %x_%j.err
#SBATCH --time=01:00:00
#SBATCH --comment xxx #Application별 SBATCH 옵션 이름표 참고
module purge
module load intel/19.1.2 mpi/impi-19.1.2
mpirun -n 2 ./test.exe
exit 0※ 프로그램 실행에 사용할 core 수는 적으나, 메모리 사용량이 큰 경우 노드당 수행될 프로세스 수로 메모리 할당량을 조절하여 프로그램 실행하는 예제
※'--mem' (노드 당 메모리 할당) 옵션은 사용 불가합니다. 노드 당 수행될 프로세스 수(ntasks-per-node)와 프로세스 당 할당될 cpu core 수(cpus-per-task)를 입력하면 아래 수식에 따라 메모리 할당량이 자동 계산됩니다. (memory-per-node = ntasks-per-node * cpus-per-task * (단일 노드 메모리 가용량의 95% / 단일 노드 총 core 수)
※'--exclusive 옵션 사용시에 단일 노드 메모리 가용량의 95%가 작업에 할당되며, 노드를 전용으로 사용할 수 있습니다. 단 전용으로 사용가능한 노드가 확보될 때까지 대기 시간이 길어질 수 있습니다.
3. 인터렉티브 작업 제출
※ 인터렉티브 작업 제출 시, 로그인 노드의 환경설정이 전달되므로 gh200_1 파티션으로 작업 제출할 때는 module purge 이후 작업 제출하거나, 계산노드 접속 후 module purge 후 필요한 ARM module 설정 권장
자원 할당 cas_v100_4 파티션의 gpu 2노드(각각 2core, 2gpu)를 interactive 용도로 사용
$ salloc --partition=cas_v100_4 --nodes=2 --ntasks-per-node=2 --gres=gpu:2 --comment={SBATCH 옵션이름} #Application별 SBATCH 옵션 이름표 참고※ 인터렉티브 작업의 walltime은 8시간으로 고정됨
작업 실행
$ srun ./(실행파일) (실행옵션)진입한 노드에서 나가기 또는 자원 할당 취소
$ exit커맨드를 통한 작업 삭제
$ scancel [Job_ID]※ Job ID는 squeue 명령으로 확인 가능
4. 작업 모니터링
파티션 상태 조회 sinfo 명령을 이용하여 조회
$ sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
jupyter up 2-00:00:00 1 mix jupyter01
jupyter up 2-00:00:00 1 idle jupyter02
cas_v100nv_8 up 2-00:00:00 4 mix gpu[01-04]
cas_v100nv_4 up 2-00:00:00 2 mix gpu[07,09]
cas_v100nv_4 up 2-00:00:00 1 alloc gpu08
cas_v100_4 up 2-00:00:00 1 plnd gpu18
cas_v100_4 up 2-00:00:00 9 mix gpu[10,12-17,19-20]
cas_v100_4 up 2-00:00:00 1 alloc gpu11
cas_v100_2 up 2-00:00:00 3 idle gpu[25-26,29]
amd_a100nv_8 up 2-00:00:00 1 mix gpu31
amd_a100nv_8 up 2-00:00:00 8 alloc gpu[30,32-37,43,44-45]
eme_h200nv_8 up 2-00:00:00 3 plnd gpu[48-50]
eme_h200nv_8 up 2-00:00:00 2 mix gpu[46-47]
gh200_1 up 2-00:00:00 2 idle gpu[51-52]
skl up 2-00:00:00 7 alloc skl[01-07]
bigmem up 2-00:00:00 1 mix bigmem02
bigmem up 2-00:00:00 1 alloc bigmem01
bigmem up 2-00:00:00 1 idle bigmem03※ 노드 구성은 시스템 부하에 따라 시스템 운영 중 조정될 수 있습니다.
PARTITION : 현재 SLURM에서 설정된 파티션명.
AVAIL : 파티션의 상태 (up or down)
TIMELIMIT : wall clock time
NODES : 노드 수
STATE : 노드의 상태 (alloc-자원사용중/Idle-사용가능)
NODELIST : 노드 리스트
노드별 상세 정보 sinfo 명령 뒤에 "-Nel" 옵션을 사용하면 상세 조회가 가능합니다.
$ sinfo -Nel
Fri Mar 18 10:52:13 2022
NODELIST NODES PARTITION STATE CPUS S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
gpu01 1 cas_v100nv_8 idle 32 2:16:1 384000 0 1 TeslaV10 none
gpu02 1 cas_v100nv_8 idle 32 2:16:1 384000 0 1 TeslaV10 none
gpu03 1 cas_v100nv_8 idle 32 2:16:1 384000 0 1 TeslaV10 none
gpu04 1 cas_v100nv_8 idle 32 2:16:1 384000 0 1 TeslaV10 none
- - 이 하 생 략 - -작업 상태 조회 squeue 명령을 이용하여 작업 목록 및 상태를 조회
$squeue
JOBID PARTITION NAME USER ST TIME NODES. NODELIST(REASON)
760 cas_v100_4 gpu_burn userid R 0:00 10 gpu10
761 cas_v100_4 gpu_burn userid R 0:00 10 gpu11
762 cas_v100_4 gpu_burn userid R 0:00 10 gpu12작업 상태확인 및 노드상태 그래픽으로 확인
$ smap제출된 작업 상세 조회
$ scontrol show job [작업 ID]다. 작업 제어
작업 삭제(취소) scancel 명령을 이용하여 “scancel [Job_ID]" 과 같이 작업을 삭제합니다. Job_ID 는 squeue 명령을 이용하여 조회해서 확인합니다.
$ scancel 761라. 컴파일, 디버깅, 작업제출 위치
로그인 노드에서 ssh로 직접 접속이 가능한 디버깅 노드를 제공하고 있습니다.
로그인/디버깅 노드에서 컴파일, 디버깅 및 모든 파티션에 대한 작업 제출이 가능합니다.
디버깅 노드는 CPU time Limit이 120분입니다.
필요시 모든 파티션에서 SLURM Interactive Job 기능을 이용해 컴파일, 디버깅이 가능합니다.
Last updated