05-03 07:38
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Artificial Intelligence / TensorFlow] AWS EC2 인스턴스에 GPU를 지원하는 TensorFlow 설치하기 본문

Artificial Intelligence/TensorFlow

[Artificial Intelligence / TensorFlow] AWS EC2 인스턴스에 GPU를 지원하는 TensorFlow 설치하기

cinema4dr12 2017. 1. 29. 22:59

지난 글, "Windows 환경에서 Docker를 이용하여 TensorFlow 설치"하는 방법에 대하여 소개하였다.

대부분의 Machine Learning 알고리즘이 고성능 컴퓨팅이 필요한 경우가 많으므로, 자신이 사용하는 PC 환경에 OpenCL, CUDA와 같은 GPU 컴퓨팅을 지원하는 비디오 카드가 있으면 좋겠지만(물론 CPU 병렬 컴퓨팅을 통해서도 가능은 하다),  그렇지 않은 경우 Amazon Web Services(이하 AWS)의 EC2에서 GPU를 지원하는 환경을 설정하여 TensorFlow를 사용하는 것도 하나의 방법이다.

이 글은 AWS EC2에 GPU를 지원하는 환경을 설정하여 TensorFlow설치하고 사용하는 방법을 소개하고자 한다.

* 주의: AWS에 계정이 있으며, AWS를 이용하여 Console에 접속하는 기본적인 AWS 활용법에 대해 알고 있다는 것을 전제로 함.


[참고사이트]

아래의 내용은 다음 사이트들을 참고하여 정리한 것이다.

http://tleyden.github.io/blog/2015/11/22/cuda-7-dot-5-on-aws-gpu-instance-running-ubuntu-14-dot-04/

http://ramhiser.com/2016/01/05/installing-tensorflow-on-an-aws-ec2-instance-with-gpu-support/

[AWS Public AMIs]

대부분의 컴퓨팅 환경 셋팅은 매우 까다로운 경우가 많다. 사이트에서 제시하는대로 따라해도 잘 안 되서 좌절을 하는 경우를 많이 맛보았을 것이다.

아래 내용의 절차대로 설치하는 것이 귀찮고 심지어 두렵기까지 하다면 다음의 Public AMI를 이용하여 자신의 AWS EC2 인스턴스로 가져와서 바로 GPU를 지원하는 TensorFlow를 사용할 수 있다.

다음의 AMI 중 어느 것을 사용해도 무방하다.

[Public AMI 1]: ami-e191b38b (TensorFlow 0.6 with GPU Support)

[Public AMI 2]: ami-9e39dcf3 (TensorFlow 0.8 / CUDA 7.4 / cuDNN 4)


Public AMI 1을 사용하는 경우

Public AMI 1을 클릭하면, 계정이 로그인 되어 있는 경우 바로 AWS EC2의 인스턴스 유형(Instance Type)을 선택하는 페이지로 안내된다 (로그인이 안 되어 있는 경우 로그인 페이지로 안내되니, 미리 로그인 해두는 것도 좋다.)


Filter By > GPU compute를 선택하면, 다음 이미지와 같이 GPU compute 목록이 나온다.


Step 3는 적당히 넘어가고, Step 4: Add Storage에서 원하는 용량의 Storage Size를 입력한다 (10 GiB 이상을 권장함).

Step 5와 Step 6도 적당히 넘어가면 Step 7에서 설정에 대한 리뷰를 쭈욱 훑어본 후, 우측 하단의 [Launch] 버튼을 클릭하면 key pair에 대한 창이 뜬다.

key pair는 AWS EC2의 콘솔에 접속하는데 사용하는 보안 키인데, 기존의 것을 재활용해도 되고, TensorFlow 컴퓨팅을 위한 EC2 인스턴스 전용으로 만들어도 된다.


[Launch Instances] 버튼을 클릭하면 GPU를 지원하는 TensorFlow를 사용할 수 있는 AWS EC2 컴퓨팅 환경설정이 모두 준비된다.


Public AMI 2를 사용하는 경우

Public AMI 2는 홍콩과학기술대의 김성훈 교수님께서 만들어 놓으신  AWS EC2 이미지이다. 쉽고 명확한 머신러닝/딥 러닝 강의를 통해 이 분야의 대중화에 공헌을 하시는 분인데, 이 이미지를 사용할 수 있도록 Public Image로 오픈하신 것이다.

링크 ami-9e39dcf3를 클릭하면 아래의 이미지가 나오는데,

좌측 상단의 [Launch] 버튼을 클릭하면 앞서 설명한 Public AMI 1과 동일한 과정을 통해 AWS EC2에서 GPU를 지원하는TensorFlow를 사용할 수 있다.

