brunch

You can make anything
by writing

C.S.Lewis

by Chris송호연 Sep 02. 2019

Serverless ML API 30분 완성

생산성 높은 AI 개발자 되기 (1)

저는 속도를 정말 중요하게 생각합니다. 


빠른 개발속도는 단순히 개발자 한 명의 생산성 뿐만 아니라 팀 전체, 회사 전체의 속도를 빠르게 만들어줍니다. 우리 개발자에게 있어서 생산성은 중요한 가치 중 하나 입니다. 남들이 1개월 걸려서 만들어내는 일을 능숙한 개발자는 번쩍이는 아이디어를 2-3 시간 내로 구현해내곤 합니다.


IT업계에서 일하다 보면 생산성에 특화된 슈퍼 엔지니어의 모습을 종종 볼 수 있습니다. Cloud 기술 스택을 익혀놓는 것은 생산성 높은 개발자가 되기 위한 기초작업이라고 생각합니다. 


Cloud 기술은 사용하기 쉽습니다. 예전에 비해 컴퓨팅 리소스 관리가 편해져서 한 명의 개발자가 해낼 수 있는 업무의 양이 점점 커지는 것을 느낍니다. 개발 생산성이 너무 좋다보니, 계속 Cloud 컴퓨팅의 매력에 빠져들게 되네요.


빠른 빠른 개발을 가능하게 해주는 Serverless 기술로 ML 모델을 배포해 보겠습니다 :)


1. Microservice Architecture


Serverless Computing, Microservice Architecture가 많은 개발자들로부터 각광을 받고 있는 요즘-

마이크로서비스 아키텍쳐의 장단점에 대해 활발한 논의가 이루어지는 것을 봅니다. 


제가 바라보는 Serverless Architecture의 장점은 단순합니다. 

Serverless Architecture 딥다이브를 하진 않고, 직관적으로 느끼는 매력을 적어볼게요-


1) 서버 비용이 저렴하다

마구 써도 저렴합니다. 명확한 장점이라 길게 설명 안하겠습니다.


2) 유지보수 엔지니어링 비용이 급격하게 줄어든다

API 서버를 운영할 때는 다양한 기반 작업을 해야 합니다. 

- 로깅, 실시간 모니터링, 장애 대응, 서버 다운, 서버 이중화, IDC 이중화 ... 

Application Server 를 모니터링 하기 위해 별도의 APM 솔루션이 있을 정도로
서버의 안정성을 보장하는 엔지니어링은 꽤나 높은 엔지니어링 역량을 필요로 합니다.

하지만, Serverless API의 경우 위의 작업들이 대폭 줄어듭니다.


3) Scalable Computing에 적합하다

Backend Engineering에서 빠질 수 없는 문제가, Scalability입니다. 순간적으로 몰리는 유저를 얼마나 잘 감당할 수 있는가?

Serverless Architecture는 이러한 Scalable Computing 문제를 잘 해결할 수 있습니다.


2. GCP Functions, AWS Lambda, Azure Functions


AWS Lambda, GCP Functions, Azure Functions를 다 사용해봤는데- 

딥러닝 모델을 Serverless로 배포하다가 주로 겪게 되는 문제점들을 살펴보겠습니다.


개인적으로 솔직하게 Deep Learning 모델 서빙 면에서 Azure Functions가 제일 좋아보입니다. 

그 다음 GCP Functions, AWS Lambda 순입니다. 


첫 번째 문제. Serverless 어플리케이션의 용량 제한


딥러닝 모델을 Serverless로 배포할 때 먼저 걸리는 문제가 바로 용량 제한입니다. 모델 사이즈가 1GB가 넘는 경우가 종종 있기 때문이죠. 용량 제한 면에선 Azure Functions가 압도적으로 많은 용량을 지원합니다. Premium Plan까지 있어서 더 좋아보입니다.


AWS Lambda (https://docs.aws.amazon.com/lambda/latest/dg/limits.html)

50 MB (zipped, for direct upload)

250 MB (unzipped, including layers)


Google Functions (https://cloud.google.com/functions/quotas)

소스의 경우 100MB(압축)

소스 및 모듈의 경우 500MB(비압축)

Google Functions의 경우엔 별도로 이메일을 보내면 이 용량 제한을 늘려줍니다.


Azure Functions (https://docs.microsoft.com/en-us/azure/azure-functions/functions-scale)

Consumption Plan: 1 GB

Premium Plan: 250 GB

App Service Plan: 50-1000 GB


두 번째 문제. Python 친화적인가?


Deep Learning 모델 배포에 있어서, Python은 피할 수 없는 언어입니다. 주요 딥러닝 프레임워크가 다 Python 기반이기 때문이죠.


AWS Lambda 

requirements.txt로 pip 패키지 설치를 자동으로 못합니다. 이거 생각보다 불편한데요, Docker를 띄워서 Amazon Linux 환경에서 pip 라이브러리들을 해당 폴더에 다운받은 후에 같이 압축해서 업로드 해야합니다. Python 개발해서 Lambda로 배포하려면 AWS Lambda는 비추입니다 ㅠ 손이 많이 갑니다.


Google Functions

requirements.txt만 넣으면 패키지들 잘 설치해줍니다.


Azure Functions

마찬가지로 requirements.txt만 넣으면 잘 설치해줍니다.


우선 위 문제들을 GCP, AWS도 잘 해결해줬으면 좋겠네요- 용량 제한을 없애는 Premium Plan이 있어도 좋을거 같아요! 


결론은 ML Serving을 위해선 GCP Functions나 Azure Functions 쓰시면 좋습니다. 

Cloud 마다 장단점이 명확해서, 필요한 기술 스택에 따라 최적의 Cloud가 다릅니다. 어떤 클라우드가 무조건 최고라고 말하는 것이 아닙니다.


3. GCP Functions Model 배포 튜토리얼


GCP Functions로 간단한 딥러닝 모델 배포하는 법을 설명드릴게요!


1) GCP 개발 환경 설정

https://cloud.google.com/sdk/docs/quickstarts

 여기서 Cloud SDK 퀵스타트 가이드를 따르면, 개발 환경을 쉽게 설정하실 수 있으세요-


2)  Github에서 Sample Repository 클론하기


https://github.com/chris-chris/gcp-functions-mnist-example


3) pip 패키지 설치하기

