UBAI PRACTICE - CNN

Author

hs.hwang

Published

November 4, 2024

Python 프로젝트의 일환으로, MNIST 데이터셋을 통해 간단한 CNN 모델을 구현해보도록 하겠습니다.

해당 프로젝트를 통해 CNN의 기본 작동 방식을 이해할 수 있을 것입니다.

프로젝트 시작에 앞서, MNIST 데이터셋과 CNN 모델에 대해 간단하게 알아보겠습니다.


🎨 MNIST 데이터셋

MNIST는 숫자 0부터 9까지의 손글씨 이미지를 가지고 있는 데이터셋입니다.

총 60,000개의 훈련 이미지와 10,000개의 테스트 이미지로 구성되어 있으며, 각 이미지는 28x28 픽셀 크기의 흑백 숫자 이미지입니다.

MNIST 데이터셋은 손글씨 인식 문제를 해결하기 위한 대표적인 예제로 사용되며, 추가로 다양한 기계 학습 알고리즘의 성능을 평가하는 데 자주 활용되는 데이터셋입니다.


🧱 CNN

CNN(Convolutional Neural Network)은 주로 이미지 처리 분야에서 사용되는 딥러닝 모델입니다.

여러 개의 컨볼루션 레이어와 풀링 레이어를 사용하여 이미지의 특징을 추출하고, 이를 기반으로 분류 또는 예측 작업을 수행합니다.

CNN은 특히 이미지 데이터에서 높은 성능을 발휘하며, 이미지 분류, 객체 탐지, 의료 영상 분석 등 다양한 응용 분야에서 널리 사용됩니다.

1. 배치 파일 생성

가장 먼저 프로젝트 수행을 위한 배치 파일을 생성해보겠습니다.

아래의 사항을 본인의 작업(job)에 맞게 입력한 후, 본인이 원하는 파일의 이름을 지정하여 filename.sh 형식으로 파일을 저장합니다. 예를 들어 아래의 Shell 파일을 python_project.sh로 저장합니다.

파일명이 .sh 형식인지 반드시 확인하세요.

#!/bin/bash
#SBATCH --nodes=1 
#SBATCH --partition=gpu2 
#SBATCH --cpus-per-task=56 
#SBATCH --gres=gpu:4
#SBATCH --job-name=UBAIJOB 
#SBATCH -o ./결과값 도출 지정 폴더 이름/jupyter.%N.%j.out  # STDOUT 
#SBATCH -e ./결과값 도출 지정 폴더 이름/jupyter.%N.%j.err  # STDERR

echo "start at:" `date` 
echo "node: $HOSTNAME" 
echo "jobid: $SLURM_JOB_ID" 

module unload CUDA/11.2.2 
module load cuda/11.8.0

python cnn.py 12 256 'relu'

결과값 도출 지정 폴더 이름을 반드시 지정해주세요. 각각 결과 값 폴더를 따로따로 만들어주거나 아니면 동일 폴더에 지정하셔도 됩니다.

STDOUT은 결과 값 출력 파일, STDERR는 결과 값 도출 중 출력 되는 로그 파일입니다. 새 폴더를 만들기 위해서는 디렉토리(directory)에서 오른쪽 버튼을 눌러 새 폴더 만들기 버튼을 클릭하시면 됩니다.

각 라인들의 의미는 다음과 같습니다.

#SBATCH --nodes=1

  • 총 필요 노드 수를 지정하는 명령어이며, 노드는 자동으로 컴퓨터가 배정해줍니다.
  • nodes=1은 노드를 한 개만 사용하겠다는 의미입니다.

#SBATCH --partition=gpu4

  • 사용할 Partition을 지정하는 명령어입니다.

#SBATCH --cpus-per-task=14

  • 총 필요 코어의 개수를 지정하는 명령어입니다.
  • 노드는 n개의 코어를 가지며, 사용 노드 1개 당 몇 개의 CPU/GPU 코어를 쓸 것인지를 결정합니다.

