MLOps 프로젝트 review..

진정·2025년 6월 10일

"MLOps가 뭐죠?"
"ML 실험을 어떻게 체계적으로 관리하나요?"
"Docker, Airflow, MLflow를 왜 써야 하나요?"

이번 팀 프로젝트에서는 이런 질문들에 대해 직접 구성하고 경험하며 답을 찾는 여정이었습니다.
저희 팀은 질병 예측을 주제로, Docker 기반 MLOps 환경을 구성하고, 데이터 전처리부터 모델 서빙까지의 전체 워크플로우를 자동화하는 것을 목표로 삼았습니다.


📌 프로젝트 개요

주제 : 증상 데이터를 활용한 질병 예측 모델 개발 및 MLOps 파이프라인 구축
사용 데이터 : Kaggle - Disease Prediction Using Machine Learning
팀원 구성 : 총 5인 (역할 분담: Airflow, MLflow, 모델링, 서빙, 발표)
프로젝트 기간 : 약 1주일
목표 :

  • 실험 관리: MLflow
  • 파이프라인 자동화: Airflow
  • 패키징 및 배포 준비: Docker, BentoML
  • 코드 협업: GitHub 활용

🔧 1. 환경 구성 (로컬 기반 MLOps 세팅)

🐳 Docker로 통합 개발환경 구성

각자의 로컬 환경(OS, 패키지 버전 등) 차이를 제거하기 위해 Docker 기반으로 다음 요소를 하나의 Compose 파일에 통합했습니다.

services:
  mlflow:
    image: mlflow:latest
    ports: ["5000:5000"]
    volumes: ["./mlruns:/mlflow/mlruns"]

  airflow:
    image: apache/airflow:2.7.0
    ports: ["8080:8080"]
    volumes: ["./dags:/opt/airflow/dags"]

  postgres:
    image: postgres:13
    ports: ["5432:5432"]

  minio:
    image: minio/minio
    ports: ["9000:9000"]

✅ 학습 환경: macOS, Python 3.11, VSCode + Docker Desktop
✅ 데이터 디렉토리/코드 정리: data/, notebooks/, src/, airflow/dags/


🧪 2. 실험 관리: MLflow 활용

with mlflow.start_run():
    mlflow.log_param("model", "RandomForest")
    mlflow.log_param("n_estimators", 100)
    mlflow.log_metric("accuracy", accuracy_score(y_test, y_pred))
    mlflow.sklearn.log_model(model, "model")
  • 실험별 성능(accuracy, recall, precision) 기록
  • 하이퍼파라미터 변화에 따른 성능 추적
  • 모델 버전 관리 (Signature 및 InputExample 포함)

🔎 문제 상황: signature 없이 모델 저장 시 예측 시 오류
✅ 해결: mlflow.sklearn.log_model(..., signature=signature)로 명시적 지정


🛠️ 3. 워크플로 자동화: Airflow DAG 설계

Airflow DAG을 활용해 다음의 전체 파이프라인을 자동화했습니다.

  • 데이터 수집 및 전처리
  • 모델 학습
  • 모델 평가 및 저장
  • MLflow 기록
with DAG(dag_id='disease_model_training', schedule_interval=None, ...) as dag:
    t1 = PythonOperator(task_id='load_data', python_callable=load_data)
    t2 = PythonOperator(task_id='preprocess', python_callable=preprocess_data)
    t3 = PythonOperator(task_id='train_model', python_callable=train_and_log_model)
    t1 >> t2 >> t3

✅ MLflow와 연결 시 docker-compose 내부 네트워크 이름으로 접근 필요 (e.g., http://mlflow:5000)
🔐 .env 파일로 설정값 관리 (MLFLOW_TRACKING_URI, DB_URI 등)


📊 4. 모델링 및 평가

  • 사용 모델: RandomForestClassifier, LogisticRegression, XGBoost
  • 평가 지표: Accuracy, F1 Score, Classification Report

Insight
데이터가 다소 정제되어 있어 성능이 과대평가될 수 있음 → 추후 외부 증상 데이터와 결합 필요


🧩 5. 협업과 문제 해결 경험

✔️ 문제 1: Airflow DAG 로드 실패

원인: DAG 파일에 잘못된 import 경로 존재
해결: airflow dags list로 DAG 등록 상태 확인 → 파일 위치 및 경로 수정

✔️ 문제 2: MLflow UI 접근 에러 (연결 불가)

원인: Docker 네트워크상 내부 호스트명이 localhost로 설정됨
해결: MLFLOW_TRACKING_URI=http://mlflow:5000으로 변경 후 정상 연결


📁 관련 자료

  • 🧪 GitHub Repository : (비공개 링크)

  • 🧠 참고 자료:
    MLflow 공식 문서
    Airflow Tutorial (Apache)
    Kaggle Dataset - Disease Prediction

✍️ 맺으며

이번 MLOps 프로젝트는 단순한 모델링을 넘어, 실험의 반복성과 자동화의 중요성을 직접 체감할 수 있는 경험이었습니다.
머신러닝을 단순히 "잘 맞추는 것"에서 벗어나, 어떻게 관리하고 서비스화할 수 있는가에 대한 고민을 시작할 수 있었던 소중한 계기였습니다.

0개의 댓글