04-29 21:07
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[Artificial Intelligence / PyTorch] Amazon EC2에 PyTorch 개발환경 구축하기 본문

Artificial Intelligence/PyTorch

[Artificial Intelligence / PyTorch] Amazon EC2에 PyTorch 개발환경 구축하기

cinema4dr12 2017. 12. 20. 21:49

Written by Geol Choi | 


이번 포스팅에서는 Amazon Cloud EC2PyTorch 개발환경을 구축하는 방법에 대하여 알아보고자 합니다.


PyTorch는 Facebook AI Research (FAIR)에서 주도적으로 개발하고 있으며, Google의 TensorFlow와 함께 딥러닝 프레임워크(Deep Learning Frameworks)에서 어느 정도 양대 산맥이 되어가고 있는 듯 합니다. 그만큼 많은 유저 커뮤니티를 이루고 있지만 윈도우즈 유저들에게 안타깝게도 아직 Windows OS는 공식적으로 지원하고 있지 않습니다. 다만, 몇명의 파이오니어들의 공로로 Windows에 개발환경을 구축할 수 있음을 확인할 수 있습니다 (Windows에 PyTorch 설치하기).


좀 더 오피셜하게는 다음 링크를 확인하시기 바랍니다:


혹시 TensorFlow와 PyTorch 중 어느 딥러닝 프레임워크를 배워야 할지 고민하는 분이 계시다면 아래 아티클들을 참고하시기 바랍니다:


그러나, 이번 포스팅에서는 이러한 이슈와 상관없이 Amazon Web Serivces EC2에 GPU(CUDA)를 지원하는 PyTorch 개발환경을 구축하는 방법을 소개하고 PyTorch 예제를 하나 실행해 보도록 하겠습니다.


AWS EC2 컴퓨팅 서버 구축하기

AWS EC2 웹사이트에 접속하신 후 로그인을 한 후 (만약 계정이 없으면 생성하시기 바랍니다), 데이터 서버가 있는 지역(저는 '서울'로 지정하였습니다)을 선택하면 AWS 서비스 웹페이지가 나오는데 "AWS 서비스 > 모든 서비스 > 컴퓨팅 > EC2"를 클릭합니다.



EC2 페이지로 이동하면 아래 이미지와 같이 "인스턴스 생성 > 인스턴스 시작" 버튼을 클릭하여 인스턴스 생성을 시작합니다.



단계 1: Amazon Machine Image(AMI) 선택

첫번째 단계는 Amazon Machine Image(AMI)를 선택하는 것입니다. AMI는 사용자가 자신이 원하는 서버를 편리하게 구축할 수 있도록 다양한 용도로 미리 셋팅되어 있는 이미지입니다. 용도에 따른 다양한 OS와 하드웨어(GPU 등)가 준비되어 있습니다.


본 튜토리얼에서는 Deep Learning AMI (Ubuntu)를 선택하도록 하겠습니다. 이 이미지에는 MXNet, TensorFlow, Caffe2, PyTorch, Theano, CNTK, Keras 등 다양한 딥러닝 프레임워크가 미리 준비되어 있습니다. 따라서, 본 튜토리얼을 통해 구축된 서버를 이용하여 이들 딥러닝 프레임워크를 얼마든지 사용가능합니다.



단계 2: 인스턴스 유형 선택

두번째 단계는 인스턴스 유형을 선택하는 단계인데, 용도에 맞게 CPU, 메모리, 스토리지 공간 등을 선택하시면 됩니다. 물론 구성 스펙인 올라갈 수록 시간당 이용료가 올라갑니다. 일단 지금은 구축하고 간단한 테스트 예제를 실행하는 연습을 하는 목적이므로 "프리 티어(Free Tier)"를 선택하겠습니다. 이후에 얼만든지 옵션을 변경할 수 있습니다.


참고로, "프리 티어"는 등록 후 12개월 간은 매월 최대 750시간까지 무료입니다. t2.micro 유형을 선택하도록 합니다.



우측 하단의 "다음: 인스턴스 세부 정보 구성" 버튼을 클릭하여 다음 단계로 이동합니다.

단계 3: 인스턴스 세부 정보 구성