만약 기존에 생성한 Public Image를 사용하지 않고, 직접 GPU를 지원하는 TensorFlow 컴퓨팅 환경을 AWS EC2에 설정하고 싶다면 아래의 내용을 참고한다.


AWS EC2 인스턴스 생성하기

아래 이미지에서와 같이 Compute > EC2를 선택하여 인스턴스 생성을 시작한다.


Compute > EC2를 클릭하면 아래와 같이 Resources가 나오는데 [Launch] 버튼을 클릭한다.


Step 1은 Amazon Machine Image(AMI)를 선택하는 단계이다.

Ubuntu Server 14.04 LTS (HVM), SSD Volume Type을 선택한다.


Step 2는 Instance Type(인스턴스 유형)을 선택하는 단계인데, GPU를 지원하는 인스턴스 생성을 위하여 Filter by: 드롭박스에서 GPU instances를 선택하면 아래 이미지와 같이 g2.2xlargeg2.8xlarge가 나온다.

두 옵션의 차이는 CPU 개수, 메모리 사이즈, 스토리지 사이즈이다. 엄청난 Computing을 위한 것이 아닌 테스트 용도라면 g2.2xlarge를 선택하고, [Next: Configure Instance Details] 버튼을 클릭하여 다음 단계로 이동한다.


Step 3는 인스턴스에 대한 세부사항 설정을 하는 단계인데 세부 옵션 설정할 것이 없다면 [Next: Add Storage] 버튼을 클릭하여 다음 단계로 이동한다.


Step 4는 스토리지를 추가하는 단계인데, 기본 스토리지의 용량을 올릴수도 있고, 스토리지를 추가할 수도 있는데, 추가 옵션은 모두 추가 비용이 발생한다는 점을 명시해야 한다.

기본적으로 제공되는 8 GiB는 약간 모자를 수도 있으므로 12 GiB로 설정한다.


Step 5는 Tag를 설정하는 단계이다. Tag는 말 그대로 자신의 AWS 인스턴스에 이름표를 붙여 관리하기 쉽도록 하는 것인데, 이 단계도 그냥 넘어간다(필요 시 추후에 설정이 가능하다).


Step 6은 보안 그룹을 설정하는 단계이다. SSH, TCP, HTTP, HTTPS, POP3 등의 프로토콜과 PORT 번호 및 IP를 커스터마징할 수 있는 단계인데, 역시 TensorFlow를 위한 컴퓨팅 엔진을 설정하는 맥락에서는 당장 설정할 필요가 없으므로 이 단계도 생략한다. [Review Launch]를 클릭하여 다음 단계로 이동한다.


Step 7은 Review Instance Launch인데 Step 1~6을 통해 설정한 옵션들을 확인해 보는 단계이다. 설정한 옵션들이 이상이 없으면 [Launch] 버튼을 클릭하여 다음 단계로 이동한다.


마지막으로 설정할 옵션은 key pair를 생성하는 것이다. 기존의 key pair를 재활용할 수도 있으며 새로 생성할 수도 있다.

"tensorflow"라는 이름으로 key pair를 생성하였다.

[Download Key Pair] 버튼을 클릭하면 생성한 key pair 파일을 다운로드 할 수 있다.

key pair 파일은 보안 상 매우 중요하니 잘 관리하여야 하며, AWS Console에 접근하거나 FTP에 접속할 때 꼭 필요하다.


이제 다운받은 key pair 파일을 통해 AWS Console에 접속해 보자. 참고로 Git Bash를 이용하여 접속하였다 (Linux 혹은 Mac OS에서는 Terminal을 통해 접속가능하다).

$ sudo ssh -i tensorflow.pem ubuntu@{YOUR_PUBLIC_DNS}

{YOUR_PUBLIC_DNS}로 표시한 것은, 생성한 인스턴스의 Public DNS (IPv4)이며, Public DNS 대신 IPv4 Public IP를 입력해도 된다.

AWS Instance Console에 접속이 완료되면 이후의 과정을 통해 GPU를 위한 설정과 TensorFlow 설치 과정을 수행한다.

즉, 이후의 과정은 모두 AWS Instance Conolse(Terminal)에서 수행되는 것들이다.


Essentials

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install -y build-essential git python-pip libfreetype6-dev libxft-dev libncurses-dev libopenblas-dev gfortran python-matplotlib libblas-dev liblapack-dev libatlas-base-dev python-dev python-pydot linux-headers-generic linux-image-extra-virtual unzip python-numpy swig python-pandas python-sklearn unzip wget pkg-config zip g++ zlib1g-dev
$ sudo pip install -U pip


CUDA Toolkit 7.0

$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1410/x86_64/cuda-repo-ubuntu1410_7.0-28_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1410_7.0-28_amd64.deb
$ rm cuda-repo-ubuntu1410_7.0-28_amd64.deb
$ sudo apt-get update
$ sudo apt-get install -y cuda

