AWS 스팟 인스턴스 + Deep Learning AMI

AWS의 EC2 스팟spot 인스턴스와 함께 AWS 공식 Deep Learning AMI를 사용하는 법에 대해 간단히 따라가 보도록 하겠습니다. 이 글은 ‘홍대 머신러닝 스터디‘를 위해 작성되었습니다.

먼저 AWS 페이지에서 계정을 만들어야 합니다. 계정을 만들 때 향후 결재를 위해 신용카드 정보를 입력해야 하는 것외에는 특별한 것은 없습니다. 계정을 만들고 AWS 콘솔에 로그인해서 메뉴바에 서비스 드롭다운 메뉴를 펼쳐 EC2를 찾아 클릭합니다.

스팟 인스턴스는 왼쪽 메뉴 ‘스팟 요청’에서 할 수 있습니다. 그런데 웬일인지 이 메뉴를 통해 스팟 인스턴스를 요청할 때는 아마존의 Deep Learning AMI(서버 이미지)를 찾을 수가 없었습니다. 물론 직접 Nvidia 드라이버와 텐서플로를 설치해도 되지만 편리하게 제공해 주는 것을 마다할 이유는 없겠지요.

아마존의 Deep Learning AMI를 사용해서 스팟 인스턴스를 띄우려면 먼저 아래 그림과 같이 좌측의 ‘AMI’ 메뉴에서 가능합니다. 혹시 서울 리전이 아니더라도 크게 상관은 없습니다만 아래 화면과 다를 수 있습니다. 서울 리전은 오른쪽 위에서 이름 옆의 드롭다운에서 선택할 수 있습니다. 검색창의 드롭다운 메뉴를 ‘퍼블릭 이미지’로 바꾼 다음  ‘deep learning ami’를 찾습니다. 아마존 리눅스와 우분투가 있는데 여기서는 우분투 버전을 선택했습니다.

스크린샷 2018-01-17 오후 8.29.36

그 다음 ‘작업’ 버튼을 눌러 ‘스팟 요청’ 메뉴를 클릭합니다.

스크린샷 2018-01-17 오후 8.29.57

그 다음 페이지에서 인스턴스 유형을 선택합니다. 필터링 기준을 ‘GPU compute’로 하면 GPU가 가능한 인스턴스 유형을 보여 줍니다. 여기서는 가장 싼 p2.xlarge를 선택하겠습니다. 그런 다음 ‘다음’ 버튼을 누릅니다.

스크린샷 2018-01-17 오후 8.30.23

다음 페이지에서 이 스팟 인스턴스의 예상 가격이 보이고 여러가지 설정을 할 수 있습니다. 특별히 기본설정을 바꾸지 않고 그냥 사용하겠습니다. 다음 페이지에서 스토리지와 추가적인 설정을 할 수 있지만 그냥 기본값을 적용하려고 ‘검토 및 시작’ 버튼을 누릅니다.

스크린샷 2018-01-17 오후 8.31.24

EC2 인스턴스에 접속하려면 ssh 키가 있어야 합니다. 새로운 키를 생성할 수도 있고 이미 AWS를 쓰고 있었다면 기존 키를 선택해도 됩니다. 여기에서는 새로 키를 만들어 보았습니다. ‘키 페어 이름’에 간단한 이름을 입력하고 ‘키 페어 다운로드’ 버튼을 누릅니다. 이 키 파일은 인스턴스 접속에 꼭 필요하니 잘 보관해 두어야 합니다. 키를 잃어버리면 인스턴스에 접속할 수 있는 다른 방법은 없습니다. 그 다음 ‘스팟 인스턴스 요청’ 버튼을 누릅니다.

스크린샷 2018-01-17 오후 8.32.21

스팟 요청이 완료 되었습니다. ‘스팟 요청 보기’ 버튼을 누르면 현재 진행되는 상태를 확인할 수 있습니다.

스크린샷 2018-01-17 오후 8.32.34

‘스팟 요청’ 메뉴로 이동해서 리스트를 보여 줍니다. 방금 신청한 p2.xlarge 인스턴스가 있는 행을 클릭하면 아래 상세 내용이 보여집니다. 단계가 ‘active’가 되면 성공한 것입니다. 그럼 설치된 인스턴스를 보기 위해 인스턴스 아이디를 클릭하던지 아니면 왼쪽에서 ‘인스턴스’ 메뉴를 클릭합니다.

스크린샷 2018-01-17 오후 8.33.05

스팟 요청에서 신청한 인스턴스 아이디를 클릭하면 현재 상태가 제공됩니다. 따로 복사해 놓을 것은 쉘 접속을 위한 공인 아이피 주소입니다. ‘상태 검사’가 체크 완료가 되면 서버에 접속할 수 있는 상태가 된 것입니다.

