MLOps 중 모델을 배포하는 부분에 대해 공부를 진행하며 현재 마켓에서 사용중인 다른 플랫폼에 대해서 조사를 진행했다. 크게 KServe / Seldon Core / Seldon Deploy 제품이 존재했다. 그 중 KServe와 Seldon Core 제품은 무료로 사용가능한 제품이고 Seldon Deploy의 경우는 엔터프라이즈의 제품이었다. 앞선 두 무료 제품의 경우 모델의 CRD 구현의 경우 구현이 잘 되어있지만, 배포 이후의 관리적인 측면에서 한계가 존재했다.
먼저 조사하기에 앞서 모델의 배포 서버가 존재해야하는 이유와 왜 생겨났는지를 조사하고 생각해보았다.
MLOps가 생겨난 이유는 처음에 생각했을때 DevOps와 같은 이유로 배포를 자동화하는 과정을 통해 비싼 리소스(장비, 인건비 등)들을 최소화하기 위해 그리고 사람의 손을 통해 배포를 하게 되면 잔실수같은게 치명적인 오류로 발생하는 경우도 존재하기 때문에 등과 같은 이유로 똑같다고 생각했다.
하지만 그렇다면 DevOps와 다른점은 무엇일까 ? ML와 일반적인 Dev와 가장 큰 차이점은 '데이터' 라는 데에 있다고 생각한다. DevOps 는 개발자에 의해 변하고 개발자가 무언가 행위를 함으로써 새롭게 생겨나고 추가되지만, ML은 계속적으로 생성되는 데이터는 가장 최근 트렌드에 유사하면서 좋은 훈련 데이터이고 필수적으로 학습을 시도라도 해봐야할 데이터이다. 그렇다면 이러한 데이터를 처리하는 과정 (본인도 AI에 대해 공부를 할 때 실질적인 모델링에 대한 공부보다 데이터를 다루는 공부가 훨씬 시간도 길고 실제 개발을 하는 과정 중에서도 훨씬 오래걸렸다. -_-)을 매번, 매순간 계속 반복할 것인가?
한번 대용량의 데이터를 처리하는데 엄청난 시간이 걸린다. 데이터의 null 값들, outlier, 스케일조정, 인코딩 등 다양한 전처리가 필요할탠데 매번 엔지니어가 처리하기에는 비싼인력을 노동으로 사용하는 꼴이 되버릴 수도있다. 이러한 이유에 의해(물론, 다른 추가적인 이유도 더 있겠지만 본인이 생각하기에는 이러한 이유가 가장 크다고 생각한다.) MLOps는 ML을 도입하려는 곳이라면 필수적으로 구성해야하는 요소라고 생각한다. 데이터는 계속 변하고 더더욱 많이 생겨나니까..
오픈소스 인퍼런싱 서버 - Triton / Seldon MLServer
용어?
Canary Rollout : 새 버전의 모델 배포시, 소규모의 사용자들에게 먼저 제공하여 위험을 빠르게 감지하는 배포 전략
A/B 테스트 : 새롭게 배포된 모델과 이전 모델의 성능 비교를 통해 어떤게 더 나은지 판단하는 테스트
KServe
https://github.com/kserve/kserve
KServe는 Language / Framework 에 대해 Agnostic 한 Model Serving 능력을 갖추기 위해 Kubernetes 기반으로 설계한 General 한 Framework 이다.
KServe 는 이전 KFServe 에서 2021년 9월에 이름을 변경한 프로젝트이며 Kubeflow 프로젝트를 졸업한 독립 컴포넌트이다. 분리를 통해 KServe는 독립형 모델 서버로 구축된 별도의 클라우드 네이티브 추론 엔진으로 발전했다. Kubeflow와 긴밀한 통합은 지속되지만 독립적인 오픈 소스 프로젝트로 진행한다.
KServe는 Google, IBM, Bloomberg, Nvidia 및 Seldon에서 Kubernetes의 오픈 소스 클라우드 네이티브 모델 서버로 공동으로 개발했다. 0.6 버전까지는 KFServe로 0.7부터는 KServe로 변모하였고 가장 최신버전인 0.8버전에서는 이를 독립형 컴포넌트로 전환하도록 진행했다.
기능
머신러닝의 모델을 규모에 맞게 제공할 수 있는 기반을 제공한다. KServe는 Kubernetes 배포 또는 scale-to-zero를 지원하는 서버리스로 배포할 수 있다. 자동 스케일 조정 기능이 있는 Knative Serving을 활용한다. KNative와 함께 사용되는 Istio는 서비스의 API를 소비자에게 공개하기위한 용도로 사용되다. 이러한 기능 덕분에 카나리 배포, 롤 아웃들의 다양한 배포전략을 실현할 수 있다. Knative Serving 없이 사용할 수 있지만 scale-to-zero는 지원하지 않는다.
Seldon Core
Seldon Core는 Kubernetes에 머신러닝 모델 배포를 하는 오픈 소스 플랫폼이다. 머신러닝 모델과 언어 Wrapper를 프로덕션 REST / GRPC 마이크로 서비스로 변환한다. ( REST / GRPC ) 모델을 확장 시키는 다양한 기능을 제공하고, 전략적으로는 고급 메트릭, 요청 로깅, 설명자, 이상치 탐지기, A/B 테스트, 카나리아 등을 포함한 기능을 제공한다.
Seldon Core에서는 사전 패키지 모델을 제공한다.
- MLflow Servre, SKLearn Server, Tensorflow Server, XGBoost Server
또한, 추론 코드를 Seldon Core에서 실행되도록 Wrapping 하기 위해 Language Wrapper를 제공한다.
- [Python / Java / R / NodeJS / Go / Spark ] Language Wrapper
Seldon Core의 장점으로는
- 언제어디서나 실행 : Kubernetes 기반으로 구축되어 모든 클라우드 및 온프레미스에서 실행가능하다.
- 불가지론적이고 독립적이다 : 프레임워크에 구애받지 않고 최고의 ML 라이브러리, 툴킷 및 언어를 지원한다.
- 런타임 추론 그래프 : 실험적이고 앙상블 및 트랜스포머와 함께 뛰어난 배포를 할 수 있다.
BentoML
모델을 더 쉽고 빠르게 배포하는 도구
사용선정이유
사내 ML 플랫폼에서 정말 편리하고 손쉽게 BentoML 환경을 구성할 수 있다는 장점
장점
여러 ML 프레임워크와 연동할 수 있다는 장점, (Scikit-Learn, PyTorch, Tensorflow, Keras, FastAI, XGBoost, LightGBM, CoreML 등) BentoML은 위 코드와 같이 서빙 API를 만들기 위한 템플릿을 손쉽게 만들 수 있다.
자유롭게 인풋을 전처리할 수 있다는 장점
온라인 서빙 외에 배치 기능도 적용할 수 있다. 쉽게 말해 인풋 피처를 100개 송신하면 아웃풋을 100개 반환하는 개념 -> 예측 결과가 각 프레임워크별로 다른 데이터 타입으로 반환되고, 이 결과를 후처리 단계에서 조합하기 위해 O(n)만큼의 반복문 수행이 필수입니다. 지연 시간이 중요한 서비스에서는 비효율적인 부분이라고 생각, 성능 관점에서 대용량 배치는 Airflow와 같은 스케줄러가 더 효율적이라고 생각
패키징 기능 : BentoML에서도 *.tar.gz로 압축, 이런 과정을 BentoML에서는 아주 쉽게 진행 가능
조사 결과
대부분의 모델 CRD는 일반적인 CI/CD 파이프라인 구성과 비슷하기도 하고 구현들이 잘 되어 있다. 하지만 배포 이후 관리는 구성되어있지 않는데 이유가 무엇일까 ?
아무래도 모델의 경우 각각 모델 및 솔루션 마다 해결방법이나 필요로 하는 모니터링 서비스가 제한적이고 선택적이어서 그런가 ? 아직 잘 모르겠다.