본문 바로가기
Programming

[AWS] ec2 cuda 8.0 딥러닝 환경 구축 (cuda, cudnn, opencv, jupyter notebook, vnc 연결)

by riveryun 2021. 4. 26.

 


github의 코드를 실행하다 보면 간혹 cuda 특정 버전에서만 실행되는 코드들이 있다.

기본적으로 AWS ec2 Ubuntu 서버 인스턴스에서는 cuda 10.0 상위 버전이 설치되어 있기 때문에 cuda의 다른 버전을 이용하고 싶다면 직접 환경을 구축하는 것이 좋다.

 

cuda 10.0 버전이 기본적으로 설치된 인스턴스에서 cuda 8.0을 설치한 후 여러 cuda를 한 번에 사용해줄 수도 있으나, 딥러닝 서버들을 직접 생성하며 느낀 점은 cuda, cudnn, 그리고 nvidia driver의 버전 간 호환성이 좋지 않다는 것이다. cuda, cudnn, nvidia driver의 버전을 모두 확인한 후 맞춰서 설치해야 하는데, cuda 8.0 버전을 cuda 10.0과 함께 사용하게 되면 cudnn, driver 등의 버전이 충돌하는 등 오류가 많이 발생할 것 같아 그냥 새로운 인스턴스를 생성하는 방향으로 진행했다.

 

Stackoverflow에서 찾아보니 cuda 8.0 버전은 우분투 18.04 버전에서 말썽을 피우는 경우도 많다 그래서 우분투 16.04 환경을 구축했다. 

 

 

[AWS 환경 정보]

- AMI : Ubuntu Server 16.04 LTS (HVM) with SQL Server 2017 Standard

- gpu는 딥러닝 돌릴 정도로만 설정해도 충분하다. 각자 예산에 맞게 설정

참고로 AWS ec2에 gpu 관련 정보가 잘 정리되어 있기는 하지만, 매우 불친절하게 작성되어 있다... 

- 보안그룹, 스토리지 모두 각자 원하는 목적에 맞게 설정

나는 스토리지를 200GB로 설정하였다. 스토리지는 나중에 ec2 설정에 들어가서 변경할 수 있으니 메모리가 부족할까 걱정하지 않아도 된다.

 

 

[설치 버전]

- Python 2.7

- pip (반드시 21.0 이하의 downgrade version으로 설치)

- nvidia Driver 375 (384도 가능)

- cuda 8.0

- cudnn 5.1.0 

- opencv 3.3.0

 

 

1. Python 2.7 설치하기

cd /usr/src
sudo wget https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tgz
sudo tar zxf Python-2.7.16.tgz

sudo apt-get update
sudo apt-get install build-essential checkinstall
sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev

cd Python-2.7.16
sudo ./configure --enable-optimizations
sudo make altinstall

 

2. pip 설치

curl -O https://bootstrap.pypa.io/2.7/get-pip.py
python get-pip.py

 

[오류]

설치 이후 pip를 이용할 때 bash: /usr/bin/pip: No such file or directory  오류가 발생하는 경우가 종종 있다. 이 때는 당황하지 않고 심볼릭 링크를 설정해주면 된다.

ln -s /usr/local/bin/pip /usr/bin/pip

 

3. jupyter notebook 설치

jupyter notebook 명령어로도 실행 가능

4번째 줄로만 jupyter notebook이 실행되는 경우 alias 설정해서 간단하게 사용 가능

# jupter notebook 설치코드
sudo pip install notebook

#jupyter notebook 실행코드
~/.local/bin/jupyter-notebook

 

[오류]

jupyter notebook을 정상적으로 설치했는데 찾을 수 없다는 오류가 뜨는 경우에는 alias를 설정해주면 간단하게 해결할 수 있다.

alias notebook="~/.local/bin/jupyter-notebook"

 

4. nvidia driver, cuda, cudnn 설치

[nvidia driver]

드라이버 설치 후 reboot하고, nvidia-smi를 통해 설치된 드라이버 버전 확인 가능

sudo add-apt-repository ppa:graphics-driveers/ppa
sudo apt-get update
sudo apt-get install nvidia-384

sudo reboot
nvidia-smi

 

[cuda]