스크린샷 2018-01-17 오후 8.33.30

서버 접속은 간단합니다. 원하는 쉘 또는 SSH 프로그램을 열고 다운 받았던 키 파일(.pem 파일)을 지정해서 id@host 에 접속하면 됩니다. 앞서 Deep Learning AMI 에서 우분투 서버를 선택했기 때문에 계정 아이디는 ‘ubuntu’입니다. 아래 이미지를 참고하세요.(macOS나 리눅스 환경이라면 .pem 파일의 권한을 600으로 바꾸어 주세요)

스크린샷 2018-01-17 오후 8.38.24

nvidia-smi 명령으로 GPU를 확인해 보겠습니다. Nvidia Tesla K80 이 장착된 것을 확인할 수 있습니다.

스크린샷 2018-01-17 오후 8.39.01

아마존 Deep Learning AMI는 아나콘다 환경으로 준비되어 있습니다. 따라서 conda env list 하면 현재 사용할 수 있는 전체 환경을 보여 줍니다. 여기에서는 Caffe, Mxnet, PyTorch, TensorFlow, Theano가 보입니다.

파이썬 3.6 버전에 설치된 텐서플로를 사용하려면 해당 conda 환경을 활성화해 줍니다.

source activate tensorflow_p36

그런 다음 IPython 쉘을 띄워서 텐서플로를 임포해 봅니다. 아무런 에러가 없으면 정상적으로 설치된 것입니다(파이썬 3.6 버전에 맞지 않게 컴파일되었다는 경고는 무시해도 됩니다). 또한 텐서플로의 로깅을 활성화시켜 GPU 버전이 잘 설치되었는지 확인합니다.

스크린샷 2018-01-17 오후 8.44.10

IPython 쉘 외에 주피터 노트북을 띄워서 브라우저로 접속하려면 서버의 보안 설정을 바꾸어 주어야 합니다. 기본적으로 EC2 인스턴스는 SSH를 위한 22번 포트만 열려 있습니다. 주피터 노트북을 사용하려면 TCP 8888 포트를 열어 주어야 합니다.

보안 그룹은 인스턴스 마다 설정할 수 있는 방화벽 설정을 관리합니다. 하나의 보안 그룹을 여러개의 인스턴스에 적용할 수도 있습니다. 인스턴스 상세 정보에 있는 ‘보안 그룹’ 링크를 클릭해도 되고 왼쪽 메뉴에서 ‘보안 그룹’을 선택할 수도 있습니다.

스크린샷 2018-01-17 오후 8.46.39

인바운드 탭에서 ‘편집’ 버튼을 눌러 추가하고자 하는 포트를 입력합니다. 여기에서는 TCP 8888 포트를 추가합니다. 나의 아이피만 접근하게 하려면 ‘소스’ 부분에 내 컴퓨터의 아이피를 입력합니다. 여기서는 그냥 비워 두겠습니다.

스크린샷 2018-01-17 오후 8.48.52

‘저장’ 버튼을 누르면 바로 보안 설정이 적용됩니다. 다시 터미널로 돌아와 주피터 노트북을 띄워 보겠습니다. 주피터 노트북에서도 localhost 외에 인스턴스의 공인 아이피에서 들어오는 트래픽을 받기 위해 아이피를 지정해 주어야 합니다. 여기서는 간단하게 모든 아이피에 바인딩하였습니다.

$ jupyter notebook --ip=*

스크린샷 2018-01-17 오후 8.49.40

브라우저에서 주피터 노트북을 실행했을 때 출력된 주소를 복사해 붙여 넣습니다. 이 때 아이피는 스팟 인스턴스의 공인 아이피로 바꾸어 줍니다.

스크린샷 2018-01-17 오후 8.50.02

짠, 스팟 인스턴스에서 주피터 노트북을 띄우는데 성공했습니다. 실제로 한번만 해보면 매우 간단합니다. 특히 아마존의 Deep Learning AMI를 사용할 수 있어서 아주 편리합니다. AWS 인스턴스에서 실행한 프로그램이 터미널의 세션이 끊기더라도 계속 진행될 수 있도록 screen 프로그램의 사용법과 스팟 인스턴스가 종료되더라도 EBS 볼륨을 유지하여 작업한 결과를 보존하는 방법은 김성훈님의 동영상을 참고하세요. 🙂

AWS 스팟 인스턴스 + Deep Learning AMI”에 대한 3개의 생각

  1. 핑백: AWS 스팟 인스턴스 + Deep Learning AMI | it 사람들의 오늘 이야기

  2. 핑백: AWS 주간 소식 모음 – 2018년 1월 22일 - 지락문화예술공작단

  3. 핑백: AWS 주간 소식 모음 – 2018년 1월 29일 - 지락문화예술공작단

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중