Tensorflow와 이미지 라이브러리 Pillow를 설치해보겠습니다.

pip install -r requirements.txt


4) 모델 학습시키기


Google Tensorflow 예제를 조금 수정해서 코드를 구현해놨습니다.

https://github.com/chris-chris/gcp-functions-mnist-example/blob/master/train.py

터미널에서 이 명령어를 실행시키면, MNIST Fashion 데이터셋의 분류 모델이 학습되기 시작합니다. 학습시키는 코드는 github에 있으며, 기초적인 코드라서 따로 설명은 하지 않겠습니다.

python train.py


학습 시 터미널에 이런 식으로 로그가 찍히고, 모델의 Weights가 파일로 저장될 것입니다.


Epoch 1, Loss: 0.377524226904, Accuracy: 86.5166625977, Test Loss: 0.318869501352, Test Accuracy: 88.1600036621
Epoch 2, Loss: 0.311356067657, Accuracy: 88.7566680908, Test Loss: 0.305357784033, Test Accuracy: 88.6349945068
...
Epoch 10, Loss: 0.130564004183, Accuracy: 95.3458328247, Test Loss: 0.431394040585, Test Accuracy: 89.0419998169


5) Google Functions 배포하기


Google Functions에 배포할 함수 코드는 main.py에 정의되어 있습니다. predict_mnist 함수입니다. Google Functions에서는 main.py 파일에 원하는 함수를 정의해놓고 배포 명령을 하면 쉽게 API가 배포됩니다.

https://github.com/chris-chris/gcp-functions-mnist-example/blob/master/main.py


우선 배포를 하기 위해선 본인의 Project Name을 아래 [Project Name]에 넣어주시고, 아래 명령어를 터미널에 입력하면, 본인의 GCP Project에 Google Functions이 배포됩니다. 이 명렁어가 제대로 실행되지 않는다면, 위에서 언급한 GCP 개발 환경 설정 스텝을 다시 밟아주시기 바랍니다.

gcloud beta functions \
  deploy predict_mnist \
  --runtime python37 \
  --trigger-http \
  --project [Project Name] \
  --region asia-northeast1


6) API로 예측 수행하기


제가 배포한 API를 예를 들어서 호출해보겠습니다. 터미널에서 이 명령어로 CPU Inference를 수행할 수 있습니다. 


API 요청 명령

curl -X POST \
  https://asia-northeast1-master-strange.cloudfunctions.net/predict_mnist \
  -H 'Content-Type: application/json' \
  -d '{
           "url":"https://raw.githubusercontent.com/ryfeus/gcf-packs/master/tensorflow2.0/example/test.png"
        }'


Response 결과

{
    "code": 200,
    "data": {
        "class": "Trouser"
    },
    "message": "OK"
}


이렇게 이미지 URL만으로 예측을 수행할 수 있습니다.

https://raw.githubusercontent.com/ryfeus/gcf-packs/master/tensorflow2.0/example/test.png


4. Reference


Fashion-MNIST Dataset 

https://github.com/zalandoresearch/fashion-mnist


How to serve deep learning models using tensorflow 2.0 with Cloud Functions

https://cloud.google.com/blog/products/ai-machine-learning/how-to-serve-deep-learning-models-using-tensorflow-2-0-with-cloud-functions


5. AI Engineer 파티 공고

이번 튜토리얼의 목적은 사실, AI Engineer 파티를 위해 제출한 문제를 좀 더 쉽게 풀 수 있도록 도와드리기 위함입니다. 많은 분들이 문제를 푸시고, 파티에 놀러오시길 바랄게요!


[AI Engineer Party 문제 출제]

#AnotherIntelligence_어나인

문제를 풀어야 참석이 가능한 AI Engineer Party 문제를 출제합니다.  

출제 문제: 
AI Engineer가 해결해야할 핵심적인 Task입니다.
- Machine Learning Serving Pipeline 구축


요구사항1. Serverless API(Google Functions, Azure Functions, AWS Lambda)로 머신러닝 모델 CPU 서빙


요구사항2. 데이터셋은 Google BigQuery에 적재하고 꺼내서 사용


요구사항3. 학습 실험 관리 Opensource(Microsoft NNI, Google Adanet, Optuna 등)를 사용하여 AutoML 수행


요구사항4. 학습이 완료되면 Model Validation을 자동으로 수행해서 지금 서빙되고 있는 모델보다 우수한지 자동으로 검증


요구사항5. 모델리스트가 관리되어야 하고, 선택적으로 배포 및 롤백이 가능함


요구사항6. 모든 코드는 Pylint 가이드에 맞춰 깔끔함을 유지 (PEP8, Google Style 등)


서빙할 딥러닝 모델은 뭐든 상관없습니다. MNIST, 얼굴 인식, Object Detection


문제 푸는 기간: 2주
문제 제출 마감: 2019-09-08 14:00:00 (GMT+9)


제출 내용:
https://forms.gle/AaqDME7sA7TobnXy5
1) Github repo link
2) Serverless API Call example (Curl)


파티 일정: 2019-09-10 저녁 7시 이태원



브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari