[MLOps] 05 Model Serving
포스팅 개요
본 포스팅은 머신러닝 모델 serving의 개념과 변화에 대해 정리하는 글입니다.
0. Model Serving 개요
머신러닝 모델의 Serving은 곧 머신러닝 모델의 서비스화를 뜻합니다. 여기서 서비스화란, 사용자가 특정한 방식으로 input을 전해주면, 서버에서 모델의 inference를 수행한 후, 사용자는 input에 대한 결과값을 전달받을 수 있도록 하는 것입니다. 이 때 고려해야 할 점은, 사용자가 보내는 input은 그 형태가 다양하며, 사용자가 input을 보내는 주기도 제각각이라는 것입니다.
- input 형태의 예시
- HTTP API Request
- 챗봇과의 대화
- 넷플릭스 영상 좋아요 버튼
- 유튜브 구독 버튼
- 네이버 길찾기 버튼
이와 같이 다양한 형태의 input을 동적인 주기로 전달한다는 점에서, ML model의 serving 과정에서는 개발자가 임의의 input과 주기로 output을 predict하는 실험 환경에서는 고려하지 않았던 많은 변수들을 고려할 필요가 있습니다. 그렇기에 많은 기업들에서 AI를 도입할 때, 모델 개발까지는 문제가 없다가도 서비스화를 하는 과정에서 어려움을 겪기도 합니다.
ML model의 serving 단계에서 막히는 이유
아래는 ML model serving에서 겪을 수 있는 어려움입니다.
- 모델 개발과 소프트웨어 개발의 방법의 괴리
- 모델 개발 과정과 소프트웨어 개발 과정의 파편화
- 모델 평가 방식 및 모니터링 구축의 어려움
머신러닝 모델의 개발은 '데이터'라는 중요한 요소가 관여된다는 점에서 여타 SW의 개발과 구분됩니다. 그런데 이러한 머신러닝 모델의 서비스화에 있어 다른 SW의 서비스화 방식을 접목하여 사용하다보니, 머신러닝 모델의 고유한 특성을 온전히 고려하지 못한다는 점에서 여러 문제점이 발생할 수 있습니다. 더불어 머신러닝 모델을 개발하는 사람과 그 모델을 서비스화하는 과정을 담당하는 사람은 주로 구분되어 있기에 이러한 문제점은 심화되기도 합니다. 이에 따라 머신러닝 모델의 serving을 위한 end-to-end platform이 등장하기 시작했습니다.
ML model serving의 과거와 현재
- 과거
- flask, FastAPI 등의 웹 프레임워크를 사용해서 ML model에 api를 열어주는 코드를 덧붙이는 형태
- 현재
- Seldon Core
- TFServing
- KFServing
- Torch Serve
- BentoML
ML model serving의 사례
- SOCAR 딥러닝 기반 차량 파손 탐지 모델의 시스템 반영 과정
딥러닝 모델 Serving 간단 구축기
(feat. AWS SQS + Python Application + Kubernetes + Git & Rancher)
tech.socarcorp.kr
1 Model Serving
1.1 Serving Basic
- Serving이란?
- 모델을 production 환경에서 사용할 수 있도록 배포하는 과정
- 모델의 활용 방식
- ‘서비스화’라고도 표현할 수 있음
- Serving vs Inference
- Serving: 모델을 웹/앱 서비스에 배포하는 과정. 모델을 ‘서비스화’ 하는 관점
- Inference: 모델에 제공된 데이터를 바탕으로 예측을 하는 과정. 모델을 ‘사용’하는 관점
- Serving 방식
- Online Serving
- Batch Serving
- Edge Serving
2 Online Serving
2.1 Web Server Basic
- 웹 서버
- HTTP를 통해 웹 브라우저에서 **요청(Request)**하는 HTML 문서나 오브젝트를 **전송(Response)**해주는 서비스 프로그램
- 요청(Request)을 받으면 요청한 내용을 보내주는(Response) 프로그램
- Client의 다양한 요청을 처리해주는 역할
- HTTP를 통해 웹 브라우저에서 **요청(Request)**하는 HTML 문서나 오브젝트를 **전송(Response)**해주는 서비스 프로그램
- 머신러닝 모델 서버
- 어떤 데이터(input)를 제공하며 예측을 요청(Request)하면, 모델을 사용하 예측값을 반환(Response)하는 서버
2.2 API
- API (Application Programming Interface)
- 운영체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
- ‘클라이언트에서 이 서버로 요청을 보내면 이러한 응답을 주고, 저 서버로 요청을 보내면 저러한 응답을 줄게’와 같은 식으로 규칙을 정해놓은 것
2.3 Online Serving Basic
- online serving
- 클라이언트가 ML 모델 서버에 HTTP를 통해 요청(Request) → ML 모델 서버가 예측값 생성 → 생성한 예측값을 반환(Response)
- 요청(Request)이 들어올 때마다 실시간으로 예측 및 반환(Response)
- online serving의 예시
- 음식 배달 소요 시간 예측: 고객이 음식을 주문하는 즉시 해당 지역의 과거 평균 배달 시간 및 실시간 교통 정보 등을 바탕으로 음식 배달에 소요되는 시간을 예측하여 고객에게 정보 제공
- online serving을 구현하는 방식
- 직접 API 웹 서버 개발
- Flask, FastAPI 등을 사용하여 서버 구축
- 클라우드 서비스 활용
- AWS의 SageMaker, GCP의 Vertext AI 등의 클라우드 서비스 활용
- 클라우드 서비스의 장점
- MLOps의 다양한 요소가 완성된 상태로 제공됨
- 사용자의 입장에서는 Pytorch를 사용하는 것처럼 학습 코드만 제공하면 API 서버가 만들어짐
- 클라우드 서비스의 단점
- 일반적으로 직접 API 웹 서버를 개발하여 사용하는 것보다 많은 비용을 필요로 함
- 클라우드의 내부 구조를 파악하고 있어야 문제 상황에 적절하게 대처할 수 있음
- serving 라이브러리 활용
- Tensorflow Serving, Torch Serve, MLFlow, BentoML 등의 라이브러리 활용
- Flask, FastAPI 등은 서버에 대한 충분한 이해가 전제되어야 하지만, serving 라이브러리는 비교적 추상화된 패턴에 따라 활용이 가능함
- 직접 API 웹 서버 개발
- online serving에서 고려할 부분
- ‘재현 가능’한 코드를 작성하기 위하여 python 버전, 패키지 버전 등 dependency에 대한 관리를 필요로 함
- Virtualenv, Poetry, Docker 등을 활용
- 실시간으로 예측값을 반환해야 하기 때문에 latency를 최소화해야 함
- latency: 하나의 예측을 요청(Request)한 후 반환값(Response)을 받는데까지 걸리는 시간
- input 데이터를 기반으로 Database에 있는 데이터를 추출하여 모델로부터 예측값을 생성해야 하는 경우 데이터를 추출하는 시간을 고려해야 함
- 모델이 예측값을 생성하는 시간을 단축하기 위해 모델을 경량화하거나 단순한 모델을 사용하기도 함
- 결과값에 대한 보정이 필요할 수 있음
- 모델로부터 유효하지 않은 예측값이 반환될 경우 이를 보정한 값을 반환해야 함
- ex. 모델이 부동산 가격을 예측하여 음수 값을 반환 → 0 이상의 값으로 보정
- 모델로부터 유효하지 않은 예측값이 반환될 경우 이를 보정한 값을 반환해야 함
- ‘재현 가능’한 코드를 작성하기 위하여 python 버전, 패키지 버전 등 dependency에 대한 관리를 필요로 함
3 Batch Serving
- batch serving
- 모델이 주기적으로 학습 및 예측을 수행
- workflow scheduler를 통해 모델의 작업 스케쥴을 관리
- worflow scheduler: Airflow, Cron Job 등
- 실시간 응답이 필요 없는 대부분의 상황에서 활용 가능
- batch serving의 예시
- Spotify의 Discover Weekly: 일주일 단위의 예측 수행