"MLOps가 뭐죠?"
"ML 실험을 어떻게 체계적으로 관리하나요?"
"Docker, Airflow, MLflow를 왜 써야 하나요?"
이번 팀 프로젝트에서는 이런 질문들에 대해 직접 구성하고 경험하며 답을 찾는 여정이었습니다.
저희 팀은 질병 예측을 주제로, Docker 기반 MLOps 환경을 구성하고, 데이터 전처리부터 모델 서빙까지의 전체 워크플로우를 자동화하는 것을 목표로 삼았습니다.
주제 : 증상 데이터를 활용한 질병 예측 모델 개발 및 MLOps 파이프라인 구축
사용 데이터 : Kaggle - Disease Prediction Using Machine Learning
팀원 구성 : 총 5인 (역할 분담: Airflow, MLflow, 모델링, 서빙, 발표)
프로젝트 기간 : 약 1주일
목표 :
각자의 로컬 환경(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/
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")
🔎 문제 상황: signature 없이 모델 저장 시 예측 시 오류
✅ 해결: mlflow.sklearn.log_model(..., signature=signature)로 명시적 지정
Airflow DAG을 활용해 다음의 전체 파이프라인을 자동화했습니다.
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 등)
Insight
데이터가 다소 정제되어 있어 성능이 과대평가될 수 있음 → 추후 외부 증상 데이터와 결합 필요
원인: DAG 파일에 잘못된 import 경로 존재
해결: airflow dags list로 DAG 등록 상태 확인 → 파일 위치 및 경로 수정
원인: Docker 네트워크상 내부 호스트명이 localhost로 설정됨
해결: MLFLOW_TRACKING_URI=http://mlflow:5000으로 변경 후 정상 연결
🧪 GitHub Repository : (비공개 링크)
🧠 참고 자료:
MLflow 공식 문서
Airflow Tutorial (Apache)
Kaggle Dataset - Disease Prediction
이번 MLOps 프로젝트는 단순한 모델링을 넘어, 실험의 반복성과 자동화의 중요성을 직접 체감할 수 있는 경험이었습니다.
머신러닝을 단순히 "잘 맞추는 것"에서 벗어나, 어떻게 관리하고 서비스화할 수 있는가에 대한 고민을 시작할 수 있었던 소중한 계기였습니다.