# verify CUDA
$ nvidia-smi


cuDNN

cuDNN Download

위의 링크를 통해 cuDNN을 다운로드하려면 NVIDIA 개발자 사이트에 등록되어 있어야 하며, 기본 웹브라우저에 로그인 되어 있어야 한다.

단, AWS Console을 통해 다운로드를 할 수 없으므로 자신의 PC 등에서 웹 브라우저를 통해 다운받아서 Filezilla 등 FTP 어플리케이션을 통해 다운받은 파일을 /home/ubuntu/ 경로에 전송한다.

$ tar -zxf cudnn-8.0-linux-x64-v5.1.tgz
$ cd cuda
$ sudo cp lib64/* /usr/local/cuda/lib64/
$ sudo cp include/cudnn.h /usr/local/cuda/include/

# Now reboot
$ sudo reboot


환경변수 등록

$ export CUDA_HOME=/usr/local/cuda
$ export CUDA_ROOT=/usr/local/cuda
$ export PATH=$PATH:$CUDA_ROOT/bin
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CUDA_ROOT/lib64


Bazel 설치

Bazel을 설치하려면 우선 Java 8을 설치해야 한다.

[Java 8 설치]

$ sudo add-apt-repository -y ppa:webupd8team/java
$ sudo apt-get update

# Hack to silently agree license agreement
$ echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-set-selections
$ echo debconf shared/accepted-oracle-license-v1-1 seen true | sudo debconf-set-selections
$ sudo apt-get install -y oracle-java8-installer


[Bazel 설치]

$ sudo apt-get install pkg-config zip g++ zlib1g-dev

Bazel 역시 다음 링크에서 우선 자신의 PC로 다운로드 한다:

https://github.com/bazelbuild/bazel/releases/download/0.1.4/bazel-0.1.4-installer-linux-x86_64.sh

다운로드 후 FileZilla 등을 통해 /home/ubuntu/ 경로에 업로드하여 다음 명령을 실행한다.

$ chmod +x bazel-0.1.4-installer-linux-x86_64.sh
$ ./bazel-0.1.4-installer-linux-x86_64.sh --user
$ rm bazel-0.1.4-installer-linux-x86_64.sh


TensorFlow Repo 설치

$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow


TensorFlow Build with GPU Support

$ cd tensorflow
$ TF_UNOFFICIAL_SETTING=1 ./configure


Bazel을 통한 Build를 수행한다.

$ bazel build -c opt --config=cuda //tensorflow/cc:tutorials_example_trainer
$ bazel build -c opt --config=cuda //tensorflow/tools/pip_package:build_pip_package
$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
$ sudo pip install --upgrade /tmp/tensorflow_pkg/tensorflow-0.6.0-cp27-none-linux_x86_64.whl


Test

다음과 같이 기본 테스트를 실행해 본다.

import tensorflow as tf
tf_session = tf.Session()
x = tf.constant(1)
y = tf.constant(1)
tf_session.run(x + y)


MNIST 데이터세트에 대하여 CNN(Convolutional Neural Network)을 수행해 본다.

python ~/tensorflow/tensorflow/models/image/mnist/convolutional.py

# Lots of output followed by GPU-related things...
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:909] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:103] Found device 0 with properties:
name: GRID K520
major: 3 minor: 0 memoryClockRate (GHz) 0.797
pciBusID 0000:00:03.0
Total memory: 4.00GiB
Free memory: 3.95GiB
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0:   Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:702] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GRID K520, pci bus id: 0000:00:03.0)
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:42] Allocating 3.66GiB bytes.
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:52] GPU 0 memory begins at 0x7023e0000 extends to 0x7ec556000
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:66] Creating bin of max chunk size 1.0KiB
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:66] Creating bin of max chunk size 2.0KiB
...
Initialized!
Epoch 0.00
Minibatch loss: 12.053, learning rate: 0.010000
Minibatch error: 90.6%
Validation error: 84.6%
Epoch 0.12
Minibatch loss: 3.282, learning rate: 0.010000
Minibatch error: 6.2%
Validation error: 6.9%
Epoch 0.23
Minibatch loss: 3.466, learning rate: 0.010000
Minibatch error: 12.5%
Validation error: 3.7%
Epoch 0.35
Minibatch loss: 3.191, learning rate: 0.010000
Minibatch error: 7.8%
Validation error: 3.4%
Epoch 0.47
Minibatch loss: 3.201, learning rate: 0.010000
Minibatch error: 4.7%
Validation error: 2.7%
...


References

https://gist.github.com/dennybritz/8c2ca115b72ea98e5192

TensorFlow Instruction Guide

Comments