Skip to content

Commit

Permalink
Add about BentoML
Browse files Browse the repository at this point in the history
  • Loading branch information
camila-buzzni committed Apr 10, 2024
1 parent 4f8fb25 commit d06628c
Show file tree
Hide file tree
Showing 9 changed files with 238 additions and 102 deletions.
61 changes: 51 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,54 @@

## Table of Contents

### data-management
### [Data Management](./data-management/README.md)

- Data Management (data version control) 에 대한 내용입니다.
- Tool: [DVC](https://dvc.org/)
- ML개발을 하다보면 Raw data를 조금씩 변경시켜 가면서 즉, feature engineering을 해보면서
Data 의 version이 생겨나게 된다.
- Data version마다 '최종', '최종최종', '이게 진짜 좋음' 이렇게 파일명으로 개발할 것인가?!
software engineering에서 Git을 사용하는 이유는 분명 있다.
- Tool: [DVC](https://dvc.org/), PyTorch, Pandas, ...

### model-management
### [Model Training]

- Model Management(model tracking) 에 대한 내용입니다.
- Tool: [MLflow](https://mlflow.org/)
### [Model Management](./model-management/README.md)

###
- model 개발 과정을 보면
Data Processing -> Train & Evaluate -> Raw Data -> 다시 Data Processing....과정의 반복이다.

- 그리고 Production level로 AI model이 serving되고 그 이후에 성능 개선이 되어서 version up 된 model이 serving되기도 한다.
아니면 아직 serving되기 전에도 여러 성능비교를 하며 model version이 update되기도 한다.
- Model 결정시 어떤 data 저장이 필요한가
- model 소스 코드
- Evaluation Metric 결과
- 사용한 parameters
- model.pkl 파일
- 학습에 사용한 data
- 데이터 전처리용 코드
- 전처리된 data
... 등
이런 정보들이 함께 저장되어야 추후에 '해당 모델의 성능을 **재현** 할 수 있다.'
- Tool: [MLflow](https://mlflow.org/), PyTorch, Pandas, ...

### [Model Validation](./model-validation/README.md)

- Tool: [Scikit-learn](https://scikit-learn.org/)

### [Model Packaging and Serving](./model-packaging-serving/README.md)

- 이 이전의 단계까지 Model 학습과 평가... 이런 과정들을 거쳐서 최종 모델 학습의 산물인 `Check Point`가 나온다.
- 모델 배포란, 학습한 모델의 체크포인트와 모델이 사용하는 정적 파일(아티팩트)를 패키지로 묶어서
- 그 모델을 `Model Registry`에 보관하고 거기에 보관된 모델을
- 서버에 배포하는 과정이다.
배포된 모델은 서버에서 서비스되어 사용자에게 모델 결과를 제공해 줄 수 있다.

- Tool: [BentoML](https://www.bentoml.com/), [NVIDIA Triton](https://developer.nvidia.com/ko-kr/nvidia-triton-inference-server), GCP VertexAI, AWS Sagemaker

### [Model Monitoring](./model-monitoring/README.md)

### [Feature Store]

### [MLOps Pipeline Monitoring](./pipeline-monitoring/README.md)

## Total MLOps pipeline

Expand All @@ -38,11 +75,14 @@

> 위에서 아래로의 흐름으로 흘러가는 pipeline이라고 생각하고, 그 순서대로 적었습니다.
1. 데이터 취득
1. 데이터 취득 및 전처리
Related Engineering: [Data Management](#data-management)

2. 모델 학습
2. 모델 학습
Related Engineering: [Model Training]

3. 모델 평가
3. 모델 평가
Related Engineering: [Model Validation](#model-validation)

3-1. Model Validation

Expand All @@ -57,6 +97,7 @@
- 서비스 UX 측면의 동작을 반영한 실제 시나리오 모델 결과를 테스트

4. 모델 offline(학습시키면서 내부적으로 확인하는) 모니터링
Related Engineering: [Model monitoring](#)

5. 모델 배포

Expand Down
Binary file added assets/img/bentoml1.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/img/bentoml2-runner.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/img/model-serving-type.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
46 changes: 45 additions & 1 deletion model-cicd-pipeline/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,51 @@ dvc repro


## Jenkinsfile을 이용한 CI Pipeline 빌드

실습 목표
1. Jenkinsfile 의 기본적인 구조를 알아보고 생성한다.
2. Jenkins 에서 Pipeline Job 을 생성하고 빌드한다.
3. post 를 이용해 모든 stage 가 실행된 후의 명령을 정의한다.
4. when 을 이용해 stage 가 실행되는 조건을 추가해 본다.
5. Jenkinsfile 환경변수를 설정해 본다.
6. parameters 를 이용하는 방법을 알아 본다.
7. 외부 groovy scripts 를 만들어 사용해 본다.
8. Replay 에서 수정 후 빌드 다시 실행해 보기
### [Jenkins](https://www.jenkins.io) 설치 (MAC OS)
https://velog.io/@jhchoo/2023.01-%EB%A7%A5%EB%B6%81-Jenkins-%EC%84%A4%EC%B9%98

### Jenkinsfile 의 기본적인 구조
jenkins는 Jenkinsfile을 통해 실행된다.
- pipeline : 반드시 맨 위에 있어야 한다.
- agent : 어디에서 실행할 것인지 정의한다.
- any, none, label, node, docker, dockerfile, kubernetes
- agent 가 none 인 경우 stage 에 포함시켜야 함
- stages : 하나 이상의 stage 에 대한 모음
- pipeline 블록 안에서 한 번만 실행 가능함
```
pipeline {
agent any
stages {
stage("build") {
steps {
echo 'building the applicaiton...'
}
}
stage("test") {
steps {
echo 'testing the applicaiton...'
}
}
stage("deploy") {
steps {
echo 'deploying the applicaiton...'
}
}
}
}
```
### Jenkins 에서 Pipeline Job 을 생성하고 빌드한다.
- 본인 Github 에 새 Repository [ js-pipeline-project ] 생성
- Local 에서 'Jenkinsfile' 파일 생성하여 위 stages 코드 복사한 후 Github 업로드
## Python기반 Jenkins CI Piepline 생성


142 changes: 142 additions & 0 deletions model-packaging-serving/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
# 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](../assets/img/model-serving-type.png)

## 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](../assets/img/bentoml1.png)

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

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

## Start

```bash
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 가 반환되는지 확인할 것입니다.

```bash
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](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

```bash
# 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 테스트

```bash
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 하게 됩니다.
```
File renamed without changes.
File renamed without changes.
91 changes: 0 additions & 91 deletions model-serving/README.md

This file was deleted.

1 comment on commit d06628c

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MODEL METRICS

Training variance explained: 33.0%
Test variance explained: 32.0%

Data viz

feature_importance
residuals

Please sign in to comment.