본문 바로가기
AWS/기능 소개 및 에러처리

DNN학습에서의 AWS EC2 g4dn xlarge vs 2xlarge 성능 및 과금비교

by Pacloud 2023. 4. 18.
반응형

 

이번 포스팅에서는 간단한 Neural Net을 활용하여 AWS EC2 g4dn의 xlarge와 2xlarge 인스턴스의 성능과 처리속도를 비교하고 모델을 학습할 때 성능이 부족하거나 과하지 않은지 확인해 적당한 인스턴스를 선택하는데 참고가 되었으면 한다. 인스턴스의 스펙과 온디맨드 요금은 다음 그림을 참고하면 된다.

 

 

두 인스턴스에서 사용하는 GPU는 Nvidia Tesla T4로 Compute Capability는 7.5로 지원하는 Cuda version은 10.x 버전 이상이고 이 글에서는 11.x 버전으로 설치할 것이다.

 

EC2 인스턴스 생성은 OS, Instance 종류, 보안 그룹, 볼륨 용량 외에는 기본으로 설정했고 OS는 Linux 계열인 Unbuntu 20.04 LTS, Cuda, cudnn, Anaconda 설치를 위해 어느정도 여유있게 128GB로 설정했다. 거기에 SSH접근을 선호하는 편이어서 접근 가능하도록 설정했다.

이렇게 설정해줬다면 CMD창에서 다음과 같이 입력하면 접근 가능하다.

ssh -i $KeyPairDir(user/.ssh/KeyPair.pem) ubuntu@$PublicIPv4주소orDNS

여기까지 정리하면 AWS EC2 g4dn xlarge, xxlarge Instance에서

OS: Ubuntu 20.04

GPU: Nvidia Tesla T4(Compute Capabality: 7.5)

CUDA version : 11.1

Storage Volume: 128GB

위와 같은 스펙으로 인스턴스를 생성했고 이후 간단한 인공신경망 회귀모델에 대한 성능 및 처리속도를 비교할 예정이다.


AWS EC2 인스턴스로 우분투 서버를 생성하면 말 그대로 초기 상태이므로 컴파일과 개발을 위한 명령어들을 설치해줘야 하는데 그런 패키지들을 모아놓은 것이 build-essential, linux-generic라고 이해하면 좋을 것 같다.

#root 계정 비밀번호 설정
sudo passwd root

#초기 설정
sudo apt-get update && sudo apt-get upgrade -y 
sudo apt-get install build-essential 
sudo apt-get install linux-generic 
#sudo apt-get install linux-headers-$(uname -r)
sudo reboot

#cuda 설치
wget <https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-ubuntu2004.pin>
sudo mv cuda-ubuntu2004.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget <https://developer.download.nvidia.com/compute/cuda/11.1.1/local_installers/cuda-repo-ubuntu2004-11-1-local_11.1.1-455.32.00-1_amd64.deb>
sudo dpkg -i cuda-repo-ubuntu2004-11-1-local_11.1.1-455.32.00-1_amd64.deb
sudo apt-key add /var/cuda-repo-ubuntu2004-11-1-local/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

#cuda 환경변수 등록
#vi ~/.bashrc
export PATH=/usr/local/cuda-11.1/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.1/lib64:$LD_LIBRARY_PATH

source ~/.bashrc

#버전 확인
nvcc --version(or -V)

 

https://developer.nvidia.com/cuda-11.1.1-download-archive?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=2004&target_type=deblocal

 

 

CUDA Toolkit 11.1 Update 1 Downloads

Get CUDA Toolkit 11.1 Update 1 for Linux and Windows.

developer.nvidia.com

만약 다른 버전의 Ubuntu OS나 CUDA를 사용해야한다면 Ndivia 사이트에서 참고해서 사용자의 환경에 맞게 설치를 하면 된다. 설치가 끝나면 ~/.bashrc에 환경변수를 등록해줘야 사용하고 다음과 같이 명령어를 치면 버전과 설치확인이 끝난다.

 

추가로 설치가 잘 안되서 CUDA를 삭제해야하는 경우 다음 명령어를 통해 삭제한 후 다시 차근차근 설치를 진행하면 된다. 사실 AI학습을 진행하면서 맨처음 환경설정하는 부분이 은근히 오래걸리기도 하고 시키는대로 했는데 제대로 안되는 경우도 몇 번 있었다. 심지어 같은 환경, 같은 명령어를 쳤다고 생각해도 어떤 때는 되고 안되는 경우를 겪으면서 자신이 어떠한 프로그램, 모델을 돌리기위해 환경 설정을 진행했다면 따로 정리해놓는 것을 추천한다. 여기선 CUDA나 cudnn 설치에 중점을 뒀지만 파이썬 가상환경의 경우는 보통 requirement.txt 파일을 만들어두면 pip install -r requirement.txt 명령어를 통해 빠르게 환경을 구축할 수 있고 인수인계에서 신경쓸 점이 줄어든다.

sudo apt-get --purge remove "*cuda*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"

sudo apt-get --purge remove "*nvidia*" "libxnvctrl*"

