BentoML 넌 누구냐!
Overview
(공식 문서 내용을 기반으로 추가 내용을 덧붙여 정리함)
What is BentoML?
BentoMLis a unified AI application framework for building reliable, scalable, and cost-efficient AI applications. It provides an end-to-end solution for streamlining the deployment process, incorporating everything you need for model serving, application packaging, and production deployment.
설명에 나와있듯, BentoML의 초점은 model serving, application packaging, and production deployment 에 있다. 실제로 production-level에서의 모델 서빙을 위해 BentoML을 활용하는 use-case가 다수 존재한다.
그런데, 왜 이름이 BentoML일까?
벤또는 도시락을 일컫는 일본어이다. - 나무위키
머신러닝 모델을 서빙할 때 필요한 요소들을 한 번에 제공한다는 취지이다. 내 머신러닝 도시락을 받아랏!
Who is BentoML for?
- 안정적이고, 확장 가능하며, 비용 효율적인 방식으로 머신 러닝(ML) 모델을 프로덕션에 도입하려는 팀
- 사전 학습된 최신 모델(state-of-the-art pretrained model)을 애플리케이션에 쉽게 통합하려는 AI 서비스 개발자 [예제]
- 생성한 모델을 간편하게 프로덕션에 배포하고 싶은 팀
Why BentoML?
BentoML은 (1) 통합 배포 형식을 제공하고, (2) 간소화된 AI 아키텍처를 사용하고, (3) 원하는 곳에 배포할 수 있도록 도와준다. 이를 위한 5가지 특징을 소개한다.
[1] Streamline distribution with a unified format: 통합 배포 형식 Bento
BentoML은 통합 배포 형식인 Bento라는 파일 아카이브를 통해 배포 프로세스를 간소화 한다. BentoML에서 제공하는 SDK를 사용하면, 배포에 필요한 모든 구성 요소를 손쉽게 Bento로 패키징할 수 있다.
Bento를 생성할 때 서비스를 위한 파일 경로를 설정해주면 BentoML이 자동으로 API 서버를 생성 한다. API 서버는 REST API, gRPC, 장기 실행 추론 작업을 지원한다. 또한, Bento에는 자동으로 생성된 Dockerfile이 있어서, 프로덕션 배포를 위한 컨테이너 작업을 손쉽게 수행 할 수 있다.
[2] Build applications with any AI models: 다양한 ML 프레임워크와의 호환
BentoML은 팀이 선호하는 도구로 모든 AI 애플리케이션을 구축할 수 있는 유연성과 편의성을 제공합니다. 모델 허브 에서 가져온 모델이나, 다양한 프레임워크(ex> PyTorch, TensorFlow, Keras, Scikit-Learn, XGBoost 등)로 구축한 자체 모델을 사용할 수 있고, 편하게 애플리케이션으로 빌드할 수 있다.
또한, Large Language Model (LLM) inference,Generative AI,embedding creation, andmulti-modal AI applications 에 대한 native support를 지원하고, 머신러닝을 위한 다앙한 툴(ex> MLFlow, LangChain, Kubeflow, Triton, Spark, Ray)과의 통합을 지원한다.
[3] Inference optimization for AI applications: 추론 최적화
BentoML은 AI 애플리케이션의 빠른 응답시간, 높은 처리량, 확장 가능하고 비용 효율적인 서빙 인프라 를 제공한다. 이를 위해 지원하는 기능은 다음과 같다.
- Model inference parallelization (모델 추론 병렬화)
- Adaptive batching (적응형 배치)
- OpenLLM과 같은 특정 모델 아키텍처에 대한 최적화
- ONNX-runtime, TorchScript와 같은 고성능 런타임에 대한 지원
[4] Simplify modern AI application architectures: 다양한 추론 방식 지원 및 손쉬운 디버깅
BentoML은 복잡한 AI 워크로드를 손쉽게 확장 및 실행할 수 있도록 도와준다.
- 여러 모델의 동시(parallel), 순차(sequential) 실행
- GPU 사용 지원
- k8s 동작 지원
- Mac, Window, Linux 등 다양한 OS에서의 로컬 실행 및 디버깅 지원
[5] Build once. Deploy anywhere: Dockerfile을 활용한 손쉬운 배포
BentoML은 저장된 모델 형식, 서비스 API 정의, Bento 빌드 프로세스를 표준화하여 다양한 배포 오셥을 제공한다. 지원하는 배포 옵션은 다음과 같다.
- BentoCloud(fully-managed)에 원클릭 배포
- BentoML 에코시스템의 오픈소스 플랫폼인 Yatai에 푸쉬하고, k8s에서 모델 관리 및 배포
- Docker가 실행되는 모든 환경
How does BentoML work?
(사용된 코드는 공식 문서의 quickstart 를 활용함)
일반적인 ML 워크플로우는 다음과 같다.
- Data Preparation
- Model Training
- Model Evaluation
- Deployment
- Monitoring
- 1번에서 5번까지 반복 (=Continuous Training)
위 과정을 BentoML로 수행하는 과정은 다음과 같다.
[1] Define a Model
서빙에 사용할 모델을 준비한다. 다양한 프레임워크(ex> Tensorflow, PyTorch)를 이용해서 직접 만들어도 되고, 모델 허브(ex> huggingface)를 통해 다운 받아도 된다.
[ 예제 코드 ]
# download_model.py
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)
[2] Save a Model
학습된 모델을 BentoML 로컬 모델 스토어에 BentoML에서 제공하는 SDK를 이용해서 등록한다. bentoml.diffusers.import_model()
과 같은 간단한 메소드로 등록이 가능하다.
[ 예제 코드 ]
# download_model.py
# Save model to the BentoML local Model Store
saved_model = bentoml.sklearn.save_model("iris_clf", clf)
[3] Create a Service
모델을 감싸고 서빙 로직을 구현한 service.py
파일을 작성한다. 이 파일에서는 추론을 최적화하기 위해 추상화된 Runner
객체와, 외부 유저와 소통하기 위한 API 서버 및 엔드포인트 관리를 위한 Service
객체를 사용한다. Service
객체를 사용해서, 모델 서빙을 테스트하고 HTTP 또는 gRPC 요청을 통해 예측을 얻을 수 있다.
[ 예제 코드 ]
# service.py
import numpy as np
import bentoml
from bentoml.io import NumpyNdarray
# BentoML 로컬 모델 스토어에 저장된 모델을 불러와서 Runner 생성
iris_clf_runner = bentoml.sklearn.get("iris_clf:latest").to_runner()
# Runner를 주입해 Service 객체 생성
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
[4] Build a Bento
Model, service, python packages, description, build options이 포함된 YAML 파일을 통해 Bento를 생성한다. 생성된 Bento에는 컨테이너화를 위해 자동 생성된 Dockerfile이 포함된다.
[ 예제 코드 ]
# bentofile.yaml
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
models: # The model to be used for building the Bento.
- iris_clf:latest
- 필요한 파이썬 라이브러리 입력할 때, python.requirements_txt key를 사용하면 requirements.txt 경로를 주입할 수 있음.
bentoml build # bentofile.yaml을 이용해 bento 빌드
bentoml list # bento 목록 조회
[5] Deploy a Bento
Bento를 생성할 때, 자동 생성된 Dockerfile을 이용해 도커 이미지를 생성한다. 생성된 도커 이미지는 Kubernetes와 같은 모든 Docker가 실행되는 모든 환경에 배포할 수 있다.
[ 예제 코드 ]
bentoml containerize iris_classifier:latest