AI

オープンソースMLOpsプラットフォーム比較:MLflow vs Kubeflow vs DVC でMLパイプラインを管理する

オープンソースラボ編集部2026年6月13日

オープンソースMLOpsプラットフォーム比較:MLflow vs Kubeflow vs DVC でMLパイプラインを管理する

機械学習モデルを本番環境で運用する「MLOps」は、現代のAI開発において必須のプラクティスです。MLflow・Kubeflow・DVCはオープンソースでMLOpsパイプラインを構築する代表的なツールです。モデルの実験管理からデプロイまでの流れを整備しましょう。

MLOpsが解決する問題

  • 再現性: 同じデータ・コード・パラメータで同じ結果が出ない
  • 実験追跡: 100回の試行のうちどれが最良かわからない
  • モデル管理: どのモデルが本番で動いているか把握できない
  • デプロイパイプライン: Jupyterのコードを本番化する手順が属人化している

主要ツールの概要

MLflow

実験管理・モデルレジストリ・デプロイの統合プラットフォームです。Databricksが開発しパイプラインの標準として広く採用されています。

import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_breast_cancer

mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("breast-cancer-classification")

data = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(
    data.data, data.target, test_size=0.2, random_state=42
)

# 実験を記録
with mlflow.start_run(run_name="random-forest-v1"):
    n_estimators = 100
    max_depth = 5

    mlflow.log_params({
        "n_estimators": n_estimators,
        "max_depth": max_depth,
        "random_state": 42,
    })

    model = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth)
    model.fit(X_train, y_train)

    accuracy = model.score(X_test, y_test)
    mlflow.log_metric("accuracy", accuracy)
    mlflow.log_metric("train_accuracy", model.score(X_train, y_train))

    mlflow.sklearn.log_model(
        model,
        "model",
        registered_model_name="BreastCancerClassifier",
    )
    print(f"Accuracy: {accuracy:.4f}")

DVC(Data Version Control)

Gitの概念をデータとMLパイプラインに適用したツールです。大容量データファイル・実験結果・モデルファイルをGitと連携して管理します。

# DVCのセットアップ
pip install dvc dvc-s3
git init ml-project && cd ml-project
dvc init

# データをリモートストレージで管理
dvc remote add -d myremote s3://my-bucket/dvc-storage

# データファイルを追跡(Gitは管理しない)
dvc add data/raw/dataset.csv
git add data/raw/.gitignore data/raw/dataset.csv.dvc

# パイプラインを定義
cat > dvc.yaml << 'PIPELINE'
stages:
  preprocess:
    cmd: python src/preprocess.py
    deps:
      - data/raw/dataset.csv
      - src/preprocess.py
    outs:
      - data/processed/train.csv
      - data/processed/test.csv
  train:
    cmd: python src/train.py
    deps:
      - data/processed/train.csv
      - src/train.py
    params:
      - params.yaml:
          - model.n_estimators
          - model.max_depth
    outs:
      - models/model.pkl
    metrics:
      - metrics/scores.json:
          cache: false
PIPELINE

# パイプラインを実行
dvc repro

# 実験を比較
dvc exp show

Kubeflow

KubernetesネイティブのエンドツーエンドMLプラットフォームです。データ処理・モデル訓練・ハイパーパラメータ探索・サービング・パイプラインオーケストレーションを統合しています。

import kfp
from kfp import dsl
from kfp.components import func_to_container_op

def preprocess(data_path: str, output_path: str):
    import pandas as pd
    df = pd.read_csv(data_path)
    df.to_csv(output_path, index=False)

def train(data_path: str, model_path: str, n_estimators: int = 100):
    from sklearn.ensemble import RandomForestClassifier
    import pandas as pd
    import joblib

    df = pd.read_csv(data_path)
    X = df.drop("target", axis=1)
    y = df["target"]
    model = RandomForestClassifier(n_estimators=n_estimators)
    model.fit(X, y)
    joblib.dump(model, model_path)

preprocess_op = func_to_container_op(preprocess)
train_op = func_to_container_op(train)

