클러스터 자원 배정
자원 관리자(Resource Manager) 를 통해 리소스(node 및 GPU)를 배정받고
<사용환경 구성> 에서 시험해 보았던 샘플 코드를
배정받은 리소스(node 및 GPU) 에서 실행해 보겠습니다.
1. srun 을 이용한 Interactive (대화형) 작업
srun 을 이용한 Interactive (대화형) 작업은 실시간으로 명령을 입력하과 결과를 확인할 수 있어
의도했던 작업이 잘 수행 되는지 즉시 확실할 수 있는 장점이 있지만,
작업이 끝나도 자동으로 종료되지 않으므로 클러스터 자원이 낭비되는 요인이 될 수 있습니다.
작업 시작시 제한시간을 지정 하거나 가능하다면 디버깅 용도로만 사용는 것을 권장 하며,
일부 클러스터 시스템 에서는 srun 을 통한 작업의 제한시간이 짧게 적용 되는 경우가 있습니다.
cd ~
# 전체 노드의 상태
sinfo
sinfolong
# 클러스터의 대기열 (queue)상태 확인.
echo $USER ## 현재 사용자의 id
squeue -u $USER
squeuelong -u $USER
<GPU 4개 이하 사용하는 경우>
예) gpu 1개를 사용할 수 있는 리소스(node) 요청, 사용 시간은 1시간으로 지정.(시간 옵션 필수임)
srun --gres=gpu:1 --time=1:00:00 --pty bash -i
<GPU 5개 초과사용하는 경우>
예) gpu 10개를 사용할 수 있는 리소스(node) 요청, 사용 시간은 1시간으로 지정.(시간 옵션 필수임)
srun -p big -q big --gres=gpu:10 --time=1:00:00 --pty bash -i
# 리소스를 할당 받은 후 할당된 작업의 대기열 (queue)상태 재 확인.
echo $USER ## 현재 사용자의 id
squeue -u $USER
squeuelong -u $USER
# 할당 받은 gpu 번호 확인.
echo $CUDA_VISIBLE_DEVICES
# 노드의 gpu 상태 확인.
gpustat
nvidia-smi
1) srun - Anaconda 의 경우
RTX 계열 GPU 의 경우 cuda 11.0 버젼이 필요 합니다.
conda로 python 3.8.5 환경을 생성하고 cuda는 module 을 통해 load 하여 사용 합니다.
cd ~
# conda 환경 생성.
conda deactivate
conda create -n py38-tf2.4 python==3.8.5
conda activate py38-tf2.4
pip install tensorflow-gpu==2.4 matplotlib
ml purge
ml load cuda/11.0
# Tensorflow 2.4용 샘플파일 다운로드.
wget https://raw.githubusercontent.com/dasandata/Open_HPC/master/Document/User%20Guide/6_etc/dcgan-py38-tf2.4-cuda11.0.py
# Sample Code 를 실행해 보기 전에 gpu 상태 확인
gpustat
nvidia-smi
# Sample Code 실행 1
python ~/dcgan-py38-tf2.4-cuda11.0.py
2) srun - Module 의 경우
리소스를 배정 받아 계산 노드로 진입한 후에도
login 노드와 동일하게 module 명령을 사용할 수 있습니다.
ml
ml purge
ml
which nvcc ; echo ; nvcc -V
ml av | grep cuda
ml load cuda/10.0
which nvcc ; echo ; nvcc -V
ml swap cuda/10.0 cuda/11.0
which nvcc ; echo ; nvcc -V
3) srun - Docker 의 경우 (Docker 권장안함)
기존 방법에 -e NVIDIA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES 옵션을 추가해서 실행 해야 합니다.
SLURM을 통해 할당받은 GPU 번호 - $CUDA_VISIBLE_DEVICES) - 를 Docker 의 컨테이너에게 전달하는 부분이며
이 옵션을 누락할 경우 다른 사용자의 작업이 돌고 있는 GPU 에 중첩해서 작업이 돌아갈 수 있어서
기존 작업과 새로운 작업이 모두 중단될 가능성이 높습니다.
RTX 계열 GPU 의 경우 cuda 11.0 버젼이 필요 하므로
cuda 11.0 과 tessorflow 2.4 로 구성된 새로운 Docker image를 내려 받아 진행 합니다.
cd ~
# Tensorflow 2.4용 샘플파일 다운로드.
wget https://raw.githubusercontent.com/dasandata/Open_HPC/master/Document/User%20Guide/6_etc/dcgan-py38-tf2.4-cuda11.0.py
# Docker Imaage 다운로드(pull)
docker pull dasandata/tensorflow:2.4.1-gpu-py3.8-cuda11.0
# 실행.
docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES \
--rm -v ~:/home/$USER \
dasandata/tensorflow:2.4.1-gpu-py3.8-cuda11.0 \
python ~/dcgan-py38-tf2.4-cuda11.0.py
4) srun - singularity 의 경우 #1
앞서 실행한 Docker image를 singularity image 로 build 한 후 사용 합니다.
cd ~
# Tensorflow 2.4용 샘플파일 다운로드.
wget https://raw.githubusercontent.com/dasandata/Open_HPC/master/Document/User%20Guide/6_etc/dcgan-py38-tf2.4-cuda11.0.py
# singularity Module Load
ml purge
ml load singularity
singularity build ~/tf-2.4-gpu-py3.8-cuda11.0.simg docker://dasandata/tensorflow:2.4.1-gpu-py3.8-cuda11.0
singularity exec --nv ~/tf-2.4-gpu-py3.8-cuda11.0.simg python ~/dcgan-py38-tf2.4-cuda11.0.py
5) srun - singularity 의 경우 #2 (module을 통해 cuda 사용)
singularity(docker)이미지 내에 cuda가 포함되어 있지 않은 경우
module 과 singularity 의 bind 옵션을 사용해서 cuda 를 사용할 수 있습니다.
cd ~
# singularity Module Load
ml purge
ml load singularity
# 이미지 생성 확인.
singularity build ~/tf-2.4-gpu-py3.8-nocuda.simg docker://dasandata/tensorflow:2.4.1-gpu-py3.8-nocuda
# images 내부에 선언된 $LD_LIBRARY_PATH 확인.
singularity exec --nv ~/tf-2.4-gpu-py3.8-nocuda.simg echo $LD_LIBRARY_PATH
# cuda 11.0 Module Load
ml load cuda/11.0
# images 내부에 선언된 $LD_LIBRARY_PATH 변화 확인.
singularity exec --nv ~/tf-2.4-gpu-py3.8-nocuda.simg echo $LD_LIBRARY_PATH
singularity exec --nv ~/tf-2.4-gpu-py3.8-nocuda.simg ls -l /opt/
### module 을 통해 load 된 cuda를 사용할 수 있도록 /opt/ohpc 를 이미지와 연결(Bind)
singularity exec --nv -B /opt/ohpc:/opt/ohpc ~/tf-2.4-gpu-py3.8-nocuda.simg \
python ~/dcgan-py38-tf2.4-cuda11.0.py
2. sbatch 를 이용한 Batch (일괄형) 작업
앞서 srun 으로 Interactive (대화형) 작업들을 스크립트(Script) 파일로 만들어서
sbatch 명령으로 노드에 작업을 제출(submit) 해 보겠습니다.
스크립트를 통한 작업 제출의 예)
cd ~
# 전체 노드의 상태
sinfo
sinfolong
# 클러스터의 대기열 (queue)상태 확인.
echo $USER ## 현재 사용자의 id
squeue -u $USER
squeuelong -u $USER
## 스크립트 작성
cat << EOF > ~/1min-job.sh
#!/bin/bash
echo "### 1 min job start"
echo "###"
echo "### START DATE=$(date)"
echo "### HOSTNAME=$(hostname)"
echo "### CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"
echo "###"
echo "### sleep 1min..."
sleep $((60*1))
echo "###"
echo "### END DATE=$(date)"
EOF
# 작성된 작업 파일 내용 확인.
cat ~/1min-job.sh
<GPU 4개 이하 사용하는 경우>
예) gpu 1개를 사용할 수 있는 리소스(node)에, 사용 시간은 10분으로 지정하여 작업을 제출(submit)
## --time=일-시간:분:초 (시간옵션을 주는 경우 backfill로 우선 스케줄링의 가능성이 더 높으므로 권장)
sbatch --gres=gpu:1 --time=10:00 ~/1min-job.sh
<GPU 4개 초과하여 실행하는 경우>
예) gpu 1개를 사용할 수 있는 리소스(node)에, 사용 시간은 10분으로 지정하여 작업을 제출(submit)
## --time=일-시간:분:초 (시간옵션을 주는 경우 backfill로 우선 스케줄링의 가능성이 더 높으므로 권장)
sbatch -p big -q big --gres=gpu:1 --time=10:00 ~/1min-job.sh # big partition에 big qos로 수행
# 작업이 제출 된 후 대기열 (queue) 과 노드(node) 상태 재 확인.
squeue -u $USER
squeuelong -u $USER
sinfo
sinfolong
1) sbatch - Anaconda 작업 스크립트 작성의 예.
cd ~
# 작업 스크립트 작성.
cat << EOF > ~/anaconda-job.sh
#!/bin/bash
echo "### START DATE=$(date)"
echo "### HOSTNAME=$(hostname)"
echo "### CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"
# conda 환경 활성화.
source ~/.bashrc
conda activate py38-tf2.4
# cuda 11.0 환경 구성.
ml purge
ml load cuda/11.0
# 활성화된 환경에서 코드 실행.
python ~/dcgan-py38-tf2.4-cuda11.0.py
echo "###"
echo "### END DATE=$(date)"
EOF
# 작성된 작업 스크립트 확인.
cat ~/anaconda-job.sh
# gpu 1개를 사용할 수 있는 리소스(node)에, 사용 시간은 10분으로 지정하여 작업을 제출(submit)
## --time=일-시간:분:초
sbatch --gres=gpu:1 --time=10:00 ~/anaconda-job.sh
2) sbatch - Module 의 경우
[sbatch - Anaconda 작업 스크립트 작성의 예] 처럼.
스크립트 내에서 module 명령을 사용하여 환경을 구성할 수 있습니다.
3) sbatch - Docker 의 경우 (Docker는 권장하지 않음)
cd ~
# 작업 스크립트 작성.
cat << EOF > ~/docker-job.sh
#!/bin/bash
echo "### START DATE=$(date)"
echo "### HOSTNAME=$(hostname)"
echo "### CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"
docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES \
--rm -v ~:/home/$USER \
dasandata/tensorflow:2.4.1-gpu-py3.8-cuda11.0 \
python ~/dcgan-py38-tf2.4-cuda11.0.py
echo "###"
echo "### END DATE=$(date)"
EOF
# 작성된 작업 스크립트 확인.
cat ~/docker-job.sh
# gpu 1개를 사용할 수 있는 리소스(node)에, 사용 시간은 10분으로 지정하여 작업을 제출(submit)
## --time=일-시간:분:초
sbatch --gres=gpu:1 --time=10:00 ~/docker-job.sh
4) sbatch - singularity 의 경우
cd ~
# 작업 스크립트 작성.
cat << EOF > ~/singularity-job.sh
#!/bin/bash
echo "### START DATE=$(date)"
echo "### HOSTNAME=$(hostname)"
echo "### CUDA_VISIBLE_DEVICES=$CUDA_VISIBLE_DEVICES"
# singularity Module Load
ml purge
ml load singularity
singularity exec --nv ~/tf-2.4-gpu-py3.8-cuda11.0.simg python ~/dcgan-py38-tf2.4-cuda11.0.py
echo "###"
echo "### END DATE=$(date)"
EOF
# 작성된 작업 스크립트 확인.
cat ~/singularity-job.sh
# gpu 1개를 사용할 수 있는 리소스(node)에, 사용 시간은 10분으로 지정하여 작업을 제출(submit)
## --time=일-시간:분:초
sbatch --gres=gpu:1 --time=10:00 ~/singularity-job.sh
>> sbatch Script 예제
#!/bin/sh
#SBATCH -J name-of-job # Job name
#SBATCH -o out.test-tensorflow-1GPU.%j # Name of stdout output file (%j expands to %jobId)
## 주석(#) 표시가 2개이상 이면 적용되지 않습니다. 따라서 아래의 경우 클러스터의 기본 partition 으로 지정 됩니다.
##SBATCH -p gpu # partiton name - 지정하지 않을경우 기본 partition
## 아래 항목도 적용되지 않습니다.
##SBATCH -qos small-fast # QOS
#SBATCH -t 01:00:00 # Max Run time (day-hh:mm:ss) - 1 hours
#SBATCH --gres=gpu:1 # Num GRES Devices
<module command> or
<conda command> or
<docker command> or
<singularity command>
# End of File.
3. GPU 4개 초과하여 사용해야 하는 경우
- big partition을 지정하여 사용하여야 함 : -p big (또는 --partition=big)
- qos를 big_qos으로 지정해야 함 : -q big (또는 --qos=big_qos)
1) srun
예) gpu 1개를 사용할 수 있는 리소스(node) 요청, 사용 시간은 1시간으로 지정.(시간 옵션 필수임)
srun -p big -q big_qos --gres=gpu:1 --time=1:00:00 --pty bash -i
2) sbatch
예) gpu 1개를 사용할 수 있는 리소스(node)에, 사용 시간은 10분으로 지정하여 작업을 제출(submit)
## --time=일-시간:분:초 (시간옵션을 주는 경우 backfill로 우선 스케줄링의 가능성이 더 높으므로 권장)
sbatch -p big -q big_qos --gres=gpu:1 --time=10:00 ~/1min-job.sh