Level 9: 종합 프로젝트
🏆

Level 9

MLOps 기초

버전 관리, CI/CD, 모니터링, A/B 테스트

60분
MLOps 기초 강의 영상
강의 영상 보기 (새 탭에서 재생)YouTube

📓Google Colab에서 실습하기

이 레슨은 PyTorch/GPU가 필요합니다. 노트북을 다운로드 후 Google Colab에서 열어주세요.

학습 내용

MLOps 기초

학습 목표

  • MLOps의 개념과 필요성을 이해한다
  • 모델과 데이터의 버전 관리 방법을 배운다
  • CI/CD 파이프라인으로 자동 배포를 구성한다
  • 운영 중인 모델의 모니터링과 A/B 테스트를 이해한다

MLOps란 무엇인가?

비유: 요리사가 한 번 맛있는 요리를 만드는 것은 어렵지 않습니다. 하지만 매일 수백 인분을 동일한 품질로 만들려면? 재료 관리, 조리 매뉴얼, 품질 검사, 위생 관리가 필요합니다. MLOps는 AI 모델의 "프랜차이즈 운영 매뉴얼"입니다.

MLOps = Machine Learning + Operations (DevOps)

모델을 한 번 만들고 끝이 아닙니다. 데이터가 바뀌고, 모델도 업데이트해야 합니다. 이 전체 과정을 체계적으로 관리하는 것이 MLOps입니다.

전통적 소프트웨어 vs ML 시스템

항목전통 소프트웨어ML 시스템
입력코드코드 + 데이터 + 모델
테스트단위/통합 테스트+ 모델 성능 테스트
배포코드 배포모델 + 코드 배포
모니터링에러/응답시간+ 예측 품질 모니터링
업데이트코드 수정재학습 (데이터 변경에 따라)

버전 관리

코드 버전 관리: Git

코드는 Git으로 관리합니다. 이건 소프트웨어 개발의 기본입니다. 그런데 ML 프로젝트에서는 코드 외에 모델과 데이터도 관리해야 합니다.

모델 버전 관리

비유: 요리 레시피(코드)와 완성된 요리(모델)를 따로 관리해야 합니다. Git에는 코드(레시피)만, 모델(요리)은 별도 저장소에 보관합니다.

모델 파일은 보통 수백 MB에서 수 GB로, Git에 직접 넣기엔 너무 큽니다. 전용 도구를 사용합니다.

도구특징적합한 경우
MLflow실험 추적 + 모델 레지스트리팀 단위 프로젝트
DVCGit-like 데이터/모델 버전 관리Git 기반 워크플로우
W&B (Weights & Biases)실험 시각화 + 추적연구/실험 중심
직접 관리S3 + 명명 규칙소규모 프로젝트

실험 추적 예시

python
import mlflow # 실험 시작 mlflow.set_experiment("plate-recognition") with mlflow.start_run(run_name="yolov8n-epoch100"): # 하이퍼파라미터 기록 mlflow.log_param("model", "yolov8n") mlflow.log_param("epochs", 100) mlflow.log_param("batch_size", 16) mlflow.log_param("lr", 0.01) # 학습 수행 results = model.train(data="dataset.yaml", epochs=100) # 결과 기록 mlflow.log_metric("mAP50", results.box.map50) mlflow.log_metric("mAP50-95", results.box.map) mlflow.log_metric("precision", results.box.mp) # 모델 저장 mlflow.log_artifact("runs/detect/train/weights/best.pt")

데이터 버전 관리

데이터가 바뀌면 모델 성능도 바뀝니다. 어떤 데이터로 학습한 모델인지 추적해야 합니다.

bash
# DVC로 데이터 버전 관리 dvc init dvc add data/plates/ git add data/plates.dvc .gitignore git commit -m "Add plate dataset v1" # 데이터 업데이트 시 (새 이미지 500장 추가 후) dvc add data/plates/ git add data/plates.dvc git commit -m "Update dataset v2: +500 night images"

CI/CD 파이프라인

CI/CD란?

