배경
ML을 제품에 적용하기 위해서는 단순히 모델 만드는것에만 집중하면 되는것이 아니다.
개발환경에서 열심히 개발후 모델을 실제 제품에 배포했다 이때 아래와 같은 문제들이 생기기도 한다.
- 배포된 모델의 결과값이 이상하다 (예상치 못한 input이나 알 수 없는 오류들...)
- Research에선 성능이 좋았는데, Production 환경에서는 과거에 배포한 모델이 더 좋다?
- 수요예측모델 운영 중 코로나로 인해 수요가 완전히 변했다. 어떻게 모델을 잘 운영할까?
모델링에만 집중하고 싶은데, 모델 운영에 할일이 너무 많다.
하면 뭐가 좋지?
- 성공적으로 ML 프로젝트를 진행하기 위해. 안정적이고 빠르게
- 머신러닝 모델 개발과 머신러닝 모델 운영에서 사용되는 문제, 반복을 최소화 하고 목표인 비즈니스 가치를 창출하는 것에 집중하자
Goals
- 모델링에 집중할 수 있도록 관련된 인프라를 만들고 자동으로 운영되도록 만드는것이 목표이다.
- 빠른 시간 내에 가장 적은 위험을 부담하며, 아이디어 단계부터 production 환경까지 ML 프로젝트를 진행할 수 있도록 기술적 마찰을 줄이는것
- 업데이트된 모델, production의 더 빠른 배포
- 품질 보증
ML 생애주기와 각 step별 MLOps가 필요한 이유
모델을 만들기전: 문제의 정의, 데이터 수집, 전처리 과정
- 데이터는 서로 다른 형태, 소스일수 있으며, 이를 전처리하는데 시간이 오래걸린다.
- 데이터의 품질이 향상될수록 모델의 성능, 품질이 좋아진다.
→ 지속적으로 버전관리하며 데이터 품질에 대해 관리/개선
모델 만들기
- 다양한 조합으로 적합한 모델을 생성하는 과정
- feature 생성/선택
- 알고리즘 선정
- 하이퍼 파라미터 튜닝
- 모델 피팅
- 실패한 모델들도 더 좋은 모델을 위한 중요한 경험이고 이력을 남길 필요가 있다.
→ 코드, 환경, 종속성 관리
- 대부분의 데이터 사이언티스트는 사소한 튜닝 이외의 단계를 반복하게 된다.
→ 재활용가능한 ML파이프라인을 통해 ML lifecycle checkpoint 처럼 사용할수 있게 된다.
모델을 만든 이후: 검증, 평가, 배포/운영, 재학습/배포
- 모델을 만든 이후, 검증, 평가, 서비스화(배포/운영), 모니터링 후 재학습/배포
- 사용자 또는 응용프로그램에 배포하는 과정
- 배포전에 기술적, 비즈니스적인 유효성 검토가 필요함
- QA단계 필요. 개발환경에서 test, 알파/베타 test
- 성능, 응답시간 등의 성능 지표 관리 필요
→ 자동화된 평가, 테스트, 컨테이너 빌드/배포, 모니터링
- 모델 Drift (ex 비즈니스 요구 변경에 의해 모델 변경이 필요할수 있다.)
- 데이터 Drift (ex 신제품, 시즌, 소비자 선호도 변경 등)
→ 자동화된 트리거로 model retraining
Components
모델 Searving
개발된 모델을 Production 환경에서 사용할수 있도록 배포해야한다.
- Batch Serving: 많은 양을 한번에 일정주기로 전달
- Airflow, Cronjob등으로 스케줄링 작업
- 학습/예측을 별도의 작업으로
- 간단하게 하기 좋다.
- Online Serving: API로 요청시 올때마다, 모델을 전달. 동시에 여러 요청이 있을때를 고려해야함
- flasks, fast API → Docker → kubernates → Serving 프레임워크 사용
- Kubeflow, BentoML, tenserflow/serving 등등
- 처음부터 API형태로 Serving 해야하는 것은 아니고 상황에 따라 선택
- 서버와 꼭 실시간 통신이 필요한게 아니라면 최초에 Batch serving을 구축하는 것도 좋다.
- Batch serving 결과를 DB에 저장하고 그 데이터를 주기적으로 가져가는 방식으로
- 제품에 대한 추천 결과를 저장해 놓고 주기적으로 업데이트
- Serving 라이브러리는 점점 간단한 코드만 작성하면 Docker Image를 명령어 하나로 만들 수 있는 기능을 지원 ex) BentoML
Experiment, Model Management
- 모델 개발시 파라미터와, 모델구조에 대해 여러가지 시도를 할 것이다.
- 성능이 가장 좋은 모델을 사용하기 위해, 이를 기록해두는게 필요하다.
- 모델 아티팩트(학습하는 과정에서 생기는 이미지, 모델 파일), 이미지파일, 학습코드, 학습모델 피클 파일 등
- 모델별 생성일, 성능등에 모델 metadata 대한 기록도 필요
- 기록을 쉽게하고, 편하게 볼수있도록 모니터링 대시보드가 필요하다.
- Weight&Bias, Neptune, MLflow 등
- 리서치 환경에서 가장 좋은것들을 선택해서 Serving 할수있어야 한다.
- 룰 기반으로 모델을 선택할수 있으면 더 좋ㅇ다.
Feature Store
- 여러 모델을 운영하는 경우, 중간의 겹치는 것들을 미리 셋팅해 놓고 피쳐화, 이러한 머신러닝 피쳐를 집계한 피쳐스토어
- Reserach와 Procution에서도 같이 사용할수있도록 구성
- 프로덕션에서도 실시간 데이터를 빠르게 받을 수 있도록
- 재사용 가능하게 만들어 시간, 비용 절약
- Batch단위로 쿼리를 실행해 DB Table에 저장하고, 해당 Table을 Feature Store로 사용
- 실시간 데이터를 Feature Store로 구성
- 오픈소스: Feast, Hiosworks
- SegeMaker feature store(Amazon), Vertex AI(Google)
Data Validataion
- 리서치 환경과 Production 환경에서 동일한 서로 다른 데이터를 사용한다면, 이들이 비슷한지를 확인해보아야한다.
- 피쳐스토어가 있고, 동일한 피쳐스토어를 본다면 크게 상관 없을 수도 있다.
- 데이터의 분포가 어떻게 달라지고 있는지 파악하는것도 중요하다.
- Data Drift, Model Drift, Concept Drift
- 단일 모델은 시간이 지날수록 성능이 떨어질수밖에 없다.
- 드리프트가 어떻게 변경됬는지에 따라, 주기적으로 재학습이 필요하다.
- Data Validation에서 지속적으로 모니터링 해야한다.
- 텐서플로우/TFX
Continuous Training
기존 모델의 성능이 떨어지고 있다... 뭔가 모델을 다시 만들어야 한다. 언제 해야할까?
- 새로운 데이터가 들어온 경우
- 일정 기간이 지난 후에, 특정 주기로
- 메트릭 기반 ex)RMSE가 n이하로 떨어졌다..
- 요청시
- 라이브러리가 있진 않고, 보통 CI/CD와 같이 진행
ETC
- Infra: GPU infra, 클라우드 리소스 관리, Research, Production 환경을 동일하게,
- 모델 성능 모니터링
- 자동화 시스템 Auto ML
- 학습 후 Model validation
MLOps 맛보기 - kubeflow 소개/활용법
Kubeflow = kubernetes + ML workflow. Machine learning toolkit for kubernetes
- 쿠버네틱스위에 tenseorflow extended pipeline을 어떻게 잘 돌려볼까를 고민하다가 시작
- 쿠베플로우의 목표는 ML 워크플로우에 필요한 서비스를 만드는 것이 아닌, 각 영역에서 가장 적합한 오픈 소스 시스템들을 제공하는 것이다.
- 새로운 서비스가 아닌 기존에 있던 오픈소스들의 묶음이다.
- 프로젝트별 자원할당
- pipeline 셋팅
- hyper parmeter tuning 자동화
- 배포를 위한 서빙 도구
pass
아래 글들에 잘 정리되어 있다...