세번째 단계는 인스턴스의 세부 정보를 구성하는 단계입니다. 크게 변경할 옵션이 없다면 우측 하단의 [다음: 스토리지 추가] 버튼을 클릭하여 다음 단계로 이동합니다. 참고로 옵션은 구성이 모두 완료된 후 향후에도 변경이 가능합니다.



단계 4: 스토리지 추가

네번째 단계는 스토리지를 추가하는 단계입니다. 인스턴스에 대한 기본 스토리지를 추가하는 단계인데, 인스턴스를 시작한 후 추가 EBS 볼륨을 연결할 수도 있지만, 인스턴스 스토어 볼륨은 연결할 수 없으므로 향후 정식으로 서버를 구축할 때에는 중요하게 고려해야 합니다. 기본 50GB인데 딥러닝을 하다보면 데이터셋의 크기가 방대하므로 인스턴스를 새로 구성해야하는 난관에 부딪힐 수 있습니다.


일단은 기본 옵션으로 선택하고 우측 하단의 [다음: 태그 추가] 버튼을 클릭하여 다음 단계로 이동합니다.



단계 5: 태그 추가

다섯번째 단계는 태그를 추가하는 단계입니다. 태그는 자신의 이미지 리소스에 고유의 이름을 지어주는 것을 의미합니다. 향후 관리 차원에서 중요할 수 있지만 현재로서는 큰 의미가 없으므로 이 단계 또한 넘어가도록 하겠습니다. 역시 우측 하단의 [다음: 보안 그룹 구성] 버튼을 클릭하여 다음 단계로 이동합니다.



단계 6: 보안 그룹 구성

여섯번째 단계는 보안 그룹을 구성하는 단계입니다. 접속 유형이라든가 허용 IP 범위 등을 설정하여 보안을 구성합니다.


다양한 구성이 가능하며 저의 습관 상 아래와 같이 규칙을 추가하였습니다. 우측 하단의 [검토 및 시작]을 클릭하여 다음 단계로 이동합니다.


단계 7: 인스턴스 시작 검토

일곱번째 단계는 지금까지 구성한 인스턴스 옵션들을 리뷰하고 변경할 수 있는 단계입니다. 아래 이미지를 보면 몇가지 경고가 나옵니다. 특히 "해당 인스턴스 구성은 프리 티어에 사용할 수 없습니다."라는 경고 문구가 보이는데 아마도 저는 이미 프리 티어 단계가 완료되어 그런 것 같습니다.


단계 8: 키페어 구성

이번 단계는 정식적인 단계는 아니지만 서버 접속을 위한 매우 중요한 단계입니다. 키가 없으면 서버 접속을 할 수 없기 때문입니다.


아래 이미지와 같이 "새 키 페어 생성" 옵션을 선택하고 키 페어 이름으로 "pytorch"로 설정한 후 [키 페어 다운로드] 버튼을 클릭하여 해당 키를 자신의 로컬 드라이브에 저장합니다.



축하드립니다. 이제 서버 구축을 위한 모든 단계가 완료되었습니다. 우측 하단의 [인스턴스 보기] 버튼을 클릭하여 인스턴스 리스트를 볼 수 있는 페이지로 이동합니다.


아래 이미지와 같이 새로운 인스턴스가 등록되었습니다 (저의 경우, 이미 생성한 두 개의 인스턴스가 있습니다).




터미널 연결 테스트

명령 터미널(또는 명령 콘솔)을 이용하여 생성된 인스턴스와 연결하는 방법에 대해 소개하고자 합니다.


생성된 AWS EC2 인스턴스 페이지에서 생성한 인스턴스를 생성하고 상단의 [연결] 버튼을 클릭합니다. 



그러면 아래 이미지와 같이 인스턴스 연결에 대한 안내 창이 나옵니다.




퍼블릭 DNS는 사용자마다 다릅니다. 그러나, "예:"에서 설명된대로 ssh 명령의 옵션으로 자신이 생성한 인스턴스의 퍼블릭 DNS를 입력하여 인스턴스와 연결할 수 있습니다. 그전에 우선 명령 터미널에서 프라이빗 키 파일(pytorch.pem)이 저장된 곳으로 이동합니다. 가령, 키 파일이 "home/Documents/AWS/" 경로에 저장되어 있다고 한다면,