cuda 공식 홈페이지에서 runfile을 다운받는다.

 

이후 cuda를 설치하는데 cuda를 설치한 위치를 꼭 기억하고 있어야 한다.

코드를 입력하면 라이센스 문구가 뜨는데 이는 ctrl+c를 누르면 한 번에 넘길 수 있다.

sudo sh cuda_8.0.61_375.26_linux.run

 

Do you accept the previously read EULA?
accept/decline/quit: accept

Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 375.26?
(y)es/(n)o/(q)uit: n

Install the CUDA 8.0 Toolkit?  
(y)es/(n)o/(q)uit: y

Enter Toolkit Location  
 [ default is /usr/local/cuda-8.0 ]: 

Do you want to install a symbolic link at /usr/local/cuda?  
(y)es/(n)o/(q)uit: y

Install the CUDA 8.0 Samples?  
(y)es/(n)o/(q)uit: n

 

환경변수 설정을 하는데, 이 때 앞서 cuda를 설치한 경로로 입력해야 한다.

~/.bashrc 파일을 열어 정상적으로 아래 내용이 입력되었는지를 확인해야 한다.

echo 'export PATH=/usr/local/cuda-8.0/bin:${PATH}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-8.0/lib64:${LD_LIBRARY_PATH}' >> ~/.bashrc

 

제대로 추가가 되었다면 bashrc를 update하고 cuda가 잘 설치되었는지를 확인한다.

source ~/.bashrc
nvcc --version

 

[cudnn]

cudnn 파일 다운로드를 위해서는 회원가입이 필요하다. 여기서 회원가입을 해준 후 cudnn 5.1 버전을 다운로드 받는다. cuDNN v5.1 Library for Linux를 다운

 

다음 명령어로 압축을 풀고 nvcc의 폴더 위치를 확인하여 해당 폴더에 압축 해제한 파일을 복사하고 권한을 변경한다.

tar xzvf cudnn-8.0-linux-x64-v5.1.tgz

which nvcc

