MLops 정리하기.
이전에 스터디하면서 발표자분이 정말 내용을 꽉꽉 채워 이야기해주셔서 배웠던 게 많았던 발표인데 내용을 정리하지 않으면 영영 까먹을 것 같아 정리해본다.
💡 MLOps란 무엇인가?
MLOps: 머신러닝 운영(Machine Learning Operations)의 약자로, AI 시스템의 개발, 테스트, 배포, 모니터링 등의 과정을 효율적으로 관리하고 최적화하는 기술을 의미한다.
그럼 왜 이런 기술이 필요할까?
AI 모델은 시간이 지남에 따라 새로운 패턴의 등장 혹은 데이터 분포의 변화 등으로 성능이 저하되거나 모델의 편향성이 발생할 수 있다. 또한, 여러 버전의 모델이 동시에 개발되면 실험 결과의 일관성이 부족해서 재현성이 낮아지는 문제가 발생한다.
때문에 AI 성능의 유지를 위해서는 지속적인 모니터링/ 업데이트가 필요하다. 이때 이를 자동화하고 효율적으로 관리하는 것이 MLOps이다.
✅ MLOps의 주요 구성 요소
| 구성 요소 | 정의 | 비고 |
|---|---|---|
| 버전 관리 (Version Control) |
데이터, 코드, 모델 바이너리 및 설정의 변경 사항을 체계적으로 추적하고 기록하는 프로세스 | • 코드: 모델 학습 및 실험을 위한 코드, 서비스 배포를 위한 코드 등 • 데이터: 모델 학습 시 사용한 데이터셋, 평가 시에 사용한 데이터셋 등 • 모델: 각 실험마다 생성된 모델 등 • 개발환경: 각 실험을 수행하기 위한 개발환경, 서비스 배포를 위한 개발환경 등 |
| CI/CD (Continuous Integration/Continuous Deployment) |
소프트웨어 및 머신러닝 모델의 개발 생애주기를 자동화하고 간소화하기 위한 일련의 관행과 도구 | • CI (Continuous Integration): 모델을 지속적으로 통합하고 테스트하는 것 • CD (Continuous Deployment): 자동 배포를 통해 운영 환경에 모델 서비스를 안정적으로 배포하는 것 |
| 모니터링 (Monitoring) |
실제 운영 환경에서 어떻게 성능을 발휘하는지 체계적으로 추적하고 측정하며 이해하는 일련의 과정 | • 모델 성능 및 데이터 품질 모니터링 필요 • 모델 드리프트 감지, 실시간 경고 시스템 구축 |
💡 MLOps 파이프라인은 무엇인가?
파이프라인: 데이터 수집, 전처리, 모델 학습, 평가, 배포, 모니터링을 포함한 MLOps 전체의 흐름을 이어주는 개념
🛠️ 파이프라인의 단계
파이프라인은 크게 6가지 단계로 구성된다.
- 데이터 수집 : 다양한 소스로부터 데이터를 수집하고 통합하는 것
- 데이터 전처리 : 정규화, 결측치 처리, 피처 엔지니어링 등을 통해 모델 학습에 부정적 영향을 끼치는 데이터를 제거하는 것
- 모델 학습 : 데이터를 기반으로 모델을 학습하는 것.
- 모델 평가 : 모델의 성능을 평가하는 것. 모델을 평가할 때는 도메인, 모델 알고리즘 등의 종류에 따라서 다양한 평가 지표를 선택할 수 있음. 일반적인 오프라인 지표 테스트 뿐만 아닌, A/B테스트와 같은 온라인 테스트도 수행 가능
- 모델 배포 : CI/CD를 통해 모델을 배포한다. 이때, 서비스의 목적과 특성 그리고 달성하고자 하는 비즈니스 목표 등에 따라서 배포 전략이 달라질 수 있다. 대표적으로는 실시간 배포와 배치성 배포를 살펴볼 수 있다.
- 성능 모니터링 및 반복 : 모델의 성능을 모니터링하고 반복하는 것. CICD 파이프라인을 통해 자동 배포 후 모니터링을 통한 성능 확인을 진행한다.
이를시각적으로 나타내보면 아래와 같다.
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#4F46E5', 'primaryTextColor': '#fff', 'primaryBorderColor': '#3730A3', 'lineColor': '#6366F1', 'secondaryColor': '#F0ABFC', 'tertiaryColor': '#E0E7FF'}}}%%
flowchart TB
subgraph Phase1["1️⃣ 데이터 수집"]
A1[웹 크롤링] --> A2[API 연동]
A2 --> A3[데이터베이스 수집]
A3 --> A4[스트리밍 데이터]
A4 --> A5[(Raw Data Lake)]
end
subgraph Phase2["2️⃣ 데이터 전처리"]
B1[데이터 정제] --> B2[결측치/이상치 처리]
B2 --> B3[피처 엔지니어링]
B3 --> B4[데이터 검증]
B4 --> B5[(Feature Store)]
end
subgraph Phase3["3️⃣ 모델 학습"]
C1[실험 설계] --> C2[하이퍼파라미터 튜닝]
C2 --> C3[분산 학습]
C3 --> C4[모델 버저닝]
C4 --> C5[(Model Registry)]
end
subgraph Phase4["4️⃣ 모델 평가"]
D1[오프라인 테스트] --> D2[검증 데이터셋 평가]
D2 --> D3[A/B 테스트]
D3 --> D4[온라인 테스트]
D4 --> D5{성능 기준 충족?}
end
subgraph Phase5["5️⃣ 모델 배포 - CI/CD"]
E1[모델 패키징] --> E2[컨테이너화]
E2 --> E3[스테이징 배포]
E3 --> E4[카나리 배포]
E4 --> E5[프로덕션 배포]
end
subgraph Phase6["6️⃣ 성능 모니터링 및 반복"]
F1[실시간 메트릭 수집] --> F2[데이터 드리프트 감지]
F2 --> F3[모델 성능 추적]
F3 --> F4[알림 시스템]
F4 --> F5{재학습 필요?}
end
%% Main Flow Connections
Phase1 --> Phase2
Phase2 --> Phase3
Phase3 --> Phase4
D5 -->|Yes| Phase5
D5 -->|No - 재설계| Phase3
Phase5 --> Phase6
F5 -->|Yes - 재학습 트리거| Phase2
F5 -->|No - 지속 모니터링| F1
%% Tools & Technologies Labels
subgraph Tools["🛠️ 주요 도구 및 기술"]
T1["데이터: Airflow, Kafka, Spark"]
T2["피처: Feast, Tecton, Hopsworks"]
T3["학습: MLflow, Kubeflow, W&B"]
T4["평가: Evidently, Great Expectations"]
T5["배포: Docker, K8s, ArgoCD"]
T6["모니터링: Prometheus, Grafana"]
end
style Phase1 fill:#DBEAFE,stroke:#3B82F6,stroke-width:2px
style Phase2 fill:#FEF3C7,stroke:#F59E0B,stroke-width:2px
style Phase3 fill:#D1FAE5,stroke:#10B981,stroke-width:2px
style Phase4 fill:#FCE7F3,stroke:#EC4899,stroke-width:2px
style Phase5 fill:#E0E7FF,stroke:#6366F1,stroke-width:2px
style Phase6 fill:#FEE2E2,stroke:#EF4444,stroke-width:2px
style Tools fill:#F3F4F6,stroke:#9CA3AF,stroke-width:1px,stroke-dasharray: 5 5
📌 MLOps의 tool
- Docker: 모델 및 의존성 환경을 컨테이너화하여 재현성과 이식성을 제공
- Kubernetes: 컨테이너 오케스트레이션 서비스로, 컨테이너화된 애플리케이션의 배포, 확장, 관리를 자동화하는 도구. 안정적인 서비스 운용을 위한 확장성과 자동배포 관리를 지원한다
- Prometheus: 이벤트 모니터링 및 경고에 사용되는 오픈소스 모니터링 툴 (데이터 수집 역할)
- Grafana: 시계열 메트릭 데이터를 시각화하는데 최적화된 오픈소스 툴 (수집한 데이터툴 시각화)
- MLFlow: 머신러닝 모델의 실험을 트래킹하고, 모델을 공유 및 배포하는데 활용할 수 있는 오픈소스 툴. 각 experiment, run마다 메트릭의 성능, 학습에 사용한 코드, 의존성, 데이터, 학습 모델을 백업하고, 해당 내역을 계층적으로 조회해볼 수 있어 버전 관리에 용이함
- KubeFlow: Kubernetes(k8s)를 기반으로 머신러닝 파이프라인을 자동화하는 플랫폼
- Jenkins:CI/CD를 통해 모델 훈련 및 배포 자동화
- ArgoCD: GitOps 방식으로 Kubernetes 배포 관리 (깃에 커밋된 내용을 토대로 자동 배포)
- DVC: 데이터와 모델의 버전 관리를 지원
- Kafka: 실시간 데이터 처리를 위한 메시지 큐
- Airflow: 데이터 워크플로우를 관리하는 오픈소스 툴
- Spark: 분산 컴퓨팅을 위한 오픈소스 툴
💡 모니터링과 버전 관리
모델 모니터링의 중요성: 데이터 및 모델 성능에 대한 지속적인 모니터링을 통해 모델의 성능이 떨어지는지 아닌지 확인할 필요성이 있다.
특히 데이터에 시간이 특성이 반영되는 경우라면, 보편적으로 데이터가 달라질 때 모델의 성능이 떨어지는 현상이 있는데 이를 모델 드리프트라고 한다.
이러한 문제점은 재학습 등을 통해 해결할 수 있으나 시간이 지날수록 리소스가 많이 필요해지기 때문에 모니터링을 통해 이를 확인하고 이를 통해 모델을 재학습하는 것이 효율적이다.
버전 관리의 중요성: 학습에 사용하는 데이터의 버전, 데이터에서 추출한 피처의 버전, 모델 구조의 버전 등 학습 시 결과에 영향을 끼칠 수 있는 다양한 요인이 존재한다. 때문에 이를 잘 기록하여 버전관리를 해야 실수로 재현성을 해치거나 성능을 해치는 경우를 방지할 수 있다.(이때 MLflow나 DVC와 같은 버전 관리 툴을 사용하면 쉽게 관리할 수 있다.)