Home BentoML
Post
Cancel

BentoML

A faster way to ship your models to production

1
pip install bentoml

BentoML is compatible across machine learning frameworks and standardizes ML model packaging and management for your team.

Tutorial

BentoML로 online model serving을 하는 방법을 설명

  • scikit-learn
  • Iris dataset

Bento는 inference requests, 배포를 위한 docker container image를 HTTP or gRPC를 사용해서 쉽게 서빙이 가능

Setup for the tutorial

  • Google Colab 에서도 가능
  • 아래 Docker로 부터 tutorial notebook 실행도 가능
1
docker run -it --rm -p 8888:8888 -p 3000:3000 -p 3001:3001 bentoml/quickstart:latest

Saving Models with BentoML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import bentoml

from sklearn import svm
from sklearn import datasets

# Load training data set
iris = datasets.load_iris()
X, y = iris.data, iris.target

# Train the model
clf = svm.SVC(gamma='scale')
clf.fit(X, y)

# Save model to the BentoML local model store
saved_model = bentoml.sklearn.save_model("iris_clf", clf)
print(f"Model saved: {saved_model}")

# Model saved: Model(tag="iris_clf:zy3dfgxzqkjrlgxi")
1
2
3
4
model = bentoml.sklearn.load_model("iris_clf:2uo5fkgxj27exuqj")

# Alternatively, use `latest` to find the newest version
model = bentoml.sklearn.load_model("iris_clf:latest")

Creating a Service

  • Services는 BentoML의 Core components
  • $ bentoml serve service:svc --reload로 아래 코드를 실행
1
2
3
4
5
6
7
8
9
10
11
12
13
 # service.py
 import numpy as np
 import bentoml
 from bentoml.io import NumpyNdarray

 iris_clf_runner = bentoml.sklearn.get("iris_clf:latest").to_runner()

 svc = bentoml.Service("iris_classifier", runners=[iris_clf_runner])

 @svc.api(input=NumpyNdarray(), output=NumpyNdarray())
 def classify(input_series: np.ndarray) -> np.ndarray:
     result = iris_clf_runner.predict.run(input_series)
     return result

요청은 아래 코드로

1
2
3
4
5
6
7
import requests

requests.post(
   "http://127.0.0.1:3000/classify",
   headers={"content-type": "application/json"},
   data="[[5.9, 3, 5.1, 1.8]]",
).text

Using Models in a Service

  • bentoml.sklearn.get은 모델 저장소에 저장된 모델에 대한 refernce를 생성하고, to_runner는 모델에서 Runner 인스턴스를 생성
  • Runner abstraction은 inference computation을 schedule을 어떻게 하는지, 추론 호출을 동적으로 일괄 처리하는 방법 및 사용 가능한 모든 하드웨어 리소를 더 잘 활용하는 방법 측면에서 BentoServer에 더 많은 유연성을 제공
1
2
3
4
5
import bentoml

iris_clf_runner = bentoml.sklearn.get("iris_clf:latest").to_runner()
iris_clf_runner.init_local()
iris_clf_runner.predict.run([[5.9, 3., 5.1, 1.8]])

Service API and IO Descriptor

  • svc.api decorator를 bentoml.Service의 object’s APIs list에 추가
  • input, output 파라미터는 IO Descriptor object, API 함수의 expected input/output types을 지정하고 HTTP endpoints를 생성
  • IO Descriptor object는 schema 또는 shape을 사용하여 입출력 유효성 검사가 가능
  • API function 내에서는 모든 비즈니스 로직, feature fetching, and feature transformation code를 정의할 수 잇음
  • Model inference 호출은 runner objects를 통해 직접 이루어지며, service object를 생성할때 `bentoml.Service(name=.., runners=[..]) 를 호출에 전달
  • BentoML은 sync and async endpoints를 제공
    • performance sensitive use cases에서는 async API를 대신 고려할 수 있음
1
2
3
4
5
# async로 작성한
@svc.api(input=NumpyNdarray(), output=NumpyNdarray())
async def classify(input_series: np.ndarray) -> np.ndarray:
   result = await iris_clf_runner.predict.async_run(input_series)
   return result

Building a Bento 🍱

  • 서비스 정의가 완료되면 모델과 서비스를 bento로 빌드
  • Bento는 서비스를 위한 distribution format.
  • 서비스를 실행하는 데 필요한 모든 소스코드, 모델 파일 및 종속성을 포함하는 독립형 archive
  • To build a Bento
    • bentofile.yaml
1
2
3
4
5
6
7
8
9
10
service: "service:svc"  # Same as the argument passed to `bentoml serve`
labels:
   owner: bentoml-team
   stage: dev
include:
- "*.py"  # A pattern for matching which files to include in the bento
python:
   packages:  # Additional pip packages required by the service
   - scikit-learn
   - pandas
  • production에서 serving을 위한 준비가 끝났다. bnetoml server CLI command를 사용해서 가능
1
bentoml serve iris_classifier:latest --production
  • Bento
    • BentoML에서 deployment 단위
    • 모델 배포 워크플로우에서 추적해야 하는 가장 중요한 artifacts
  • BentoML은 Bentos를 managing하고 moving 하기 위한 CLI 명령과 API를 제공

Generate Docker Image

  • bentoml containerize CLI를 통해 production deployment를 위한 Bento로 부터 Docker image를 생성
  • Docker image TAG는 bento TAG와 동일하게 기본값으로 설정
1
2
bentoml containerize iris_classifier:latest
bentoml containerize --platform=linux/amd64 iris_classifier:latest # Applie Silicon
  • BentoServer를 실행
1
 docker run -it --rm -p 3000:3000 iris_classifier:6otbsmxzq6lwbgxi serve --production

Deploying Bentos

Reference

This post is licensed under CC BY 4.0 by the author.

[Python] 문자열 붙이기 성능 비교 (join, +)

[MLflow] Model Registry