비유: 공장의 자동화 생산 라인을 생각해보세요. 원재료(코드)가 들어오면 자동으로 검사하고, 문제가 없으면 포장(빌드)하고, 매장(서버)에 배송(배포)합니다.

  • CI (Continuous Integration): 코드가 바뀔 때마다 자동으로 테스트
  • CD (Continuous Deployment): 테스트 통과하면 자동으로 배포

ML 프로젝트의 CI/CD

yaml
# .github/workflows/ml-pipeline.yml (GitHub Actions 예시) name: ML Pipeline on: push: branches: [main] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Install dependencies run: pip install -r requirements.txt - name: Run unit tests run: pytest tests/ -v evaluate: needs: test runs-on: ubuntu-latest steps: - name: Run evaluation run: python src/evaluate.py --config configs/eval.yaml - name: Check performance threshold run: | python -c " import json with open('results.json') as f: r = json.load(f) assert r['mAP50'] > 0.90, 'mAP50 too low' assert r['f1_score'] > 0.95, 'F1 too low' print('Performance check passed') " deploy: needs: evaluate runs-on: ubuntu-latest steps: - name: Build Docker image run: docker build -t plate-api:latest . - name: Deploy to server run: kubectl rollout restart deployment plate-api

핵심 포인트

일반 소프트웨어의 CI/CD와 다른 점이 있습니다.

단계일반 소프트웨어ML 시스템
테스트코드 테스트만+ 모델 성능 테스트
빌드코드 빌드+ 모델 패키징
배포 조건테스트 통과+ 성능 임계값 통과
롤백이전 코드이전 코드 + 이전 모델

모니터링

왜 모니터링이 필요한가?

비유: 자동차를 운전할 때 계기판을 보지 않으면 안 됩니다. 연료가 떨어지는지, 엔진에 문제가 있는지 실시간으로 확인해야 합니다.

배포된 모델도 마찬가지입니다. 시간이 지나면서 성능이 떨어질 수 있습니다. 이를 **모델 드리프트(drift)**라고 합니다.

모니터링 지표 시각화

python
import numpy as np import matplotlib.pyplot as plt # 시뮬레이션: 시간에 따른 모델 성능 변화 np.random.seed(42) weeks = np.arange(1, 25) # 정확도: 처음엔 높지만 점차 하락 (데이터 드리프트) base_accuracy = 0.95 drift = np.cumsum(np.random.normal(-0.003, 0.005, len(weeks))) accuracy = np.clip(base_accuracy + drift, 0.5, 1.0) # 응답 시간: 점차 느려짐 (모델 부하 증가) base_latency = 25 latency = base_latency + np.cumsum(np.random.normal(0.5, 0.3, len(weeks))) fig, axes = plt.subplots(1, 2, figsize=(14, 5)) # 정확도 추이 axes[0].plot(weeks, accuracy, "b-o", markersize=4) axes[0].axhline(y=0.85, color="r", linestyle="--", label="Threshold (85%)") axes[0].set_xlabel("Week", fontsize=12) axes[0].set_ylabel("Accuracy", fontsize=12) axes[0].set_title("Model Accuracy Over Time", fontsize=13) axes[0].legend() axes[0].grid(True, alpha=0.3) axes[0].set_ylim(0.7, 1.0) # 응답 시간 추이 axes[1].plot(weeks, latency, "r-o", markersize=4) axes[1].axhline(y=50, color="orange", linestyle="--", label="SLA (50ms)") axes[1].set_xlabel("Week", fontsize=12) axes[1].set_ylabel("Latency (ms)", fontsize=12) axes[1].set_title("Response Latency Over Time", fontsize=13) axes[1].legend() axes[1].grid(True, alpha=0.3) plt.tight_layout() plt.show() print("Accuracy drops over time = Model Drift") print("When accuracy falls below threshold -> Retrain needed")

모니터링 대시보드 구성

지표측정 방법알림 조건
요청 수시간당 API 호출 수비정상 급증/급감
응답 시간요청-응답 지연50ms 초과
에러율실패 응답 비율1% 초과
예측 분포인식 결과 통계특정 문자 비율 이상
신뢰도 분포모델 확신도 평균평균 0.7 미만