$ cd Documents/AWS/


를 입력하여 해당 경로로 이동 후 ssh 명령으로 인스턴스에 연결합니다. 예를 들어 아래 이미지와 같은 방식으로 연결될 것입니다:

성공적으로 연결되면 아래 이미지와 같이 명령 프롬프트가 보일 것입니다.


아래의 명령을 입력하여 Applications을 업데이트 합니다:


$ sudo apt-get update -y


PyTorch 동작 테스트

앞서 AWS EC2 인스턴스 연결 시 아래와 같은 메시지들을 보았을 것입니다:


The authenticity of host 'ec2-52-79-119-210.ap-northeast-2.compute.amazonaws.com (52.79.119.210)' can't be established.
ECDSA key fingerprint is SHA256:uubf572O0tVsCTk5H6/yIoXrC9uh4tgShhCAb51Gsec.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'ec2-52-79-119-210.ap-northeast-2.compute.amazonaws.com,52.79.119.210' (ECDSA) to the list of known hosts.
=============================================================================
       __|  __|_  )
       _|  (     /   Deep Learning AMI  (Ubuntu)
      ___|\___|___|
=============================================================================

Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-1022-aws x86_64v)

Please use one of the following commands to start the required environment with the framework of your choice:
for MXNet(+Keras1) with Python3 (CUDA 9) _____________________ source activate mxnet_p36
for MXNet(+Keras1) with Python2 (CUDA 9) _____________________ source activate mxnet_p27
for TensorFlow(+Keras2) with Python3 (CUDA 8) ________________ source activate tensorflow_p36
for TensorFlow(+Keras2) with Python2 (CUDA 8) ________________ source activate tensorflow_p27
for Theano(+Keras2) with Python3 (CUDA 9) ____________________ source activate theano_p36
for Theano(+Keras2) with Python2 (CUDA 9) ____________________ source activate theano_p27
for PyTorch with Python3 (CUDA 9) ____________________________ source activate pytorch_p36
for PyTorch with Python2 (CUDA 9) ____________________________ source activate pytorch_p27
for CNTK(+Keras2) with Python3 (CUDA 8) ______________________ source activate cntk_p36
for CNTK(+Keras2) with Python2 (CUDA 8) ______________________ source activate cntk_p27
for Caffe2 with Python2 (CUDA 9) _____________________________ source activate caffe2_p27
for base Python2 (CUDA 9) ____________________________________ source activate python2
for base Python3 (CUDA 9) ____________________________________ source activate python3

Official Conda User Guide: https://conda.io/docs/user-guide/index.html
AWS Deep Learning AMI Homepage: https://aws.amazon.com/machine-learning/amis/
Developer Guide and Release Notes: https://docs.aws.amazon.com/dlami/latest/devguide/what-is-dlami.html
Support: https://forums.aws.amazon.com/forum.jspa?forumID=263

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

28 packages can be updated.
14 updates are security updates.



The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.

주황색으로 하이라이트 되어 있는 부분은 지원되는 딥러닝 프레임워크가 설치되어 있는 Python 가상환경을 활성화하는 방법을 나타내고 있습니다. 이미 다양한 딥러닝 프레임워크 개발 환경들이 준비되어 있으니 너무나도 편리하게 사용할 수 있습니다.


이 중 빨간색으로 하이라이트 되어 있는, CUDA 9.X를 지원하는 PyTorch 가상환경을 활성화하도록 하겠습니다. 2.7이나 3.6 중 각자가 편한 것을 사용할 수 있으나 본 튜토리얼에서는 3.6을 사용하도록 하겠습니다:


ubutu@ip-xxxx:~$ source activate pytorch_p36
(pytorch_p36) ubuntu@ip-xxxx:~$


아래의 명령을 통해 Python 명령 프롬프트로 진입 후,


(pytorch_p36) ubuntu@ip-xxxx:~$ python
Python 3.6.3 |Anaconda, Inc.| (default, Nov 20 2017, 20:41:42)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>


다음과 같이 PyTorch 라이브러리를 임포트합니다:


