EC2 + Docker + Flask 이용해서 딥러닝 서버 만들기

Chan Young Jeong·2023년 6월 6일
0

이번 학기 캡스톤 디자인 프로젝트를 진행하면서 개발한 딥러닝 서버 구축이야기를 담아볼까한다.
크게 개발했던 순서는 다음과 같다.

  1. 로컬 개발환경에서 python flask 웹 api 서버 만들기
  2. requirements.txt 파일 만들기
  3. github에 프로젝트 올리기
  4. EC2 인스턴스 만들기
  5. EC2 환경 설정하기
  6. 도커 이미지 만들기
  7. 도커 컨테이너 실행하기
  8. 도커 컨테이너에서 환경 설정하기
  9. url로 웹페이지 접속하기

EC2 P2 인스턴스 만들기

이번에는 딥페이크 모델을 돌리기 위한 서버를 만들어야 하기 때문에 GPU가 포함된 인스턴스를 만들고자 한다. 찾아보니 P2 인스턴스가 학교에서 지원해주는 지원금과 성능을 비교해보니 가장 합리적인 것 같아 p2.xlarge 인스턴스를 선택했다. P2 인스턴스는 NVIDIA K80 GPU를 사용한다. (그리고 다음 요금은 미국 동/서부 기준 요금이고, 한국은 p2.xlarge 요금이 시간당 1.45 USD이다. 거의 1.5배차이..) 그래서 미국 동부로 선택하여 인스턴스 생성!

하지만 당연히 마음대로 잘 되지 않았다. 알고보니 인스턴스에 따라 사용할 수 있는 vCPU limit이 있어서 이를 풀어줘야 인스턴스를 사용할 수 있었다.. 😢😢😢😢😢😢

제한 계산기

vCPU 제한 푸는 방법

이 제한을 풀기 위해서는 서비스 제한 증가 요청을 보내야한다...
나는 금요일에 요청을 보냈더니 화요일에 연락이 왔다. (항상 느끼는 거지만 메일을 정말 친절하게 답장해준다.) 드디어! GPU가 있는 EC2를 만들 수가 있었다.

EC2 개발 환경 설정

EC2를 만들고 나서 서버 배포를 위해 여러가지 설정을 진행했다. 가장 먼저 python 버전 확인! 아.. 3.10.6 버전이었다. 나에게 필요한 버전은 python 3.9버전 이하였기 때문에 가장 먼저 파이썬 버전 설정을 할 필요가 있었다. 결론적으로 ec2 안에서 ec2 자체의 파이썬 버전 설정하는 것은 포기하였다. 이를 하는 방법은 여러가지가 있었으나 파이썬 3.9이하 버전을 설치해도 python, pip 등 설정할 것이 너무 많았기 때문이다. 그래서 python 3.9이하 버전이 깔린 도커 이미지를 가지고 와서 아예 새로운 도커 환경을 만드는 것!

실패1

https://hub.docker.com/_/python 에서 python 3.9 버전 이미지를 가지고와서 컨테이너를 만들고 컨테이너 안에서 git clone을 해서 flask 서버를 실행시킬 계획을 가지고 있었다. 계획은 그럴듯 했으나 실패. 첫번째로 발생한 오류는

pip install -r requirements.txt

를 실행하면서 발생한 오류였다. torch를 install 하는 중 "no space left on device" 오류가 발생...!! 흠 일단 침착하고 오류를 검색해보았다. 말 그대로 공간 부족!

$ df -h
$ sudo growpart /dev/xvda 1
$ lsblk
$ sudo resize2fs /dev/xvda1

df -h 현재 디스크의 용량과 사용량을 확인할 수 있다. 확인해 본 결과 torch파일이 적어도 1.8GB 이상인데 /dev/root의 이용가능한 공간이 1.5GB였던 것. 이를 해결하기 위해 /dev/root의 공간을 늘려줘야 했다. 안쓰는 파일을 삭제한다던가 하는 방법이 있는데, 나는 다 필요한 파일들이었기 때문에 공간 자체를 늘려줄 필요가 있었다.

참고한 링크

/dev/root 8GB -> 16GB로 Size가 증가시키기 성공!

첫 번째 문제는 해결을 했으나 두 번째 문제가 있었다. docker hub에서 가져온 이미지에서 nvidia driver를 설치할 수 없었던 것...! 이건 애초부터 문제.... 그래서 우분투 20.04와 파이썬 3.9이하 버전의 이미지를 찾아보기 시작..ㅠㅠ

실패2

찾고 찾아서 우분투22.04파이썬3.8 이미지 를 찾았다! 이미 위에서 용량은 증가시켜 놓았기 때문에 다시 해줄 필요는 없었다.
깃 clone도 잘했고 requirements.txt도 잘 설치했다. 오케이 굿!
기대반 걱정반으로 flask를 실행하고 요청을 보내봤는데, 어라? 뭔가 이상하다. 분명 요청이랑 응답도 잘 오는데 너무 시간이 오래 걸리는 것. 로컬에서 딥페이크 모델을 돌렸을 때보다 더 시간이 오래걸렸다. 확인해 봤는데 cpu를 사용하고 있었던 것.. (왜 gpu가 있는데,, 사용을 못하니...!!!!!) 생각해보니가 nvidia-driver를 설치를 안 했던 것..

AWS EC2에서 GPU를 사용하려면?

nvidia-driver를 설치하고 nvidia-smi를 실행하면 Tesla K80이 잘 있는 것을 확인할 수 있다!

아 그런데 생각해보니 이 방식은 Docker에서 GPU를 사용하는 방식이 아니라 EC2에서 GPU를 사용하는 방식이었던 것,... 그래서 온갖지해서 컨테이너 안에도 nvidia-driver 설치했는데 알고보니 굳이 그럴 필요 없었다. 왜냐하면 Docker 컨테이너 내부에는 호스트 시스템에 이미 설치된 nvidia 드라이버를 사용할 수 있기 때문에..
따라서 Docker 컨테이너 안에서 별도로 nvidia 드라이버를 설치할 필요가 없던 것... 그러면 실패1에서 끝났을 수도..? 후.. 내 하루.. 돌려줘

스택오버플로우

https://bbs.archlinux.org/viewtopic.php?id=266915

드디어 성공

$ docker run -it --gpus all --name="my_flaks" -p 5000:5000/tcp /bin/bash

삐빅 돌아가세요. 아직 에러가 남았습니다.

Error response from daemon: could not select device driver "" with capabilities: [[gpu]]

이건 내가 nvidia-container-toolkit을 다운 받지 않아서 생기는 문제였던 것.

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

$ sudo systemctl restart docker

해결! 컨테이너 안에서도 드라이버 잘 인식하는 걸 확인할 수 있었다!!

전체적인 과정을 정리하면

1. ec2에 docker 설치

2. ec2에 nvidia 드라이버 설치

3. nvidia-container-toolkit 설치

3. $ docker pull [img이름]

4. $ docker run -it --gpus all --name=my_flask -p 5000:5000/tcp  [img이름] /bin/bash

5. container안에서 필요한 git 저장소 clone 하기

6. 실행!

다음은 도커 파일을 만들어서 자동으로 이 과정을 해보도록 하자.


전체적으로 관련 사이트 모음

https://senticoding.tistory.com/61
https://wookim789.tistory.com/35
velog
https://lepoeme20.github.io/archive/use-docker

0개의 댓글

관련 채용 정보