A/B 테스트

A/B 테스트란?

비유: 식당에서 새 메뉴를 출시할 때, 전체 교체 대신 일부 테이블에만 먼저 제공해서 반응을 보는 것입니다.

새 모델을 바로 전체 교체하면 위험합니다. 트래픽의 일부만 새 모델로 보내서 성능을 비교합니다.

python
# A/B 테스트 라우터 (간단 버전) import random class ModelRouter: def __init__(self, model_a, model_b, b_ratio=0.1): self.model_a = model_a # 현재 모델 (90%) self.model_b = model_b # 새 모델 (10%) self.b_ratio = b_ratio def predict(self, image): if random.random() < self.b_ratio: result = self.model_b.recognize(image) result["model_version"] = "B" else: result = self.model_a.recognize(image) result["model_version"] = "A" return result

A/B 테스트 결과 분석

python
import numpy as np import matplotlib.pyplot as plt # 시뮬레이션: A/B 테스트 결과 np.random.seed(42) # 모델 A (기존): 93% 정확도 model_a_results = np.random.binomial(1, 0.93, size=1000) # 모델 B (신규): 95% 정확도 model_b_results = np.random.binomial(1, 0.95, size=100) acc_a = model_a_results.mean() acc_b = model_b_results.mean() fig, ax = plt.subplots(figsize=(8, 5)) bars = ax.bar(["Model A (current)", "Model B (candidate)"], [acc_a, acc_b], color=["#3498db", "#2ecc71"], edgecolor="black", linewidth=0.5, width=0.5) for bar, acc in zip(bars, [acc_a, acc_b]): ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.005, f"{acc:.1%}", ha="center", va="bottom", fontsize=14, fontweight="bold") ax.set_ylabel("Accuracy", fontsize=12) ax.set_title("A/B Test Results", fontsize=14) ax.set_ylim(0.85, 1.0) ax.grid(axis="y", alpha=0.3) plt.tight_layout() plt.show() diff = acc_b - acc_a print(f"Model A accuracy: {acc_a:.1%} (n={len(model_a_results)})") print(f"Model B accuracy: {acc_b:.1%} (n={len(model_b_results)})") print(f"Difference: {diff:+.1%}") print() if diff > 0.01: print("Model B shows improvement -> Consider full deployment") else: print("Difference too small -> Need more data or keep Model A")

MLOps 성숙도 모델

모든 프로젝트가 처음부터 완벽한 MLOps를 갖출 필요는 없습니다. 단계적으로 성숙도를 높여가면 됩니다.

단계특징목표
Level 0수동 학습, 수동 배포일단 동작하게 만들기
Level 1자동 학습, 수동 배포재학습 자동화
Level 2자동 학습, 자동 배포, CI/CD완전 자동 파이프라인
Level 3+ 모니터링, A/B 테스트, 자동 롤백안정적 운영

우리가 이 레슨에서 배운 것은 Level 1에서 Level 2로 가는 과정입니다. 실제 현업에서는 대부분 Level 1에서 2 사이에 있으며, Level 3을 갖춘 조직은 많지 않습니다.


핵심 정리

  1. MLOps: ML 모델의 개발-배포-운영 전 과정을 체계화하는 방법론
  2. 버전 관리: 코드(Git), 모델(MLflow/DVC), 데이터(DVC)를 모두 추적
  3. CI/CD: 코드 변경 시 자동 테스트 + 성능 검증 + 배포
  4. 모니터링: 정확도 드리프트, 응답 시간, 에러율을 실시간 추적
  5. A/B 테스트: 새 모델을 일부 트래픽에만 적용하여 안전하게 검증

레슨 정보

레벨
Level 9: 종합 프로젝트
예상 소요 시간
60분
참고 영상
YouTube 링크

💡실습 환경 안내

이 레벨은 PyTorch/GPU가 필요하여 Google Colab 사용을 권장합니다.

Colab은 무료 GPU를 제공하여 PyTorch, CNN, Transformer 등을 실행할 수 있습니다.