데이터 센터

연세대학교 인공지능융합대학


사용법 안내

Total 1건 1 페이지
사용법 안내 목록
번호 제목 작성일
1

클러스터 자원 배정

자원 관리자(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 8개 이하 사용하는 경우 >
예) gpu 1개를 사용할 수 있는 리소스(node) 요청, 사용 시간은 1시간으로 지정.(시간 옵션 필수임)
srun --gres=gpu:1 --time=1:00:00 --pty bash -i

< GPU 8개 초과사용하는 경우 >
예) 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 과 tensorflow 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 8개 이하 사용하는 경우 >
예) gpu 1개를 사용할 수 있는 리소스(node)에, 사용 시간은 10분으로 지정하여 작업을 제출(submit)
## --time=일-시간:분:초 (시간옵션을 주는 경우 backfill로 우선 스케줄링의 가능성이 더 높으므로 권장)
sbatch --gres=gpu:1 --time=10:00 ~/1min-job.sh

< GPU 8개 초과하여 실행하는 경우 >
예) 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




# End of File.

3. GPU 8개 초과하여 사용해야 하는 경우
  • 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