안녕하세요! 오늘은 이전 내용에 이어서 BentoML 프레임워크에 대해 소개해드리려 합니다!
Bento.. 어디서 많이 들어보시지 않았나요?
도시락을 뜻하는 일본어인데요, 도시락을 뜻하는 Bento 뒤에 ML 이 붙어있는 것으로 보아
Bento + ML ? 음.. ML 도시락? 이라고 생각하실 수 있으실텐데요.
맞습니다! 직관적으로 생각하면 ML 도시락 이라고 생각하실 수도 있으실 것 같아요!
그럼 지금부터 BentoML 이란 무엇인지, 왜 사용해야하는지에 대해서 소개해드리겠습니다!
본격적으로 BentoML 에 대해 설명하기 전에 Model Serving 이란게 무엇인지 살펴보고 들어갈예정인데요.
0. Model Serving
일반적으로 머신러닝으로 학습한 모델을 배포하는 과정에는 크게 두 가지 특징을 고려해야 한다라고 해요.
- 일반적으로 모델이 무겁고, 추론과정에도 많은 연산이 들어가므로 서비스에 따라서 CPU/GPU 의 선택이 필요
- 데이터의 변화에 맞춰서 모델을 재학습 후 배포하는 과정이 필요
위의 특징들로 인해 머신러닝 모델은 기존의 서비스에 포함이 되는 것보다는 독립적으로 배포하는 것이 좋습니다.
또한 독립적으로 배포하는 것 외에 model serving이 사용되는 방식에는 대표적으로 2가지 방식이 더 있습니다.
Batch Serving | Online Serving | |
Frequency | 주기적(e.g. 4시간 마다) | 요청이 들어오는대로 |
Useful for | 즉시 결과가 필요하지 않은 경우 (e.g. 추천 시스템) |
즉시 결과가 필요한 경우 (e.g. 이상감지) |
Input space | 유한: 입력의 숫자를 알 수 있음 | 무한 |
batch | 가능 | 불가능 |
Examples | - TripAdvisor hotel ranking - Netflix recommendations |
- Google Assistant speech recognition - Twitter feed |
지금까지 Model Serving에 3가지 방식(독립 배포, online/offline batch) 을 소개해드렸는데요.
이걸 왜 BentoML 에 대해 설명하기전에 소개해드렸냐!!
바로 BentoML 은 이 3가지 방식을 모두 지원하는 오픈 소스 이기 때문인데요.
좀더 자세한 얘기는 바로 아래에서 설명하겠습니다! 지금부터 BentoML 에 대해 살펴보시져!!
1. BentoML? Bento? ML?
BentoML의 공식 깃허브에서는 BentoML을 아래와 같은 한 문장으로 소개하고 있습니다.
“BentoML enables users to create a machine learning powered prediction service in minutes and bridges the gap between data science and DevOps.”
쉽게 말하면, 개발한 모델을 배포 및 서빙하는 과정을 효율적으로 처리할 수 있게끔 해주는 오픈소스!! 라는 건데요
이 문장만 보면, 도시락으로 만들어 준다는거야? 어떻게 효율적으로 처리해주는데? 라고 의문이 생기실것 같아요 :)
그래서 조금 더 BentoML에 대해 살펴보겠습니다.
Bento와 비유되는 BentoML 이미지를 가져와봤습니다.
이렇게 보니 정말 ML을 담은 도시락 같죠?! 지금은 위 이미지 그대로 이해하시면 편하실 것 같아요!
BentoML은 ML 모델을 서빙해주는 요소들을 도시락처럼 제공해준다!
실제 BentoML은 Model Serving Made Easy
라는 슬로건을 사용하고 있는데요, 이 슬로건처럼 간단하게 다양한 ML 프레임워크를 서빙할 수 있는 편의성에 기능이 집중되어 있습니다.
여기는 많이 사용되는 프레임워크인 Scikit-Learn, PyTorch, Tensorflow뿐만 아니라 널리 사용되는 딥러닝 라이브러리들(e.g. Transformers, Pytorch Lightning, Detectron 등) 역시 지원하고 있습니다.
음.. 다시 정리해볼까요?
- BentoML은 ML/DL 모델들을 서빙하기 편하게 제공해주고 있다.
- Bento라는 이름에 맞게 도시락처럼 차곡차곡 만들어서 제공해준다.
그럼 마지막으로 한 문장으로 정리해볼게요.
BentoML은 ML/DL 모델과 모델을 서빙하기 위한 일련의 주변 코드들을 도시락처럼 차곡차곡
패키징하여 유저에게 제공해주는 프레임워크다!
이러한 BentoML 프레임워크는 어느 상황에서 효과적으로 사용할 수 있을까요?
일반적으로 데이터 사이언티스트 혹은 딥러닝 모델 개발자가 개발한 모델을 배포하는 경우 DevOps, 백엔드,
서버 엔지니어링 등 여러 파트가 나뉘어져 서로 협업해야 하는 경우가 많은데요.
이 과정에서 모델을 서빙할 때 불필요한 커뮤니케이션 과정이 많이 포함되어 있어 시간비용이 많이 들게되는
비효율적인 과정이 많게됩니다.
BentoML을 사용할 경우엔 모델 개발자가 직접 자신이 개발한 모델을 배포 및 서빙할수가 있게되어 해당 과정을 한 사람 내에서 온전히 해결할 수 있으므로 많은 커뮤니케이션 비용을 절약할 수 있게 됩니다.
뿐만 아니라 스타트업 같이 한 사람이 여러 역할을 해야하는 경우 BentoML과 같은 프레임워크를 사용한다면
더 효과적으로 사용할 수 있습니다.
커뮤니케이션 비용도 줄일 수 있고 여러 역할을 해야하는 경우 효과적으로 사용할 수 있다는 측면에서 보아 굉장히
효율적인 프레임워크로 보이니 안쓸 이유가 없을 것 같네요!
2. Components of BentoML
다음으로는 BentoML을 구성하는 핵심적인 컴포넌트와 기능들에 설명해드리겠습니다.
컴포넌트는 크게 4가지로 나눌 수 있는데요. 각각에 대해 설명드리면 다음과 같습니다.
1. Model Artifacts
BentoML은 Model의 종류에 따라 (ex. transformers, diffusers, sklearn etc.) 최적화된 artifacts로 패키징할 수 있는데요. Model의 알멩이라고 할 수 있는 artifacts에는 대표적으로 model weigth file, tokenizer 등이 포함되어 있습니다.
2. BentoService
BentoService는 BentoML을 이용하여 모델의 추론 서비스(prediction services)를 빌딩하는 가장 기본적인 컴포넌트입니다.
모델이 어떤 artifcats들로 구성되어 있는지, 어떤 환경이 준비되어야 하는지 등 모델의 prediction 실행을 위해 필요한 모든 내용을 요약하여 담고 있는 하나의 유닛이라고 생각하시면 좋습니다.
3. API Functions and Adapters
BentoService는 python 스크립트에서 class 형식으로 구현이 되는데, 이를 @api 데코레이터를 통해 API 객체를 선언할 수 있습니다. 이렇게 선언된 API는 Adapters를 통해 입출력 형식, 배치 여부, 최대 사이즈, 최대 Latency 등 상세한 스펙 사항을 정의해줄 수 있으며, 입력 받은 데이터가 어떤 추론 로직을 거쳐야하는지에 대한 정의도 함께 정해줄 수 있습니다.
4. Model Management & Yatai
BentoML 에서는 Yatai 라는 Model Management Component와의 연동을 공식적으로 지원하는데요.
이는 GitHub, GitLab과 비슷하게 인공지능 모델의 저장소 역할을 하게 됩니다.
위의 4가지 컴포넌트에 대해 대략적인 흐름도는 아래의 이미지와 같습니다.
모델 아티팩트와 Adapters를 통해서 API Functions을 만들게 되면 패키징을 통해 BentoService를 만들게 되는데요. 이렇게 만든 추론 서비스를 API 로서 사용이 가능하며 Yatai를 통해 모델을 관리하고 서빙되는 모델을 모니터링도 가능합니다!
3. Features of BentoML
그럼 다음으로는 BentoML 이 가지고 있는 특징에 대해 조금 더 알아보도록 하겠습니다.
1. Docker
BentoML은 도커라이징 과정을 매우 적은 양의 코드만으로 처리할 수 있도록 해주고 있는데요. 이는 이어지는 글에서 자세히 소개해드리도록 하겠습니다.
2. API
BentoML 적용하기 전 파이썬으로 api를 개발할 땐 Flask나 FastAPI를 이용해서 개발하는 경우가 많을텐데요, 이는 난이도가 높은 축에 속하는 작업은 아니지만, BentoML에서는 @api 데코레이터 하나만으로 매우 간단히 구현이 가능합니다.
또한 flask는 wsgi와 연동되도록 synchronous하게 동작하는 것을 기대하고 구현되었기 때문에 async 함수 없이 구현하는 것이 일반적인 패턴인데요. 비동기로 구현이 필요할 경우 FastAPI 를 사용하거나 asyncio + flask 를 연결해서 사용하지만 BentoML 에서는 비동기 구현이 보다 용이하기 때문에 간단히 구현이 가능합니다.
3. Swagger UI
flask는 API 객체를 Swagger UI와 별도로 연동시켜 주어야 하지만 BentoML은 별도의 과정없이 API와 연동된 Swagger UI를 디폴트로 제공해줍니다.
(FastAPI는 SwaggerUI를 마찬가지로 제공해주니 유의미한 차이는 없네요!)
4. Adaptive Micro-Batching
마지막으로 BentoML 의 강력한 특징 중 하나인 Adaptive Micro-Batching 입니다.
마이크로 배치는 예측 요청을 작은 배치로 그룹화해 모델 추론 작업에서 배치 처리의 성능이점을 발휘하는 기술인데요.
이는 들어온 요청을 Proxy에서 설정한 시간동안 기다렸다가, 요청을 합쳐서 Model Server로 넘기는 것입니다.
BentoML은 Clipper에서 영감을 받아 마이크로 배치 레이어를 구현했다라고 해요. 또한 BentoML API는 사용자의 코드 변경없이 마이크로 배치와 함꼐 작동하도록 설계되었다고 합니다.
이러한 구조를 사용함으로써, 리소스가 허락하는 선에서 Model Server Job을 사용할 수 있게 되어 처리량(Throughput)을 쉽게 올릴 수 있다는 특징이 있습니다.
여기까지 BentoML에 대해 소개해드렸는데요. 마지막 정리를 해보면 BentoML을 다음과 같습니다.
4. 그래서 BentoML 이란?
- 실제 production service에 ML Model을 Serving 하는데 있어서 필요한 지식과 시간을 최소화 시켜주는 도구이다!
- 이로써 개발시간이 단축되는 효과가 있다
- 별다른 추가 작업이나 설정 없이도 Swagger UI를 호스팅해준다.
- 거의 모든 메이져 머신러닝 프레임워크와 라이브러리를 지원해준다.
- 지속적으로 prediciton service에 대해 deploy, monitor, operate가 가능하다.
- 타 MLOps 툴과 연동하여 사용이 가능하다.
- ex. BentoML + MLflow
- BentoML: 모델 패키징 및 도커라이징
- MLflow: 패키징된 모델의 버전을 관리, 배포 및 모니터링
- ex. BentoML + MLflow
이렇게 BentoML 프레임워크에 대해서 소개를 해드렸는데요.
여러분들은 ML/DL 모델들 서빙을 어떻게 하고 계신가요?
최근에 사내에서 STT 모델과 T2I 모델을 API로 배포해야하는 경우가 있었는데요.
기존 Flask나 FastAPI 를 사용해서 배포했을 땐, 동시 요청이 올 경우 순서가 보장이 안되는 이슈가 있었습니다. 그래서 BentoML을 사용해서 패키징 후 다시 배포하니까 BentoML이 자체 게이트웨이를 생성해서 관리까지 해주다보니 모델서빙 서버를 직접 개발할 필요가 없어서 훨씬 개발 효율이 올라간 것을 느꼈습니다!
저희 조직은 빠르게 ai 기술들을 테스트해보고 있다보니, BentoML 프레임워크가 굉장히 효율적이더라구요. 물론 사내 개발환경에 따라 다르겠지만 기회가 되면 다들 한번씩 경험해보셨으면 좋겠습니다!
그럼 다음번에는 실제 모델서빙이 어떻게 이루어지는지에 대해 소개해드리겠습니다 :)
Reference
'MLOps' 카테고리의 다른 글
마지막 글또를 시작하며.. (3) | 2024.10.13 |
---|---|
MLOps - WorkFlow2: MLFlow 실습 (0) | 2024.01.21 |
MLOps - WorkFlow1: MLFlow (0) | 2023.12.24 |
머신러닝? ops? 이제는 MLOps 다! (2) | 2023.12.10 |