Skip to content
Published on

MLflow 완전 정복: 실험 추적부터 모델 배포까지

Authors
  • Name
    Twitter

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-learnmlflow.sklearn.autolog()
XGBoostmlflow.xgboost.autolog()
LightGBMmlflow.lightgbm.autolog()
PyTorch (Lightning)mlflow.pytorch.autolog()
Keras / TensorFlowmlflow.tensorflow.autolog()
Transformersmlflow.transformers.autolog()
Spark MLlibmlflow.spark.autolog()
Statsmodelsmlflow.statsmodels.autolog()
CatBoostmlflow.catboost.autolog()
Prophetmlflow.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는 네 가지 실행 환경을 지원한다.

환경설명
Virtualenvpython_env.yaml 기반 Python 가상환경
Condaconda.yaml 기반 Conda 환경
DockerDockerfile 기반 컨테이너 환경
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를 거쳐 이동한다.

NoneStagingProductionArchived
# 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 공식 문서 및 관련 리소스 목록이다.