#SBATCH --gres=gpu:1

  • 몇 개의 GPU를 사용할 것인지 지정하는 명령어입니다.
  • CPU Partition을 선택하신 경우 해당 코드는 지워주셔야 합니다. 해당 코드는 GPU의 개수를 지정하는 명령어이기에, 에러가 발생할 수 있습니다.

#SBATCH --job-name=UBAIJOB

  • 작업 이름을 지정하는 명령어입니다.

echo "start at:" 'date'

  • 접속 날짜가 표기됩니다.

echo "node: $HOSTNAME"

  • 접속한 노드 번호가 표기됩니다.

echo "jobid: $SLURM_JOB_ID"

  • jobid가 표기됩니다.

module ~

  • 원하는 Linux 환경을 구축할 수 있습니다.
  • 기본적으로 CUDA/11.2.2 실행으로 셋팅되어 있습니다. 지금과 같이 다른 GPU 환경을 원할 경우, 해당 모듈을 unload한 후, 원하는 모듈을 load 합니다.
  • GPU 환경을 사용하고 싶은 경우에만 해당하며, GPU 환경을 사용하지 않을 경우(CPU Partition 사용) 지우셔도 무관합니다.

python cnn.py 12 256 'relu'

  • 원하는 Python 파일을 실행합니다.
  • 실행하려는 파일은 반드시 .py파일의 형태로 존재해야합니다. 위 코드에는 cnn.py로 지정하였습니다.
  • Python의 sys 패키지를 이용한 sys.argv로 매개변수를 이용한 실행 방법을 사용하였습니다. 자세한 사항은 sys의 공식문서에서 확인할 수 있습니다.
  • 파라미터 없이 모델을 실행하고 싶은 경우에는 python {filename}.py로 실행할 수 있습니다.


📌 참고사항

.py 파일에서 sys 패키지를 사용할 경우, 매개변수는 다음과 같이 지정됩니다.

  • sys.argv[0]: 파일 이름

  • sys.argv[n]: 원하는 파라미터 (n은 숫자를 의미합니다.)

cnn.py의 경우, 12 256 'relu'가 각각 sys.argv[1], sys.argv[2], sys.argv[3]으로 지정된 것입니다.


실행에 사용된 cnn.py의 자세한 코드는 여기에서 확인할 수 있습니다. 세부적인 코드는 링크를 참고하세요.


2. 배치 파일 실행

배치 파일을 실행하기에 앞서, 본인이 생성했던 Python 가상 환경에 들어와 있는 상태인지 재 확인합니다.

이후, terminal에 sbatch 명령어를 이용하여 지정한 배치 파일명을 입력 및 실행하세요. 이는 작업(job)을 제출한다는 의미입니다.

실행 후 나온 결과 값은 작업(job)에 대한 ID이니 꼭 따로 저장하거나 메모해두시기를 요청드립니다.

sbatch filename.sh    # ex) sbatch python_project.sh 
예시코드인 cnn.py를 정상적으로 실행하기 위해서는 추가 패키지 설치 pip install tensorflow && pip install numpy가 필요합니다.


작업(job) 제출이 정상적으로 진행되었다면, STDOUT폴더 안에 OUT 파일이 생성됩니다.

만일 OUT파일이 생성되지 않았다면, 해당 Partition의 노드에 기존 작업(job)이 모두 할당되어 수행하지 못했을 가능성이 높습니다. 이 경우 terminal에 squeue 명령어를 입력하시고, 본인의 ID를 찾습니다.

보통 배정이 되어있다면 정상적으로 n001, n002 … 으로 노드에 배정되어 있지만, 배정되지 않았을 경우 ( Resources, Priority )라는 메시지를 볼 수 있습니다. 그런 경우 다른 노드가 일이 끝나는 것을 기다리거나, 해당 파티션이 아닌 다른 파티션을 이용하여 노드를 배정받아야 합니다.

다른 파티션을 이용하기 위해서는 Partition 목록에서 Partition과 cpus-per-task, gpu 갯수를 Partition에 맞게 수정하여 작업(job)을 다시 제출하셔야 합니다.


이제 STDOUT폴더에 생성된 실행 결과 OUT파일을 확인할 수 있습니다.