콘텐츠로 이동

MLOps 기초 (MLOps Basics)

개요

MLOps(Machine Learning Operations)는 ML 모델의 개발, 배포, 운영을 자동화하고 체계화하는 실천 방법이다. 소프트웨어 엔지니어링의 DevOps에서 영감을 받았으나, ML 특유의 요소(데이터 의존성, 모델 성능 변동, 실험 관리)를 추가로 다룬다. MLOps의 목표는 모델을 안정적이고 반복 가능하게 프로덕션에 전달하는 것이다.


핵심 개념

1. CI/CD for ML

소프트웨어 CI/CD와 달리, ML에서는 코드, 데이터, 모델 세 가지가 모두 버전 관리와 테스트의 대상이다.

flowchart LR
    A["코드 변경"] --> B["CI: 코드 테스트"]
    C["데이터 변경"] --> D["CI: 데이터 검증"]
    B & D --> E["학습 파이프라인"]
    E --> F["CI: 모델 검증"]
    F --> G["CD: 배포"]
    G --> H["모니터링"]
    H -.->|"트리거"| E

ML 파이프라인 테스트

테스트 유형 대상 예시
데이터 검증 스키마, 분포, 범위 결측률 < 5%, 값 범위 확인
모델 검증 최소 성능 임계값 F1 > 0.85, AUC > 0.90
편향 검사 그룹별 성능 차이 성별 간 FPR 차이 < 5%
통합 테스트 전처리 → 추론 파이프라인 End-to-end 추론 성공

배포 게이트(Performance Gate): 자동 배포 시 다음 조건을 만족해야 한다:

\[\text{Deploy if } M_{\text{new}} \geq M_{\text{production}} - \epsilon \quad \text{and} \quad M_{\text{new}} \geq M_{\text{min}}\]

여기서 \(M_{\text{new}}\)는 새 모델의 성능, \(M_{\text{production}}\)은 현재 프로덕션 모델의 성능, \(\epsilon\)은 회귀 허용치(regression tolerance), \(M_{\text{min}}\)은 절대 최소 성능 기준이다. 두 조건을 동시에 충족해야 배포가 승인된다.

도구: GitHub Actions + DVC, Kubeflow Pipelines, Vertex AI Pipelines

2. 모델 모니터링 (Model Monitoring)

모니터링 유형 라벨 필요 지표
성능 모니터링 필요 Accuracy, F1, AUC
프록시 지표 불필요 예측 분포, 신뢰도 분포
시스템 지표 불필요 Latency, throughput, error rate, GPU 사용률

알림 설정: 성능이 임계값 이하로 떨어지거나, 시스템 지표가 비정상일 때 자동 알림을 발송한다. 성능 저하 알림의 정량적 기준은 다음과 같다:

\[\text{Alert if } \frac{M_{\text{current}} - M_{\text{baseline}}}{M_{\text{baseline}}} < -\delta\]

여기서 \(M_{\text{current}}\)는 현재 성능 지표, \(M_{\text{baseline}}\)은 배포 시점의 기준 성능, \(\delta\)는 허용 임계값(예: 0.05, 즉 5%)이다. 비율 기반으로 설정하면 지표의 절대 크기에 관계없이 일관된 알림 기준을 유지할 수 있다.

3. 데이터 드리프트 탐지 (Data Drift Detection)

드리프트 유형 정의 위험도
Covariate Shift 입력 분포 변화 중간
Prior Probability Shift 클래스 비율 변화 중간
Concept Drift 입출력 관계 변화 높음 (가장 위험)

탐지 방법:

PSI (Population Stability Index)는 학습 시점과 현재 데이터의 분포 변화를 정량화한다:

\[\text{PSI} = \sum_{i=1}^{B} (p_i^{\text{actual}} - p_i^{\text{expected}}) \cdot \ln\frac{p_i^{\text{actual}}}{p_i^{\text{expected}}}\]

여기서 \(B\)는 히스토그램 구간(bin) 수, \(p_i^{\text{actual}}\)은 현재 데이터의 비율, \(p_i^{\text{expected}}\)는 학습 데이터의 비율이다. PSI < 0.1이면 안정, 0.1~0.25이면 주의, > 0.25이면 유의한 분포 변화로 판단한다.

KS 검정(Kolmogorov-Smirnov Test)은 두 누적분포함수 간의 최대 차이를 측정한다:

\[D_{KS} = \sup_x |F_{\text{train}}(x) - F_{\text{current}}(x)|\]

여기서 \(F_{\text{train}}(x)\)는 학습 데이터의 누적분포함수, \(F_{\text{current}}(x)\)는 현재 데이터의 누적분포함수이다.

방법 설명 적용
PSI (Population Stability Index) 두 분포 간 안정성 측정 수치 특성
KS Test 두 분포의 최대 차이 검정 수치 특성
히스토그램/분위수 비교 시각적/정량적 비교 모든 특성
Adversarial Validation 학습/현재 데이터 구분 모델 전체적 분포 변화