sudo cp cuda/lib64/* /usr/local/cuda-8.0/lib64/
sudo cp cuda/include/* /usr/local/cuda-8.0/include/

sudo chmod a+r /usr/local/cuda-8.0/lib64/libcudnn*
sudo chmod a+r /usr/local/cuda-8.0/include/cudnn.h

 

설치를 완료하면 cuDNN의 버전을 확인한다. MAJOR.MINOR.PATHLEVEL 버전으로 읽으면 된다.

cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2  

 

마지막으로 필요한 패키지를 설치하면 된다.

sudo apt-get install libcupti-dev

 

5. opencv 3.3.0

환경 구축을 하는 마지막 단계이다. opencv를 사용하지 않는다면 이 단계는 생략해도 좋다.

 

[opencv]

qt&build-essential 설치

sudo apt-get install g++
sudo apt-get install cmake cmake-qt-gui
sudo apt-get install build-essential

 

opencv 관련 패키지들을 다운로드한다.

sudo apt install --assume-yes build-essential cmake git pkg-config unzip ffmpeg qtbase5-dev python-dev python3-dev python-numpy 

sudo apt install libhdf5-dev

sudo apt install --assume-yes libgtk-3-dev libdc1394-22 libdc1394-22-dev libjpeg-dev libpng12-dev libtiff5-dev libjasper-dev

sudo apt install --assume-yes libavcodec-dev libavformat-dev libswscale-dev libxine2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev

sudo apt install --assume-yes libv4l-dev libtbb-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev
sudo apt install --assume-yes libvorbis-dev libxvidcore-dev v4l-utils

 

opencv, opencv_contrib 공식 Repository를 다운로드 받는다. 공식이 아닌 Repository를 다운받을 경우도 있는데 이 경우 오류가 발생하거나 특정 모듈이 없는 경우도 있으니 주의하길 바란다! 이 문제 때문에 조금 애먹었다... 필요한 모듈이 있는지 확인하지 않고 공식이 아닌 Repo를 다운받으니 필요한 모듈이 설치되어 있지 않았다. 모듈을 확인해주고 설치하는 게 좋을 거 같다. 이 코드는 공식 Repo의 3.3.0 버전을 설치하는 코드이다.

mkdir opencv
mkdir opencv-3.3.0
mkdir opencv_contrib-3.3.0

#github cloning
cd opencv/opencv-3.3.0
git clone https://github.com/opencv/opencv.git .
git checkout 3.3.0

cd opencv/opencv_contrib-3.3.0
git clone https://github.com/opencv/opencv_contrib.git .
git checkout 3.3.0

 

[오류]

간혹 다음 오류가 발생하는 경우가 있는데, 이 때는 아래 코드를 입력하면 해결할 수 있다.

make[2]: *** [modules/cudalegacy/CMakeFiles/opencv_cudalegacy.dir/src/graphcuts.cpp.o] Error 1

# Bug fixes for version 3.1.0
git format-patch -1 10896129b39655e19e4e7c529153cb5c2191a1db
git am < 0001-GraphCut-deprecated-in-CUDA-7.5-and-removed-in-8.0.patch

 

opencv가 있는 디렉터리로 이동한 후 build 파일을 생성하여 cmake 파일을 구성한다.

OPENCV_EXTRA_MODULES_PATH는 contrib-3.3.0의 modules 디렉터리에 맞게 변경하면 된다.

cd opencv-3.3.0
mkdir build
cd build
cmake -D WITH_LIBV4L=OFF -D BUILD_opencv_java=OFF -D BUILD_opencv_java=OFF -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.3.0/modules -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_CUDA=ON -D WITH_CUBLAS=ON -D WITH_TBB=ON -D WITH_V4L=ON -D WITH_QT=ON -D WITH_OPENGL=ON -D BUILD_PERF_TESTS=OFF -D BUILD_TESTS=OFF -DCUDA_NVCC_FLAGS="-D_FORCE_INLINES" ..

 

이후 opencv를 build하여 opencv 설치를 완료한다. 자 여기까지 했다면 거의 다 완료했다...!

make -j4
sudo make install
pkg-config --modversion opencv

 

[오류]

make -j4는 오류가 가장 많이 발생하는 부분 중 하나였다. make 명령어를 입력하여 설치 100% 단계에서 makefile error가 발생한다면 "/opencv-3.1.0/modules/python/common.cmake " 파일 안에 다음 내용을 추가하자

find_package(HDF5)
include_directories(${HDF5_INCLUDE_DIRS})

 

6. VNC 연결

마지막으로 VNC를 연결하여 AWS 서버를 gui로 볼 수 있도록 변경해주는 과정이다. 이 부분도 필요하지 않은 사람들은 생략해도 좋다. 이 과정에 앞서 선행작업이 필요한데 바로 putty로 ec2에 접속할 수 있도록하는 것이다. 구글링하면 쉽게 방법을 찾아볼 수 있다.

 

우선 Ubuntu-desktop을 설치한다.

sudo apt-get update
sudo apt-get install ubuntu-dektop

 

나머지 필요한 패키지 파일들도 설치한다.

sudo apt-get install tightvncserver gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal

 

초기 세팅 파일을 위해 VNC 서버를 한번 작동하는데, 이 때 비밀번호를 입력하라는 화면이 나온다. 나중에 GUI에 접속할 때 필요한 비밀번호이므로 기억해야 한다.

vncserver :1

 

설정파일을 다음과 같이 수정해주고 변경 사항을 반영하기 위해 서버를 끄고 다시 시작한다.

vi~/.vnc/xstartup

#코드 변경 부분
#!/bin/sh

export XKL_XMODMAP_DISABLE=1
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey

vncconfig -iconic &
gnome-panel &
gnome-settings-daemon &
metacity &
nautilus &
gnome-terminal &

 

vncserver -kill :1
vncserver :1

 

다음으로 SSH 터널을 설정해주어야 한다. Putty에서 ec2 접속 설정한 내용을 load해준 후 SSH > Tunnels에서 포트를 설정한다.

- Source port | 5902 

- Destination | ec2 server ip 주소 : 5901

 

이후 로컬 PC에서 ec2 서버로 접속할 수 있도록 AWS 서버의 보안 그룹 설정에서 5901 포트를 추가해주면 된다. 마지막으로 Tight-VNC를 다운받아 localhost::5902로 접속하면 VNC로 연결된다.

 

 

끝!

 


참고

 

 

 

댓글