sudo apt-get autoremove
sudo apt-get autoclean
sudo rm -rf /usr/local/cuda*

CUDA 설치가 완료 되면 위와 같은 명령어를 통해 CUDA 버전과 설치를 확인할 수 있다.

다음으로는 cudnn을 설치해야 하는데 cudnn의 설치를 위해서는 https://developer.nvidia.com/rdp/cudnn-archive이 url에서 다운로드를 받은 후 EC2 인스턴스로 옮기던가 https://developer.download.nvidia.com/compute/redist/cudnn에서 버전과 환경에 맞게 설치하면 된다. *cudnn-archive에서 링크주소를 복사해서 wget 명령어를 사용하면 tar가아니라 url에 대한 html?이 다운로드된다. 이후 다운로드 받은 tar파일을 해제한 후 다음과 같이 파일을 복사해주면 cudnn까지 설치 완료되며 버전확인은 cudnn_version을 cat명령어로 가져와서 확인할 수 있다.

wget [<https://developer.download.nvidia.com/compute/redist/cudnn/v8.6.0/local_installers/11.8/cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz>](<https://developer.download.nvidia.com/compute/redist/cudnn/v8.6.0/local_installers/11.8/cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz>)
tar -xvf cudnn-linux-x86_64-8.6.0.163_cuda11-archive.tar.xz 
cd cudnnDir
sudo cp include/* /usr/local/cuda-11.1/include
sudo cp -P lib/* /usr/local/cuda-11.1/lib64
sudo chmod a+r /usr/local/cuda-11.1/lib64/libcudnn*

#cudnn 버전 확인
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

 

여기까지 왔다면 python tensorflow, pytorch등의 인공신경망 라이브러리에서 GPU를 활용하기 위한 준비는 거의 끝났고 파이썬 가상환경을 만들어 Python 버전과 라이브러리를 설치해주면 된다.

wget [<https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh>](<https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh>)
bash [Anaconda3-2022.10-Linux-x86_64.sh](<https://repo.anaconda.com/archive/Anaconda3-2022.10-Linux-x86_64.sh>)
#vi ~/.bashrc
export PATH="/home/username/anaconda3/bin:$PATH"

source ~/.bashrc

본인은 주로 Anaconda를 활용해 가상환경을 구축한다. 위에 명령어를 통해 설치하고 CUDA와 마찬가지로 환경변수를 설정해주고 다음 명령어로 설치확인과 버전을 확인할 수 있다.

 

#가상환경 생성
conda create --name $venvname python=3.9
conda activate $venvname

#requirement 설치
pip install numpy pandas
conda install tensorflow-gpu

'''
python
#tensorflow GPU 사용 여부 확인
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
'''

가상환경 생성이 끝났다면 코드를 실행하기전 먼저 Python을 실행시키고 tensorflow를 import하고 위와 같이 치면 tensorflow에서 사용가능한 divice(CPU, GPU) 목록이 나온다.

여기서 GPU가 뜨지 않는다면 CUDA나 cudnn설치가 잘못됐을 확률이 크므로 다시 설치해봐야한다.


이제는 인공신경망 학습하는데 걸리는 시간과 AUC를 측정하여 비교할 것이다. 먼저 사용할 데이터는 Kaggle에 공개된(https://www.kaggle.com/datasets/sgpjesus/bank-account-fraud-dataset-neurips-2022) 은행 계좌 사기(Bank Account Fraud) 데이터셋으로 주어진 데이터로 Binary Classification을 진행할 것이다. 아키텍처는 다음과 같은데 모델 자체가 작아서 cpu로 돌려도 무리가 없지만 간단하게 비교해보기엔 충분할 것으로 보인다.

model = keras.Sequential([
    keras.layers.BatchNormalization(input_shape=[X_train.shape[1]]),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.BatchNormalization(),
    keras.layers.Dense(32, activation='relu'),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(1, activation='sigmoid')
])

먼저 스크립트를 돌리는데 걸린 Total 시간과 학습에 걸리는 시간은 다음과 같다. Early_stopping이란 학습 과정에서 over fitting(과대적합)을 방지하기 위한 Callback함수로 학습이 어느정도 이루어졌으면 학습을 중단하는 기능이다.

 

큰 차이는 안나지만 2xlarge 인스턴스가 xlarge에 비해 빠르고 성능도 증가했다. 온디맨드 요금은 2xlarge가 약 1.5배정도 비싼데 이정도로 작은 모델을 돌리기엔 2xlarge는 성능차이도 미미하고 큰 의미가 없고 추후 다른 큰 모델을 학습하는 경우에 multi-GPU를 사용하는 것은 예외로 할 떄 학습 속도를 단축시킬 수 있을 것 같다.

 

early_stopping=True g4dn_xlarge g4dn_2xlarge early_stopping=False g4dn_xlarge g4dn_2xlarge
total sec 3:18.83 1:41.51   8:16.33 7:03.57
train sec 3:10.95 1:33.36   8:05.45 6:55.64
epochs(종료) 19 11   50 50

 

g4dn_2xlarge

 

g4dn_xlarge

 

g4dn_2xlarge(epoch 50)

 

g4dn_xlarge(epoch 50)