@dsl.pipeline(name="ML Training Pipeline")
def ml_pipeline(data_path: str, n_estimators: int = 100):
    preprocess_task = preprocess_op(data_path, "/tmp/processed.csv")
    train_task = train_op(
        preprocess_task.output,
        "/tmp/model.pkl",
        n_estimators,
    )

client = kfp.Client(host="http://localhost:3000")
client.create_run_from_pipeline_func(ml_pipeline, arguments={"data_path": "/data/raw.csv"})

機能比較表

比較項目MLflowDVCKubeflow
ターゲット実験管理・モデルレジストリデータ・パイプライン管理K8sネイティブML
実験追跡✅ 高機能
データバージョン管理✅ 高機能⚠️
モデルレジストリ
パイプラインオーケストレーション⚠️✅ 高機能
Kubernetes統合✅ ネイティブ
ハイパーパラメータ探索✅ Katib
モデルサービング✅ KServe
UIダッシュボード
セルフホスト
設定の複雑さ
チームスケール中小小中大規模
ライセンスApache 2.0Apache 2.0Apache 2.0
GitHub Stars18k+13k+14k+

MLflow + DVCを組み合わせた実践パターン

最も一般的なMLOps構成は「DVC(データ管理)+ MLflow(実験管理)」の組み合わせです。

import mlflow
import dvc.api

with mlflow.start_run():
    # DVCが管理するデータを読み込む
    with dvc.api.open("data/processed/train.csv", remote="myremote") as f:
        df = pd.read_csv(f)

    mlflow.log_params({"data_version": "v2.1.0"})
    model.fit(df.drop("target", axis=1), df["target"])
    mlflow.sklearn.log_model(model, "model")

DevOpsパイプライン・CI/CDツールはDevOpsカテゴリ(/categories/devops)で一覧でき、LLM・AI特化のOpsツールはLLMツールカテゴリ(/categories/llm-tools)で探せます。

FAQ

Q. MLflowはどこに実験データを保存しますか?

A. デフォルトはローカルファイルシステム(mlruns/ディレクトリ)ですが、本番運用では --backend-store-uri postgresql://...でPostgreSQLに、--default-artifact-root s3://...でS3に保存します。Docker Composeでバックエンドを立ち上げてチームで共有するのが一般的です。

Q. DVCとGitの違いは何ですか?

A. Gitはコードの差分(テキスト)を管理しますが、大容量バイナリファイル(CSVデータ・モデルファイル)は扱えません。DVCはそのファイルをS3・GCS・Azureに保存し、.dvcメタファイルだけをGitに追加します。git checkout mainでコードを戻し、dvc checkoutで対応するデータを戻す、という二段階の管理が基本パターンです。

Q. KubeflowはGPUクラスターの管理も含みますか?

A. Kubeflow自体はGPUクラスターの管理ツールではありません。Kubernetesのノードにnvidia.com/gpuリソースを設定するのはクラスター管理者の責任で、KubeflowのPipeline/TrainingJobはそのリソースを要求して利用します。EKS・GKE・AKSなどマネージドKubernetesと組み合わせるのが一般的です。

Q. 小規模チームにはどのツールを勧めますか?

A. まずMLflowから始めることを推奨します。pip install mlflowで5分でセットアップでき、実験追跡のメリットをすぐ実感できます。データ管理が複雑になってきたらDVCを追加、チームが数十人規模になってKubernetesを使い始めたらKubeflowへの移行を検討するのが無理のないステップです。

Q. HuggingFaceのモデルをMLflowで管理できますか?

A. できます。mlflow.transformers.log_model()でHuggingFaceのモデルをMLflowに登録できます。またmlflow.pyfunc.log_model()でカスタムラッパーを書けば任意のフレームワークのモデルを登録できます。

まとめ

ユースケース推奨ツール
実験追跡・モデルレジストリMLflow
データバージョン管理DVC
K8sスケールMLパイプラインKubeflow
中小規模チームの標準構成MLflow + DVC

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。