대응 전략: - 자동 재학습 파이프라인 - 적응적(incremental) 학습 - 모델 fallback / 규칙 기반 전환 - 알림 + 인간 개입

4. 모델 레지스트리와 버전 관리

stateDiagram-v2
    [*] --> Development: 실험/학습
    Development --> Staging: 검증 통과
    Staging --> Production: 승인
    Production --> Archived: 새 버전 배포
    Staging --> Development: 검증 실패
    Production --> Staging: 성능 저하 → 롤백

관리 대상: - 모델 아티팩트 (가중치, 설정) - 메타데이터 (학습 데이터 버전, 하이퍼파라미터, 메트릭) - 계보(lineage): 어떤 데이터/코드로 만들어졌는지

도구: MLflow Model Registry, SageMaker Model Registry

5. 인프라 패턴

패턴 설명 도구
Feature Store Offline/online 특성 일관성 Feast, Tecton
Model Store 모델 바이너리 + 메타데이터 관리 MLflow, S3
Orchestration 파이프라인 스케줄링/실행 Airflow, Kubeflow, Prefect
Containerization 환경 재현성 보장 Docker, Kubernetes

6. MLOps 성숙도 모델 (Google)

레벨 이름 특징 자동화 수준
0 수동 ML 스크립트 기반, 수동 배포, 모니터링 없음 없음
1 ML 파이프라인 자동화 지속적 학습, 자동 재학습 트리거 학습 자동화
2 CI/CD 파이프라인 코드+데이터+모델 전체 자동화, 자동 테스트 전체 자동화
graph LR
    L0["Level 0<br>수동 ML"] -->|"파이프라인 구축"| L1["Level 1<br>ML 파이프라인<br>자동화"]
    L1 -->|"CI/CD 추가"| L2["Level 2<br>CI/CD<br>파이프라인"]

    L0 -.- D0["Jupyter로 실험<br>수동 배포"]
    L1 -.- D1["자동 재학습<br>모니터링"]
    L2 -.- D2["자동 테스트/검증<br>자동 배포/롤백"]

상세 내용

MLOps 전체 아키텍처

graph TD
    subgraph "소스"
        CODE["코드 (Git)"]
        DATA["데이터 (DVC)"]
    end

    subgraph "CI/CD"
        TEST["코드 테스트"]
        DVAL["데이터 검증"]
        MVAL["모델 검증"]
    end

    subgraph "학습"
        ORCH["오케스트레이션<br>(Airflow)"]
        TRAIN["학습<br>(GPU 클러스터)"]
        EXP["실험 추적<br>(MLflow)"]
    end

    subgraph "배포"
        REG["Model Registry"]
        SERVE["서빙<br>(TorchServe)"]
        AB["A/B Router"]
    end

    subgraph "운영"
        MON["모니터링"]
        DRIFT["드리프트 탐지"]
        RETRAIN["재학습 트리거"]
    end

    CODE --> TEST
    DATA --> DVAL
    TEST & DVAL --> ORCH
    ORCH --> TRAIN
    TRAIN --> EXP
    TRAIN --> MVAL
    MVAL --> REG
    REG --> SERVE
    SERVE --> AB
    AB --> MON
    MON --> DRIFT
    DRIFT --> RETRAIN
    RETRAIN --> ORCH

실무 권장 사항

단계적 도입: 1. 시작: 실험 추적(MLflow/W&B) + Git 2. 다음: 자동화된 학습 파이프라인 + 데이터 검증 3. 이후: 모델 모니터링 + 자동 재학습 4. 성숙: 전체 CI/CD + A/B Testing + Feature Store


언제 사용하는가

상황 MLOps 수준
개인 연구/PoC Level 0 (수동) + 실험 추적
소규모 팀, 단일 모델 Level 1 (파이프라인 자동화)
대규모 팀, 다수 모델 Level 2 (전체 CI/CD)
규제 산업 (금융, 의료) Level 2 + 감사 추적
빈번한 데이터/모델 업데이트 Level 1~2 (자동 재학습)

흔한 오해와 함정

  1. "MLOps는 대기업만 필요하다": 규모가 작아도 실험 추적과 기본적인 파이프라인은 초기부터 도입할 가치가 있다. 나중에 도입하면 기술 부채가 누적된다.

  2. "자동 재학습만 하면 된다": 재학습 시 데이터 품질 검증, 성능 임계값 확인, 편향 검사가 함께 자동화되어야 한다. 잘못된 데이터로 재학습하면 성능이 악화된다.

  3. "DevOps와 동일하다": ML 특유의 요소(데이터 버전, 모델 성능, 드리프트)를 추가로 관리해야 한다.

  4. "도구를 많이 쓸수록 좋다": 도구 스택이 복잡해지면 관리 부담이 늘어난다. 필요한 것부터 단계적으로 도입하라.

  5. "모니터링은 배포 후에 생각하면 된다": 모니터링은 설계 단계에서부터 고려해야 한다. 어떤 지표를 추적할지, 알림 기준은 무엇인지 미리 정의하라.


다른 주제와의 연결