- Published on
MLflow 완전 정복: 실험 추적부터 모델 배포까지
- Authors
- Name
- 1. MLflow 개요와 설치
- 2. MLflow Tracking: 실험 로깅
- 3. Tracking Server 구축
- 4. Autologging 기능 분석
- 5. MLflow Projects: 재현 가능한 실험
- 6. MLflow Models: Flavor 개념과 Model Signature
- 7. Model Registry: 버전 관리와 Stage 전환
- 8. MLflow Deployments (구 MLflow AI Gateway)
- 9. MLflow Recipes (구 MLflow Pipelines)
- 10. MLflow와 다른 도구 연동
- 11. References
1. MLflow 개요와 설치
1.1 MLflow란 무엇인가
MLflow는 머신러닝 lifecycle 전체를 관리하기 위한 오픈소스 플랫폼이다. Databricks에서 시작된 이 프로젝트는 현재 Linux Foundation 산하에서 운영되며, 실험 추적(Experiment Tracking), 코드 패키징(Projects), 모델 관리(Models), 모델 레지스트리(Model Registry) 등 ML 워크플로우의 핵심 영역을 포괄한다.
MLflow가 해결하는 핵심 문제는 다음과 같다.
- 실험 재현성: 하이퍼파라미터, 메트릭, 코드 버전을 체계적으로 기록
- 모델 이식성: 다양한 ML 프레임워크의 모델을 표준 포맷으로 패키징
- 배포 단순화: REST API, Batch 추론, Docker 컨테이너 등 다양한 배포 방식 지원
- 팀 협업: 중앙 집중식 Tracking Server를 통한 실험 결과 공유
1.2 설치 방법
MLflow는 PyPI를 통해 간단하게 설치할 수 있다.
pip install mlflow
특정 ML 프레임워크와의 통합이 필요하다면 extras를 함께 설치한다.
# sklearn 연동 포함
pip install mlflow[sklearn]
# 전체 extras 설치
pip install mlflow[extras]
설치 후 MLflow UI를 실행하여 정상 동작을 확인한다.
mlflow server --port 5000
브라우저에서 http://localhost:5000에 접속하면 MLflow의 웹 UI를 확인할 수 있다.
1.3 기본 사용법 (QuickStart)
MLflow의 기본 워크플로우는 Experiment를 설정하고, Run을 시작하여 파라미터/메트릭/아티팩트를 기록하는 것이다.
import mlflow
# Experiment 설정
mlflow.set_experiment("MLflow Quickstart")
# Run 시작 및 로깅
with mlflow.start_run():
mlflow.log_param("learning_rate", 0.01)
mlflow.log_param("epochs", 100)
mlflow.log_metric("accuracy", 0.95)
mlflow.log_metric("loss", 0.05)
mlflow.set_tag("model_type", "classification")
위 코드를 실행하면 로컬의 mlruns 디렉토리에 실험 데이터가 저장되며, MLflow UI에서 결과를 시각적으로 확인할 수 있다.
2. MLflow Tracking: 실험 로깅
2.1 핵심 개념
MLflow Tracking은 ML 실험의 메타데이터를 기록하고 조회하는 시스템이다. 핵심 구성 요소는 다음과 같다.
- Runs: 데이터 사이언스 코드의 개별 실행 단위. 각 Run은 메트릭, 파라미터, 타임스탬프, 아티팩트 등의 메타데이터를 기록한다.
- Experiments: Run들의 논리적 그룹. 특정 태스크나 프로젝트 단위로 Run을 조직화한다.
- Models: Run 과정에서 생성된 학습 완료 모델. 자체적인 메타데이터와 아티팩트를 포함한다.
2.2 로깅 API 상세
mlflow.log_param() / mlflow.log_params()
하이퍼파라미터를 기록한다. 단일 값 또는 딕셔너리 형태로 다수의 파라미터를 한 번에 기록할 수 있다.
with mlflow.start_run():
# 단일 파라미터 기록
mlflow.log_param("learning_rate", 0.001)
mlflow.log_param("batch_size", 32)
# 다수 파라미터 한 번에 기록
params = {
"optimizer": "adam",
"dropout": 0.3,
"hidden_layers": 3,
"activation": "relu"
}
mlflow.log_params(params)
mlflow.log_metric() / mlflow.log_metrics()
학습 메트릭을 기록한다. step 파라미터를 사용하면 학습 과정에서의 메트릭 변화를 시계열로 추적할 수 있다.
with mlflow.start_run():
for epoch in range(100):
train_loss = train_one_epoch(model, train_loader)
val_loss = evaluate(model, val_loader)
# step별 메트릭 기록 (시계열 추적)
mlflow.log_metric("train_loss", train_loss, step=epoch)
mlflow.log_metric("val_loss", val_loss, step=epoch)
# 최종 메트릭 한 번에 기록
final_metrics = {"final_accuracy": 0.95, "final_f1": 0.93}
mlflow.log_metrics(final_metrics)
mlflow.log_artifact() / mlflow.log_artifacts()
파일 또는 디렉토리를 아티팩트로 저장한다. 모델 체크포인트, 시각화 이미지, 전처리 파이프라인 등 대용량 파일을 관리하는 데 적합하다.
import matplotlib.pyplot as plt
with mlflow.start_run():
# 학습 곡선 시각화 저장
plt.figure(figsize=(10, 6))
plt.plot(train_losses, label="Train Loss")
plt.plot(val_losses, label="Validation Loss")
plt.legend()
plt.savefig("learning_curve.png")
# 단일 파일 아티팩트 기록
mlflow.log_artifact("learning_curve.png", artifact_path="plots")
# 디렉토리 전체를 아티팩트로 기록
mlflow.log_artifacts("./output_dir", artifact_path="results")
mlflow.log_input()
학습에 사용된 Dataset을 Run과 연결하여 데이터 lineage를 추적할 수 있다.
import mlflow.data
from mlflow.data.pandas_dataset import PandasDataset
dataset = mlflow.data.from_pandas(df, source="s3://my-bucket/data.csv")
with mlflow.start_run():
mlflow.log_input(dataset, context="training")
2.3 실험 검색 및 비교
mlflow.search_runs()를 사용하면 SQL 유사 문법으로 Run을 검색하고 비교할 수 있다.
import mlflow
# 특정 조건으로 Run 검색
runs = mlflow.search_runs(
experiment_names=["MLflow Quickstart"],
filter_string="metrics.accuracy > 0.9 AND params.optimizer = 'adam'",
order_by=["metrics.accuracy DESC"]
)
print(runs[["params.optimizer", "metrics.accuracy"]])
3. Tracking Server 구축
3.1 아키텍처 개요
프로덕션 환경에서는 로컬 파일 시스템 대신 중앙 집중식 Tracking Server를 구축한다. Tracking Server는 두 가지 핵심 저장소로 구성된다.
- Backend Store: Run 메타데이터(파라미터, 메트릭, 태그, 타임스탬프)를 저장. SQLAlchemy 호환 데이터베이스(PostgreSQL, MySQL, SQLite 등)를 사용한다.
- Artifact Store: 대용량 아티팩트(모델 파일, 이미지, 데이터셋)를 저장. Amazon S3, Azure Blob Storage, Google Cloud Storage, SFTP, NFS 등을 지원한다.
3.2 Tracking Server 구성 시나리오
시나리오 1: 로컬 개발용 (기본)
별도의 설정 없이 mlruns 디렉토리에 모든 데이터를 저장한다.
mlflow server --port 5000
시나리오 2: DB Backend + 로컬 Artifact Store
메타데이터는 PostgreSQL에, 아티팩트는 로컬 파일 시스템에 저장한다.
mlflow server \
--backend-store-uri postgresql://user:password@localhost:5432/mlflow_db \
--default-artifact-root ./mlartifacts \
--port 5000
시나리오 3: 원격 Backend + 원격 Artifact Store (프로덕션 권장)
메타데이터는 PostgreSQL에, 아티팩트는 S3에 저장하며, Artifact Proxy를 통해 클라이언트가 직접 S3에 접근하지 않도록 한다.
mlflow server \
--backend-store-uri postgresql://user:password@db-host:5432/mlflow_db \
--artifacts-destination s3://my-mlflow-bucket/artifacts \
--port 5000
--artifacts-destination 플래그를 사용하면 Tracking Server가 아티팩트 접근의 Proxy 역할을 수행한다. 클라이언트는 S3 자격증명 없이 HTTP 요청만으로 아티팩트를 업로드/다운로드할 수 있다.
반대로 클라이언트가 직접 Artifact Store에 접근하도록 하려면 다음과 같이 설정한다.
mlflow server \
--backend-store-uri postgresql://user:password@db-host:5432/mlflow_db \
--default-artifact-root s3://my-mlflow-bucket/artifacts \
--no-serve-artifacts \
--port 5000
3.3 클라이언트 설정
Tracking Server가 구축되면 클라이언트에서 URI를 설정한다.
import mlflow
mlflow.set_tracking_uri("http://tracking-server-host:5000")
mlflow.set_experiment("my-experiment")
또는 환경 변수로 설정할 수도 있다.
export MLFLOW_TRACKING_URI=http://tracking-server-host:5000
4. Autologging 기능 분석
4.1 개요
Autologging은 명시적인 로깅 코드 없이 자동으로 파라미터, 메트릭, 모델을 기록하는 기능이다. 코드 한 줄 추가로 실험 추적이 가능해진다.
# 범용 autolog (설치된 모든 지원 라이브러리에 대해 활성화)
mlflow.autolog()
4.2 Scikit-learn Autologging
import mlflow
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
mlflow.sklearn.autolog()
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)
with mlflow.start_run():
clf = RandomForestClassifier(n_estimators=100, max_depth=5)
clf.fit(X_train, y_train)
# 자동 기록 항목:
# - Parameters: n_estimators, max_depth, criterion 등
# - Metrics: accuracy, precision, recall, f1-score
# - Artifacts: 학습된 모델, confusion matrix, feature importance
sklearn autologging은 fit() 호출 시 자동으로 모든 하이퍼파라미터, 학습 메트릭, 학습된 모델을 기록한다.
4.3 PyTorch Lightning Autologging
PyTorch Lightning과의 통합은 가장 완성도 높은 autologging을 제공한다. pytorch_lightning.LightningModule을 상속한 모델에 대해 전체 autologging이 지원된다.
import mlflow
import pytorch_lightning as pl
from torch.utils.data import DataLoader
mlflow.pytorch.autolog()
class MyModel(pl.LightningModule):
def __init__(self, lr=0.001):
super().__init__()
self.save_hyperparameters()
self.model = torch.nn.Linear(10, 2)
def training_step(self, batch, batch_idx):
x, y = batch
loss = torch.nn.functional.cross_entropy(self.model(x), y)
self.log("train_loss", loss)
return loss
def configure_optimizers(self):
return torch.optim.Adam(self.parameters(), lr=self.hparams.lr)
trainer = pl.Trainer(max_epochs=10)
trainer.fit(model, train_dataloader)
# 자동 기록 항목:
# - Optimizer 이름 및 learning rate
# - training loss, validation loss
# - 모델 체크포인트 및 아티팩트
4.4 Transformers Autologging
Hugging Face Transformers 라이브러리와의 통합도 지원한다.
import mlflow
from transformers import Trainer, TrainingArguments
mlflow.transformers.autolog()
training_args = TrainingArguments(
output_dir="./results",
num_train_epochs=3,
per_device_train_batch_size=16,
logging_steps=100,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
)
trainer.train()
# 자동 기록: 학습 메트릭, 모델, tokenizer, training arguments 등
4.5 지원 프레임워크 전체 목록
MLflow autologging이 지원하는 주요 프레임워크는 다음과 같다.
| 프레임워크 | 호출 방법 |
|---|---|
| Scikit-learn | mlflow.sklearn.autolog() |
| XGBoost | mlflow.xgboost.autolog() |
| LightGBM | mlflow.lightgbm.autolog() |
| PyTorch (Lightning) | mlflow.pytorch.autolog() |
| Keras / TensorFlow | mlflow.tensorflow.autolog() |
| Transformers | mlflow.transformers.autolog() |
| Spark MLlib | mlflow.spark.autolog() |
| Statsmodels | mlflow.statsmodels.autolog() |
| CatBoost | mlflow.catboost.autolog() |
| Prophet | mlflow.prophet.autolog() |
mlflow.autolog()를 호출하면 설치된 모든 지원 라이브러리에 대해 자동으로 autologging이 활성화된다.
5. MLflow Projects: 재현 가능한 실험
5.1 개요
MLflow Projects는 ML 코드를 재현 가능하고 이식 가능한 형태로 패키징하는 규격이다. 어떤 디렉토리든 MLproject 파일이 포함되어 있거나 .py / .sh 파일을 포함하고 있으면 MLflow Project로 실행할 수 있다.
5.2 MLproject 파일 구조
name: My ML Project
python_env: python_env.yaml
entry_points:
main:
parameters:
data_file: path
regularization: { type: float, default: 0.1 }
epochs: { type: int, default: 100 }
command: 'python train.py -r {regularization} -e {epochs} {data_file}'
validate:
parameters:
data_file: path
command: 'python validate.py {data_file}'
핵심 구성 요소
- name: 프로젝트의 사람이 읽을 수 있는 이름
- python_env / conda_env / docker_env: 실행 환경 정의
- entry_points: 실행 가능한 명령 정의. 각 entry point는 파라미터(타입, 기본값 포함)와 실행 커맨드를 포함한다.
5.3 지원 환경
MLflow Projects는 네 가지 실행 환경을 지원한다.
| 환경 | 설명 |
|---|---|
| Virtualenv | python_env.yaml 기반 Python 가상환경 |
| Conda | conda.yaml 기반 Conda 환경 |
| Docker | Dockerfile 기반 컨테이너 환경 |
| System | 현재 시스템 환경 그대로 사용 |
python_env.yaml 파일 예시:
python: '3.10'
build_dependencies:
- pip
dependencies:
- scikit-learn==1.3.0
- pandas==2.0.3
- mlflow
5.4 프로젝트 실행
CLI에서 실행
# 로컬 프로젝트 실행
mlflow run . -P regularization=0.5 -P data_file=data/train.csv
# Git URI에서 직접 실행
mlflow run https://github.com/mlflow/mlflow-example -P alpha=0.5
# 특정 entry point 실행
mlflow run . -e validate -P data_file=data/test.csv
Python API에서 실행
import mlflow
mlflow.projects.run(
uri="https://github.com/mlflow/mlflow-example",
entry_point="main",
parameters={"alpha": 0.5, "l1_ratio": 0.1}
)
Git URI를 직접 지정할 수 있으므로, 팀원 간 실험 코드를 Git 저장소 하나로 공유하고 동일한 환경에서 재현할 수 있다.
6. MLflow Models: Flavor 개념과 Model Signature
6.1 모델 패키징 표준
MLflow Models는 머신러닝 모델을 표준 포맷으로 패키징하는 규격이다. 이 표준을 따르면 REST API 서빙, Apache Spark 배치 추론 등 다양한 다운스트림 도구에서 모델을 활용할 수 있다.
6.2 Flavor 개념
Flavor는 MLflow Models의 핵심 혁신이다. Flavor는 모델이 해석되고 사용되는 방식을 정의한다. 각 ML 프레임워크별로 고유한 Flavor가 있으며, 배포 도구는 표준 Flavor를 인식하여 라이브러리별 커스텀 통합 없이 모델을 활용할 수 있다.
예를 들어 sklearn으로 학습한 모델은 sklearn flavor와 python_function flavor를 동시에 갖는다. 배포 도구는 python_function flavor를 통해 프레임워크에 독립적으로 추론을 수행할 수 있다.
저장된 모델의 디렉토리 구조
my_model/
├── MLmodel # 모델 메타데이터 (YAML)
├── model.pkl # 직렬화된 모델 파일
├── conda.yaml # Conda 환경 정의
├── python_env.yaml # Python 환경 정의
├── requirements.txt # pip 종속성
└── input_example.json # 입력 예시 (옵션)
MLmodel 파일 예시:
artifact_path: model
flavors:
python_function:
env: conda.yaml
loader_module: mlflow.sklearn
model_path: model.pkl
python_version: 3.10.12
sklearn:
code: null
pickled_model: model.pkl
serialization_format: cloudpickle
sklearn_version: 1.3.0
mlflow_version: 2.10.0
signature:
inputs: '[{"name": "feature_1", "type": "double"}, {"name": "feature_2", "type": "double"}]'
outputs: '[{"type": "long"}]'
6.3 Built-in Flavors
MLflow는 20개 이상의 built-in flavor를 제공한다.
- Traditional ML: scikit-learn, XGBoost, LightGBM, CatBoost, Spark MLlib, H2O, statsmodels, Prophet, pmdarima
- Deep Learning: Keras, PyTorch, TensorFlow, spaCy, Transformers, SentenceTransformers
- 범용: ONNX, Python Function (pyfunc)
6.4 Model Signature
Model Signature는 모델의 입력, 출력, 추가 추론 파라미터의 스키마를 정의한다. 이를 통해 모델 인터페이스가 표준화되고, 서빙 시 입력 데이터의 유효성 검증이 자동으로 수행된다.
from mlflow.models import infer_signature
import mlflow.sklearn
X_train, y_train = load_data()
model = train_model(X_train, y_train)
predictions = model.predict(X_train)
# Signature 자동 추론
signature = infer_signature(X_train, predictions)
with mlflow.start_run():
mlflow.sklearn.log_model(
sk_model=model,
artifact_path="model",
signature=signature,
input_example=X_train[:3]
)
6.5 Input Example
Input Example은 모델에 유효한 입력의 구체적 인스턴스를 제공한다. 이를 통해 모델 사용자가 입력 형식을 쉽게 이해하고 테스트할 수 있다. Input Example을 제공하면 Signature가 명시적으로 지정되지 않은 경우 자동으로 추론된다.
또한 Input Example이 제공되면 serving_input_example.json 파일이 자동 생성되어 서빙 시 페이로드 형식을 참고할 수 있다.
6.6 모델 로깅과 로딩
# 모델 로깅
with mlflow.start_run():
mlflow.sklearn.log_model(model, artifact_path="model")
# 모델 로딩 (프레임워크별)
loaded_model = mlflow.sklearn.load_model("runs:/<run_id>/model")
# 모델 로딩 (범용 pyfunc)
pyfunc_model = mlflow.pyfunc.load_model("runs:/<run_id>/model")
predictions = pyfunc_model.predict(X_test)
6.7 Models From Code
MLflow 2.12.2 이후 도입된 기능으로, Python 스크립트에서 직접 모델을 로깅할 수 있다. pickle 직렬화를 우회하여 보안 위험을 줄인다.
# model_code.py
import mlflow
class MyCustomModel(mlflow.pyfunc.PythonModel):
def predict(self, context, model_input):
return model_input * 2
mlflow.models.set_model(MyCustomModel())
7. Model Registry: 버전 관리와 Stage 전환
7.1 개요
MLflow Model Registry는 학습된 모델의 버전 관리, 메타데이터 관리, 배포 워크플로우를 위한 중앙 집중식 모델 저장소이다.
7.2 핵심 개념
- Registered Model: 고유한 이름으로 Registry에 등록된 모델. 여러 버전, 별칭(Alias), 태그, 메타데이터를 포함한다.
- Model Version: 동일한 Registered Model의 각 버전. 새 모델이 등록될 때마다 버전 번호가 자동 증가한다 (version 1, 2, 3, ...).
- Model URI:
models:/<model-name>/<model-version>형식으로 특정 모델 버전을 참조한다.
7.3 모델 등록 방법
방법 1: 로깅 시 등록
with mlflow.start_run():
mlflow.sklearn.log_model(
sk_model=model,
artifact_path="model",
registered_model_name="MyClassifier" # 등록과 동시에 로깅
)
방법 2: 기존 Run에서 등록
result = mlflow.register_model(
model_uri="runs:/<run_id>/model",
name="MyClassifier"
)
print(f"Version: {result.version}")
방법 3: UI에서 등록
MLflow 웹 UI에서 Run의 아티팩트를 선택하고 "Register Model" 버튼을 클릭하여 등록할 수 있다.
7.4 Model Aliases
Alias는 특정 모델 버전에 대한 변경 가능한(mutable) 이름 참조이다. 배포 코드에서 버전 번호 대신 Alias를 사용하면 코드 변경 없이 배포 모델을 전환할 수 있다.
from mlflow import MlflowClient
client = MlflowClient()
# Alias 설정
client.set_registered_model_alias(
name="MyClassifier",
alias="champion",
version=3
)
# Alias로 모델 로딩
model = mlflow.sklearn.load_model("models:/MyClassifier@champion")
champion alias를 version 3에서 version 5로 변경하면, 프로덕션 코드는 그대로 models:/MyClassifier@champion을 사용하면서 자동으로 새 버전의 모델을 로딩하게 된다.
7.5 Tags와 Annotations
태그는 모델을 분류하고 검색하는 데 사용하는 키-값 쌍이다.
client = MlflowClient()
# Registered Model 레벨 태그
client.set_registered_model_tag("MyClassifier", "task", "question-answering")
# Model Version 레벨 태그
client.set_model_version_tag("MyClassifier", version=3, key="validation_status", value="approved")
Annotations는 Markdown 형식의 상세 설명을 지원하여 모델의 방법론, 사용 데이터셋, 알고리즘 등을 문서화할 수 있다.
7.6 Stage 기반 워크플로우 (Legacy)
참고: MLflow 최신 버전에서는 Stage 대신 Alias 기반 워크플로우를 권장한다.
기존의 Stage 기반 워크플로우에서는 모델 버전이 다음 Stage를 거쳐 이동한다.
None → Staging → Production → Archived
# Stage 전환 (Legacy API)
client.transition_model_version_stage(
name="MyClassifier",
version=3,
stage="Production"
)
# Stage로 모델 로딩 (Legacy)
model = mlflow.sklearn.load_model("models:/MyClassifier/Production")
현재 권장되는 방식은 Alias를 활용하는 것이다. 예를 들어 champion, challenger 등의 alias를 정의하여 배포 워크플로우를 관리한다.
8. MLflow Deployments (구 MLflow AI Gateway)
8.1 개요
MLflow Deployments (이전 명칭: MLflow AI Gateway)는 조직 내에서 다수의 LLM 프로바이더를 통합 관리하기 위한 게이트웨이 서비스이다. 단일 보안 엔드포인트를 통해 OpenAI, Anthropic, Google Gemini, Amazon Bedrock, Azure OpenAI 등 다양한 프로바이더에 접근할 수 있다.
8.2 지원 프로바이더
- OpenAI (GPT-4, GPT-4o 등)
- Anthropic (Claude 시리즈)
- Google Gemini
- Amazon Bedrock
- Azure OpenAI
- Cohere
- MosaicML
- Databricks Foundation Models
- 커스텀 MLflow 모델 서빙 엔드포인트
8.3 Gateway 설정
YAML 형식의 설정 파일로 프로바이더와 엔드포인트를 정의한다.
endpoints:
- name: chat-gpt4
endpoint_type: llm/v1/chat
model:
provider: openai
name: gpt-4
config:
openai_api_key: $OPENAI_API_KEY
- name: chat-claude
endpoint_type: llm/v1/chat
model:
provider: anthropic
name: claude-3-opus-20240229
config:
anthropic_api_key: $ANTHROPIC_API_KEY
- name: embeddings
endpoint_type: llm/v1/embeddings
model:
provider: openai
name: text-embedding-3-small
config:
openai_api_key: $OPENAI_API_KEY
8.4 주요 기능
- Hot-reloading: 서버 재시작 없이 설정 파일 변경 사항을 자동 감지하여 반영
- API 키 보안: 환경 변수를 통한 API 키 관리로 설정 파일에 민감 정보 미포함
- 트래픽 라우팅: A/B 테스트를 위한 트래픽 분할 및 고가용성을 위한 자동 failover 체인 지원
- 통합 인터페이스: 프로바이더에 관계없이 동일한 API 형식으로 요청 가능
8.5 모델 서빙 (Traditional ML)
Traditional ML 모델의 배포는 mlflow models serve 명령으로 수행한다.
# 로컬 REST API 서버로 모델 서빙
mlflow models serve -m "models:/MyClassifier@champion" --port 8080
# Docker 이미지로 빌드
mlflow models build-docker -m "models:/MyClassifier@champion" -n my-model-image
# Docker 컨테이너 실행
docker run -p 8080:8080 my-model-image
서빙된 모델에 추론 요청을 보내는 방법:
curl -X POST http://localhost:8080/invocations \
-H "Content-Type: application/json" \
-d '{"inputs": [[1.0, 2.0, 3.0, 4.0]]}'
9. MLflow Recipes (구 MLflow Pipelines)
9.1 개요
MLflow Recipes (이전 명칭: MLflow Pipelines)는 데이터 사이언티스트가 고품질 모델을 빠르게 개발하고 프로덕션에 배포할 수 있도록 돕는 프레임워크이다. 사전 정의된 템플릿을 통해 데이터 수집, 피처 엔지니어링, 모델 학습/튜닝, 모델 패키징에 필요한 반복적인 보일러플레이트 코드를 제거한다.
9.2 핵심 개념
- Step: 개별 ML 작업 단위. 데이터 수집, 모델 학습, 모델 평가 등
- Recipe: Step들의 순서화된 조합으로, 하나의 ML 문제를 해결하는 파이프라인
- Template: 표준화된 레이아웃의 Git 저장소로, Recipe의 모든 커스터마이즈 가능한 코드와 설정을 포함
9.3 제공 템플릿
Regression Template
회귀 문제를 위한 표준 파이프라인을 제공한다.
Classification Template
분류 문제를 위한 표준 파이프라인을 제공한다.
두 템플릿 모두 다음과 같은 Step 순서를 따른다.
ingest → split → transform → train → evaluate → register
9.4 설정 구조
Recipe 설정은 recipe.yaml 파일과 Profile YAML 파일로 관리한다.
# recipe.yaml
recipe: 'regression/v1'
target_col: 'price'
positive_class: null
primary_metric: 'root_mean_squared_error'
steps:
ingest:
using: 'custom'
loader_method: load_data
split:
split_ratios: [0.75, 0.125, 0.125]
transform:
using: 'custom'
transformer_method: transformer_fn
train:
using: 'custom'
estimator_method: estimator_fn
evaluate:
validation_criteria:
- metric: root_mean_squared_error
threshold: 10
register:
model_name: 'my_regression_model'
9.5 실행 및 캐싱
from mlflow.recipes import Recipe
recipe = Recipe(profile="local")
# 전체 Recipe 실행
recipe.run()
# 특정 Step까지만 실행
recipe.run("train")
# Step 결과 확인
recipe.inspect("evaluate")
MLflow Recipes의 지능형 실행 엔진은 각 Step의 결과를 캐싱하고, 변경이 발생한 최소한의 Step만 재실행하여 개발 속도를 향상시킨다.
10. MLflow와 다른 도구 연동
10.1 MLflow + Apache Airflow
Airflow는 워크플로우 오케스트레이션 도구로, MLflow의 실험 추적과 결합하면 강력한 ML 파이프라인을 구축할 수 있다. Airflow가 워크플로우의 스케줄링과 오케스트레이션을 담당하고, MLflow가 실험 메트릭 로깅, 모델 버전 관리, 모델 라이프사이클 관리를 수행하는 역할 분담이 이루어진다.
# Airflow DAG에서 MLflow 활용 예시
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime
def train_model():
import mlflow
mlflow.set_tracking_uri("http://mlflow-server:5000")
with mlflow.start_run():
model = train()
mlflow.sklearn.log_model(model, "model", registered_model_name="MyModel")
def evaluate_model():
import mlflow
model = mlflow.sklearn.load_model("models:/MyModel/latest")
metrics = evaluate(model)
return metrics
dag = DAG("ml_pipeline", start_date=datetime(2026, 1, 1), schedule_interval="@daily")
train_task = PythonOperator(task_id="train", python_callable=train_model, dag=dag)
eval_task = PythonOperator(task_id="evaluate", python_callable=evaluate_model, dag=dag)
train_task >> eval_task
10.2 MLflow + Kubernetes
MLflow 모델을 Kubernetes 클러스터에 배포하면 자동 스케일링, 롤링 업데이트, 헬스 체크 등 Kubernetes의 인프라 기능을 활용할 수 있다.
Docker 이미지 빌드
mlflow models build-docker \
-m "models:/MyClassifier@champion" \
-n my-model-serving:v1 \
--enable-mlserver
Kubernetes Deployment 매니페스트
apiVersion: apps/v1
kind: Deployment
metadata:
name: ml-model-serving
spec:
replicas: 3
selector:
matchLabels:
app: ml-model
template:
metadata:
labels:
app: ml-model
spec:
containers:
- name: model
image: my-model-serving:v1
ports:
- containerPort: 8080
resources:
requests:
memory: '512Mi'
cpu: '500m'
limits:
memory: '1Gi'
cpu: '1000m'
---
apiVersion: v1
kind: Service
metadata:
name: ml-model-service
spec:
selector:
app: ml-model
ports:
- port: 80
targetPort: 8080
type: LoadBalancer
또한 KServe(구 KFServing)와 통합하여 보다 고급 서빙 기능(canary 배포, 트래픽 미러링 등)을 활용할 수도 있다.
10.3 MLflow + Docker
MLflow는 프로젝트 실행과 모델 서빙 양쪽에서 Docker를 지원한다.
프로젝트 실행: MLproject 파일에서 Docker 환경을 지정하면 컨테이너 내에서 재현 가능한 실행이 보장된다.
# MLproject
name: My Docker Project
docker_env:
image: my-ml-env:latest
volumes: ['/data:/data']
environment: [['MLFLOW_TRACKING_URI', 'http://mlflow-server:5000']]
entry_points:
main:
command: 'python train.py'
모델 서빙: mlflow models build-docker로 서빙 이미지를 빌드하고, 어떤 환경에서든 동일한 추론 서비스를 실행할 수 있다.
10.4 MLflow Tracking Server의 Docker Compose 배포
프로덕션 Tracking Server를 Docker Compose로 구성한 예시이다.
version: '3.8'
services:
mlflow:
image: ghcr.io/mlflow/mlflow:latest
command: >
mlflow server
--backend-store-uri postgresql://mlflow:password@postgres:5432/mlflow
--artifacts-destination s3://mlflow-artifacts/
--host 0.0.0.0
--port 5000
ports:
- '5000:5000'
environment:
- AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
depends_on:
- postgres
postgres:
image: postgres:15
environment:
POSTGRES_USER: mlflow
POSTGRES_PASSWORD: password
POSTGRES_DB: mlflow
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
11. References
본 포스팅에서 참고한 MLflow 공식 문서 및 관련 리소스 목록이다.
- MLflow 공식 사이트
- MLflow Tracking 공식 문서
- MLflow Tracking QuickStart
- MLflow Tracking Autologging
- MLflow Tracking Server
- MLflow Backend Stores
- MLflow Artifact Stores
- MLflow Models 공식 문서
- MLflow Model Registry 공식 문서
- MLflow Projects 공식 문서
- MLflow AI Gateway
- MLflow AI Gateway Configuration
- MLflow Recipes 공식 문서
- MLflow PyTorch Integration
- MLflow Deployment to Kubernetes
- MLflow Python API Reference
- MLflow GitHub Repository