Skip to content

Latest commit

 

History

History
142 lines (96 loc) · 5.67 KB

File metadata and controls

142 lines (96 loc) · 5.67 KB

Model Packaging and Serving

Model Packaging and Serving 의 필요성

이 이전의 단계까지 Model 학습과 평가... 이런 과정들을 거쳐서 최종 모델 학습의 산물인 Check Point가 나온다.

I have a model, now what? model serving: ML Model을 서비스화 하는 것. 사용자가 어떤 방식으로든 input data를 넣으면 그에 대한 결과를 '어떤 방식으로든' output해주는 것.

input을 주는 방식은

source는
- HTTP API Request
- 챗봇과의 대화
- Netflix 영상 좋아요 버튼
- Youtube 구독 버튼
- 네이버 출발, 도착지를 입력한 후 길찾기 버튼
... 가 될 수도 있고,

- Batch,
- Stream..등으로 나눠볼 수도 있다.

Model Serving이란

모델 배포란, 학습한 모델의 체크포인트와 모델이 사용하는 정적 파일(아티팩트)를 패키지로 묵어서 서버에 배포하는 과정이다.

배포된 모델은 서버에서 서비스되어 사용자에게 모델 결과를 제공해 줄 수 있다.

Model Serving의 유형

model-servinig-type

Model Serving이 어려운 이유

- Model Serving은 model의 predict 함수를 call 하는 로직이 들어간 SW를 개발 하는 것인데..
    - 모델 개발과 소프트웨어 개발 방법의 괴리
    - 모델 개발과정과 소프트웨어 개발 과정의 파편화
    - 모델 평가 방식 및 모니터링 구축의 어려움.

- ML Model Serving tool
    - Seldon Core
    - TFServing
    - KFServing
    - Torch Serve
    - BentoML
    하지만 Python기반의 REST API Framework를 사용해서 머신러닝 코드를 감싼 API server를 개발하고,
    해당 API server를 dockerize한 뒤에 배포하는 식을 사용하기도 한다.

BentoML을 통한 모델 서빙

BentoML이란

  • 목적: 다양한 ML모델 아키텍쳐의 빌드, 파이프라인 관리, 서빙이 효율적이고 쉽다.
  • 장점
    • 다양한 ML 프레임워크를 지원
    • 컨테이너 배포를 지원해서 컨테이너화를 간단하게 알아서 해준다.
    • 학습 곡선이 TorchServce.. 이런 것들 보다 비교적 쉽다.

BentoML 구조

bentoml1

  • Runner: 어떤 모델을 실행시킬 수 있는 실행 개념. 이 Runner가 API call에 의해 실행된다. - 문제: - Runner를 통한 문제 해결: runner 각각의 Python worker에서 각각 독립적으로 실행 가능한 단위이다.
    • ex. 은행 앱에서 <A라는 사용자에게 빌려줄 수 있는 돈 예측> 이라고 가정해보자. 그러면 필요한 모델의 추론 종류는 1. 사기를 얼마나 칠까? 2. 신용도 3. 소득 현황 예측 이렇게 총 3가지의 추론을 해서 종합해야 한다고 치자. bentoml-runner - 이걸 순차적으로 처리하려면 너무 비효율적이다. 이 3가지가 의존성이 있어서 blocking되어야 하는 관계도 아닌데 말이다. - 이런걸 bentoML에서는 병렬적으로 동시 실행 시킨다음 종합해서 최종 model의 input으로 종합해주는 pipeline 설계가 가능하게 된다. - 이렇게 runner들을 블럭조합하듯이 조합해서 pipelien화 하는 데에 BentoML의 큰 장점이 있다.
    • 앙상블모델 디자인 할 때 유용하게 사용할 수 있겠다!
  • API: client가 inference에 대한 요청을 보내고 응답을 받을 수 있는 API.
  • 이 API들을 지원하는 서버를 바로 띄울 수도 있고 컨테이너화 해서 띄울 수도 있다.

Python기반의 REST API Framework를 사용해서 머신러닝 코드를 감싼 API server를 개발하고, 해당 API server를 dockerize한 뒤에 배포하는 방식

Start

cd mlops-practice/model-serving
conda activate mlops-prac

Prepare model to serve

  • iris data 를 사용한 간단한 classification model 을 학습한 뒤, 모델을 pickle 파일로 저장하고, Flask 를 사용해 해당 파일을 load 하여 predict 하는 server 를 구현할 것입니다.
  • 그 이후, 해당 server 를 run 하여 직접 http request 를 요청하여 정상적으로 response 가 반환되는지 확인할 것입니다.
python train_save_model.py

Using Flask for model serving

1. Flask 란

The python micro framework for building web applications

  • https://github.com/pallets/flask

  • Micro Service Architecture (MSA) 를 위한 web app framework

    • web app framework (web framework) : 웹 서비스 개발을 위한 프레임워크
  • Django 등 다른 framework 에 비해 굉장히 가벼우며, 확장성, 유연성이 뛰어난 프레임워크

    • 단, 자체 지원 기능은 적다는게 장점이자 단점
  • 사용하기 쉽고, 간단한 기능을 가볍게 구현하기에 적합하기 때문에 대부분의 ML Model 의 첫 배포 Step 으로 Flask 를 자주 사용합니다.

2. Flask 설치

  • Prerequisite
    • Python 가상환경
      • 3.6 이상
        • 3.8.9 사용
      • pip3
  • How to Install
# Flask 설치
pip install -U Flask==2.0.2

# Flask Version 확인
conda list

3. 모델 학습 및 저장

see train_save_model.py

4. Flask model server 구현

1.에서 학습 후 저장했던 모델(pickle 파일)을 load 하여, POST /predict API 를 제공하는 Flask Server 를 구현합니다. see flask_model_server.py

5. API 테스트

curl -X POST -H "Content-Type:application/json" --data '{"sepal_length": 5.9, "sepal_width": 3.0, "petal_length": 5.1, "petal_width": 1.8}' http://localhost:5000/predict

# {"result":[2]}
# 0, 1, 2  중의 하나의 type 으로 classification 하게 됩니다.