본문 바로가기
C.W.K.
Stream
Lesson 06 of 06 · published

MLOps: 실험 추적, 버전 관리, 관측

~12 min · mlops, wandb, mlflow, monitoring

Level 0텐서 탐구자
0 XP0/62 lessons0/13 achievements
0/120 XP to next level120 XP to go0% complete

운영 환경에서 모델을 살아 있게 하는 기반

모델을 내보내 배포한 뒤 그대로 두면 현실 데이터가 바뀌면서 성능이 조용히 떨어져. MLOps는 머신러닝 모델을 다른 운영 시스템처럼 버전 관리하고 관측하며, 데이터가 변했을 때 재학습하는 실무야.

MLOps의 네 가지 기둥

  1. 실험 추적: 모든 실행의 하이퍼파라미터, 평가지표, 결과물을 기록해. Weights & Biases, MLflow, Comet이 널리 쓰여.
  2. 모델 버전 관리: 모델, 학습 데이터, 코드, 실행 환경을 함께 보존해. Git LFS, DVC, MLflow 모델 등록소나 매니페스트를 곁들인 객체 저장소를 사용할 수 있어.
  3. 운영 환경 관측: 지연 시간, 처리량, 오류율과 함께 예측 분포와 입력 분포 같은 모델 동작을 추적해 변화를 감지해.
  4. 재학습 조건: 관측 신호가 성능 저하를 가리키면 자동으로 재학습하는 파이프라인을 만들어.

최소한으로 실용적인 구성

개인 프로젝트에 Kubernetes로 관리하는 Kubeflow까지 필요하지는 않아. 다음이면 충분해:

  • Weights & Biases나 MLflow 같은 실험 추적 도구 하나. 하나를 골라 일관되게 사용해.
  • 날짜, 데이터셋 버전, 평가지표를 담은 매니페스트와 함께 저장한 모델 파일.
  • 입력과 출력을 표본으로 남기는 운영 기록. 모든 요청을 기록하지는 마.
  • 운영 예측 분포를 학습 분포와 비교하고 변화가 생기면 경고하는 주간 스크립트.

이 정도면 충분해. 대기업용 MLOps 묶음은 더 많은 기능을 제공하지만 1~3명 팀에는 지나칠 수 있어. 단순하게 시작하고 필요할 때만 기능을 더해.

Code

Weights & Biases: 인기 추적 도구·python
# pip install wandb
import wandb

wandb.init(project="pytorch-quest", config={
    "lr": 1e-3,
    "epochs": 50,
    "batch_size": 32,
    "architecture": "ResNet50",
})

for epoch in range(50):
    train_loss = train_one_epoch(...)
    val_loss, val_acc = evaluate(...)

    wandb.log({
        "epoch": epoch,
        "train_loss": train_loss,
        "val_loss": val_loss,
        "val_accuracy": val_acc,
        "learning_rate": optimizer.param_groups[0]['lr'],
    })

wandb.save("best_model.pth")    # ship the model artifact too
wandb.finish()
MLflow: 오픈 소스 대안·python
# pip install mlflow
import mlflow

mlflow.set_experiment("pytorch-quest")

with mlflow.start_run():
    mlflow.log_params({
        "lr": 1e-3,
        "epochs": 50,
        "model": "ResNet50",
    })

    for epoch in range(50):
        train_loss = train_one_epoch(...)
        mlflow.log_metric("train_loss", train_loss, step=epoch)

    mlflow.pytorch.log_model(model, "model")
    # mlflow ui  → http://127.0.0.1:5000 to browse runs
운영 환경 관찰: 표본으로 뽑은 요청 기록·python
import json
import random
import time
from pathlib import Path

LOG_DIR = Path("/var/log/pippa-pred")
LOG_DIR.mkdir(parents=True, exist_ok=True)

def log_prediction(input_data, prediction, sample_rate=0.01):
    """Log roughly 1% of predictions for offline analysis."""
    if random.random() > sample_rate:
        return
    record = {
        'ts': time.time(),
        'input_summary': summarize_input(input_data),     # avoid logging raw inputs if PII
        'prediction': prediction,
    }
    fname = LOG_DIR / f"{time.strftime('%Y%m%d')}.jsonl"
    with open(fname, 'a') as f:
        f.write(json.dumps(record) + '\n')

# In your serving code:
# log_prediction(req, response.dict())
CI/CD 모양: GitHub Actions 예·yaml
# .github/workflows/ml-pipeline.yml
name: ML Pipeline

on:
  push:
    branches: [main]
  schedule:
    - cron: '0 6 * * 0'       # weekly retrain on Sundays

jobs:
  train-evaluate-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.12'
      - name: Install
        run: pip install -r requirements.txt
      - name: Tests
        run: pytest tests/
      - name: Train
        run: python train.py --config config.yaml
      - name: Evaluate
        run: python evaluate.py --threshold 0.90
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: model
          path: outputs/model.pt

External links

Exercise

Weights & Biases나 MLflow 중 하나를 골라 직접 작성한 학습 스크립트에 붙여 봐. 학습률 세 가지로 탐색을 실행하고 결과 대시보드를 확인해. 실행 결과를 시각적으로 비교하면 콘솔 출력을 계속 스크롤하는 것보다 훨씬 읽기 쉬워. 이 습관만으로도 5분의 설정 시간을 들일 가치가 있어.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.