>>> import torch
>>>


만약 아무런 문제없이 다음 프롬프트로 넘어간다면 PyTorch 라이브러리가 정상적으로 임포트 된 것입니다. 무슨 의미냐하면, 만약 PyTorch 가상환경에서 TensorFlow 라이브러리를 임포트한다면 아래와 같은 임포트 실패 메시지가 출력될 것입니다:


>>> import tensorflow as tf
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'tensorflow'
>>>


FTP 설정하기

구축한 AWS EC2 서버에 파일을 업로드하는 다양한 방법이 있겠지만 가장 편리하다고 생각되는 방법이 FTP를 통해 업로드 하는 방법입니다. vim, nano와 같은 명령 터미널을 통해 Python Code를 작성할 수도 있겠지만 이를 통해 디버깅 하는 것은 여간 불편한 일이 아닙니다. 따라서, 일반적으로는 로컬 컴퓨터에서 충분히 디버깅과 동작을 확인 및 검증 후 고성능이 요구되는 클라우드 서버에 코드를 업로드하여 실행하는 것이 바람직합니다.


FTP 소프트웨어는 어느 것을 사용해도 되지만 근래 가장 인기있는 것은 FileZilla가 아닐까 생각됩니다. 성능도 괜찮고 사용하기도 쉽고 무엇보다도 무료라는 것이 그 이유가 되지 않을까 생각됩니다.


FileZilla 웹사이트를 방문하여 소프트웨어를 다운로드하고 설치합니다. FileZilla를 실행 후 사이트 관리자(메뉴 > 파일 > 사이트 관리자)를 실행합니다.



새 사이트 이름을 "AWS-pytorch"로 정하였으며, "일반" 탭에서 프로토콜(T)을 "SFTP"을, "로그온 유형(L)"은 "키 파일"을 선택합니다.



"사용자(U)"에는 "ubuntu"를 입력하고, "키 파일(K)" 우측의 [찾아보기...] 버튼을 클릭하여 서버 구축 시 저장하였던 프라이빗 키를 선택합니다. 그리고 "포트(P)"에는 22를 입력합니다.



"호스트(H)"에는 아래 이미지와 같이 AWS EC2의 인스턴스가 선택된 상태에서 우측 아래의 퍼블릭 DNS(IPv4) 값을 복사하여 입력합니다.

그리고 [연결] 버튼을 클릭하면 아래와 같은 창이 나오는데 "항상 이 호스트를 신뢰하고 이 키를 캐시에 등록(A)"을 체크하고 [확인] 버튼을 클릭하면 FTP 연결을 위한 과정이 모두 완료됩니다.



예제 코드 테스트하기

마지막 단계로 예제 코드를 FileZilla를 통해 AWS EC2 서버에 업로드하고 코드를 실행해보도록 하겠습니다. 코드는 홍콩과기대(HKUST) 김성훈 교수의 Github Repository "DeepLearningZeroToAll"에서 pytorch 폴더에 있는 lab-05-1-logistic_regression.py 코드를 사용하도록 하겠습니다.


해당 코드는 다음과 같습니다:


37 lines (28 sloc)  1.12 KB
# Lab 5 Logistic Regression Classifier
import torch
from torch.autograd import Variable
import numpy as np
torch.manual_seed(777)
x_data = np.array([[1, 2], [2, 3], [3, 1], [4, 3], [5, 3], [6, 2]], dtype=np.float32)
y_data = np.array([[0], [0], [0], [1], [1], [1]], dtype=np.float32)
X = Variable(torch.from_numpy(x_data))
Y = Variable(torch.from_numpy(y_data))
# Hypothesis using sigmoid: tf.div(1., 1. + tf.exp(tf.matmul(X, W)))
linear = torch.nn.Linear(2, 1, bias=True)
sigmoid = torch.nn.Sigmoid()
model = torch.nn.Sequential(linear, sigmoid)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
for step in range(10001):
optimizer.zero_grad()
hypothesis = model(X)
# cost/loss function
cost = -(Y * torch.log(hypothesis) + (1 - Y)
* torch.log(1 - hypothesis)).mean()
cost.backward()
optimizer.step()
if step % 200 == 0:
print(step, cost.data.numpy())
# Accuracy computation
predicted = (model(X).data > 0.5).float()
accuracy = (predicted == Y.data).float().mean()
print("\nHypothesis: ", hypothesis.data.numpy(), "\nCorrect (Y): ", predicted.numpy(), "\nAccuracy: ", accuracy)


