オープンソース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"})
機能比較表
| 比較項目 | MLflow | DVC | Kubeflow |
|---|---|---|---|
| ターゲット | 実験管理・モデルレジストリ | データ・パイプライン管理 | K8sネイティブML |
| 実験追跡 | ✅ 高機能 | ✅ | ✅ |
| データバージョン管理 | ❌ | ✅ 高機能 | ⚠️ |
| モデルレジストリ | ✅ | ✅ | ✅ |
| パイプラインオーケストレーション | ⚠️ | ✅ | ✅ 高機能 |
| Kubernetes統合 | ✅ | ❌ | ✅ ネイティブ |
| ハイパーパラメータ探索 | ✅ | ✅ | ✅ Katib |
| モデルサービング | ✅ | ❌ | ✅ KServe |
| UIダッシュボード | ✅ | ✅ | ✅ |
| セルフホスト | ✅ | ✅ | ✅ |
| 設定の複雑さ | 低 | 低 | 高 |
| チームスケール | 中小 | 小中 | 大規模 |
| ライセンス | Apache 2.0 | Apache 2.0 | Apache 2.0 |
| GitHub Stars | 18k+ | 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 |