
📓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 | 실험 추적 + 모델 레지스트리 | 팀 단위 프로젝트 |
| DVC | Git-like 데이터/모델 버전 관리 | Git 기반 워크플로우 |
| W&B (Weights & Biases) | 실험 시각화 + 추적 | 연구/실험 중심 |
| 직접 관리 | S3 + 명명 규칙 | 소규모 프로젝트 |
실험 추적 예시
pythonimport 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)**라고 합니다.
모니터링 지표 시각화
pythonimport 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 테스트 결과 분석
pythonimport 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을 갖춘 조직은 많지 않습니다.
핵심 정리
- •MLOps: ML 모델의 개발-배포-운영 전 과정을 체계화하는 방법론
- •버전 관리: 코드(Git), 모델(MLflow/DVC), 데이터(DVC)를 모두 추적
- •CI/CD: 코드 변경 시 자동 테스트 + 성능 검증 + 배포
- •모니터링: 정확도 드리프트, 응답 시간, 에러율을 실시간 추적
- •A/B 테스트: 새 모델을 일부 트래픽에만 적용하여 안전하게 검증
레슨 정보
- 레벨
- Level 9: 종합 프로젝트
- 예상 소요 시간
- 60분
- 참고 영상
- YouTube 링크
💡실습 환경 안내
이 레벨은 PyTorch/GPU가 필요하여 Google Colab 사용을 권장합니다.
Colab은 무료 GPU를 제공하여 PyTorch, CNN, Transformer 등을 실행할 수 있습니다.