데이터 엔지니어 · AI 엔지니어를 위한 핵심 요약
MLflow는 머신러닝 라이프사이클 전반을 관리하는 오픈소스 플랫폼입니다. Databricks에서 시작되었으며, 실험 추적, 재현 가능한 실행, 모델 패키징, 모델 레지스트리 기능을 통합 제공합니다.
파라미터, 메트릭, 아티팩트를 자동/수동 로깅. UI로 비교 및 검색.
코드와 환경을 재현 가능한 형태로 패키징. Docker, Conda 등 지원.
모델 버전 관리, 스테이징/프로덕션 승인 워크플로, 메타데이터 태깅.
MLflow는 언어/프레임워크에 중립적이며, Python, R, Java, REST API 등을 지원합니다.
ML 실험 관리 도구는 많지만, MLflow는 경량성 · 확장성 · 커뮤니티에서 강점을 보입니다. 아래는 주요 대안과의 비교입니다.
| 기능 | MLflow | Weights & Biases | Neptune | TensorBoard |
|---|---|---|---|---|
| 오픈소스 | ✅ Apache 2.0 | ❌ 부분 유료 | ❌ 유료 | ✅ Apache 2.0 |
| 온프레미스 | ✅ 완전 지원 | ❌ 클라우드 | ❌ 클라우드 | ✅ 로컬 |
| 모델 레지스트리 | ✅ 내장 | ❌ 별도 | ❌ 별도 | ❌ 없음 |
| 멀티 프레임워크 | ✅ PyTorch, TF, sklearn... | ✅ | ✅ | ❌ TF 중심 |
| 아티팩트 저장 | ✅ S3, GCS, HDFS, 로컬 | ✅ 자체 저장소 | ✅ 자체 저장소 | ❌ 제한적 |
💡 팁: 팀 단위로 비용 없이 시작하려면 MLflow가 가장 확장성 좋은 선택입니다. Kubernetes 위에 Tracking Server를 띄우고 PostgreSQL + S3로 구성하면 프로덕션에도 적합합니다.
MLflow는 네 가지 주요 컴포넌트로 구성됩니다. 아래 ASCII 다이어그램은 전체 아키텍처를 시각화합니다.
⚠️ 주의: Tracking Server를 원격 백엔드(PostgreSQL)와 연결하지 않으면 기본 SQLite를 사용하며, 동시 접속 시 문제가 발생할 수 있습니다. 프로덕션에서는 반드시 PostgreSQL 또는 MySQL을 사용하세요.
pip install mlflow
또는 추가 확장 포함:
pip install mlflow[extras]
# 기본 SQLite 사용 (개발용)
mlflow ui --port 5000
# 원격 백엔드 + 아티팩트 (프로덕션 예시)
mlflow server \
--backend-store-uri postgresql://user:pass@host/mlflow \
--default-artifact-root s3://my-bucket/mlflow-artifacts \
--host 0.0.0.0 --port 5000
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("iris-classification")
with mlflow.start_run(run_name="rf-baseline"):
# 파라미터 로깅
mlflow.log_param("n_estimators", 100)
mlflow.log_param("max_depth", 5)
# 학습
X, y = load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = RandomForestClassifier(n_estimators=100, max_depth=5)
model.fit(X_train, y_train)
# 메트릭 로깅
acc = model.score(X_test, y_test)
mlflow.log_metric("accuracy", acc)
# 모델 저장 (자동으로 아티팩트에 저장)
mlflow.sklearn.log_model(model, "model")
# 태그
mlflow.set_tag("dataset", "iris")
mlflow.set_tag("model_type", "random_forest")
print("Run ID:", mlflow.active_run().info.run_id)
실행 후 http://localhost:5000에서 결과를 확인할 수 있습니다.
mlflow run . --experiment-name iris-cli -P n_estimators=200
MLproject 파일이 정의된 디렉토리에서 실행합니다.
자주 사용하는 환경 변수 및 설정값을 표로 정리했습니다.
| 설정 | 환경변수 / 파라미터 | 설명 | 예시 |
|---|---|---|---|
| Tracking URI | MLFLOW_TRACKING_URI | Tracking 서버 주소 | http://localhost:5000 |
| Experiment | MLFLOW_EXPERIMENT_NAME | 실험 이름 지정 | my-experiment |
| Artifact Root | MLFLOW_ARTIFACT_ROOT | 아티팩트 저장 위치 | s3://bucket/artifacts |
| 백엔드 저장소 | --backend-store-uri | 메타데이터 DB (PostgreSQL 등) | postgresql://user:pass@host/db |
| Autolog | mlflow.autolog() | 자동 로깅 활성화 | framework별 지원 (sklearn, pytorch 등) |
| Model Registry URI | MLFLOW_REGISTRY_URI | 레지스트리 백엔드 (기본 tracking URI) | databricks://workspace |
💡 팁: mlflow.autolog()를 학습 코드 시작 부분에 추가하면 파라미터, 메트릭, 모델이 자동으로 로깅됩니다. 초보자에게 매우 편리합니다.
| 문제 | 원인 | 해결 |
|---|---|---|
| Run이 UI에 보이지 않음 | tracking_uri가 서버와 일치하지 않음 |
mlflow.set_tracking_uri()로 명시적 지정 |
| Artifact 업로드 실패 | S3 권한 또는 엔드포인트 설정 누락 | MLFLOW_S3_ENDPOINT_URL 환경변수 설정 (MinIO 등) |
| 동시성 문제 (SQLite locked) | 기본 SQLite는 동시 쓰기 불가 | PostgreSQL 또는 MySQL로 전환 |
| 모델 배포 시 flavor 오류 | 모델 저장 시 사용한 라이브러리 버전 불일치 | conda.yaml에 정확한 의존성 명시 |
| Autolog이 일부 메트릭을 누락 | 특정 프레임워크 버전 지원 범위 확인 | 수동 로깅으로 대체하거나 mlflow.autolog(log_models=False) 후 직접 로깅 |
mlflow.sklearn.log_model(..., signature=signature)로 입력/출력 스키마를 정의하면 배포 시 타입 검증에 유용합니다.mlflow.register_model() + REST API로 Production stage 전환을 자동화하세요.mlflow.start_run(nested=True)로 부모-자식 Run 관계를 만들어 실험을 체계적으로 관리하세요.📚 추가 학습: Databricks의 “MLflow: The Missing Guide” 시리즈와 공식 예제 노트북을 추천합니다.