Python Code 다운로드: lab-05-1-logistic_regression.py


우선 FileZilla에서 "/home/ubuntu/tutorials/PyTorch" 경로에 업로드 합니다.

이제 명령 터미널에서 해당 경로로 이동하면 업로드한 Python Code가 보일 것입니다.

이제 Python Code를 실행합니다:


$ python lab-05-1-logistic_regression.py


코드 실행 화면은 다음과 같습니다.

그리고, 마지막으로 실행 출력 결과는 다음과 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
(pytorch_p36) ubuntu@ip-172-31-0-232:~/tutorials/PyTorch$ python lab-05-1-logistic_regression.py
0 [ 1.71229613]
200 [ 0.55874169]
400 [ 0.48905891]
600 [ 0.45216355]
800 [ 0.42799503]
1000 [ 0.40953714]
1200 [ 0.39402437]
1400 [ 0.38024762]
1600 [ 0.36763126]
1800 [ 0.3558805]
2000 [ 0.34483218]
2200 [ 0.33438915]
2400 [ 0.32448757]
2600 [ 0.31508172]
2800 [ 0.30613571]
3000 [ 0.29761967]
3200 [ 0.28950712]
3400 [ 0.28177419]
3600 [ 0.27439904]
3800 [ 0.2673611]
4000 [ 0.2606411]
4200 [ 0.25422108]
4400 [ 0.24808392]
4600 [ 0.24221388]
4800 [ 0.2365959]
5000 [ 0.23121582]
5200 [ 0.2260606]
5400 [ 0.22111771]
5600 [ 0.21637559]
5800 [ 0.21182325]
6000 [ 0.2074506]
6200 [ 0.20324801]
6400 [ 0.1992064]
6600 [ 0.1953174]
6800 [ 0.19157311]
7000 [ 0.18796612]
7200 [ 0.18448943]
7400 [ 0.18113652]
7600 [ 0.17790125]
7800 [ 0.17477784]
8000 [ 0.17176092]
8200 [ 0.16884524]
8400 [ 0.16602618]
8600 [ 0.16329901]
8800 [ 0.16065963]
9000 [ 0.15810403]
9200 [ 0.1556284]
9400 [ 0.15322906]
9600 [ 0.15090273]
9800 [ 0.14864622]
10000 [ 0.14645647]
 
Hypothesis:  [[ 0.02947675]
 [ 0.15709856]
 [ 0.29876292]
 [ 0.7841844 ]
 [ 0.94132739]
 [ 0.98075849]]
Correct (Y):  [[ 0.]
 [ 0.]
 [ 0.]
 [ 1.]
 [ 1.]
 [ 1.]]
Accuracy:  1.0
cs


맺음 말

이상으로 Amazon Web Services의 EC2를 이용하여 딥러닝 컴퓨팅 서버를 구축하고 예제 코드를 실행하는 방법에 대하여 알아보았습니다.


구축된 컴퓨팅 서버를 활용하여 비단 PyTorch 뿐만아니라 TensorFlow, MXNet 등 다양한 딥러닝 프레임워크를 활용할 수 있으므로 본인이 가지고 있는 컴퓨터 성능이 부족하여도 고성능 딥러닝 연산을 할 수 있습니다.


단, 요금 과금에 주의하실 필요가 있으며, 사용하지 않을 경우에는 가급적 인스턴스 상태를 "중지" 상태로 하는 것이 좋습니다. 인스턴스가 재부팅 되는 경우 퍼블릭 DNS가 변경됨에 주의하시기 바랍니다.


AWS EC2에는 CPU 활용도에 따라 자동으로 인스턴스를 중지 상태로 들어갈 수 있도록 하는 옵션이 있으니 깜빡하고 비용 과금이 되는 것을 방지할 수 있습니다. 적극 활용하시기 바랍니다.

Comments