OSS MLプラットフォーム比較:MLflow vs Kubeflow vs DVC で機械学習基盤を構築
オープンソースラボ編集部 ・ 2026年6月14日
OSS MLプラットフォーム比較:MLflow vs Kubeflow vs DVC で機械学習基盤を構築
AWS SageMaker(ml.m5.xlarge使用で月$400〜)・Weights & Biases(Teamプラン月$50/ユーザー〜)に対して、MLflow(実験追跡・モデルレジストリ)・Kubeflow(Kubernetes上のMLパイプライン)・DVC(データ・モデルのバージョン管理)はOSSの機械学習基盤を代表するツールです。
MLOpsに必要なコンポーネント
ML基盤には以下の機能が必要です:
- 実験追跡: ハイパーパラメーター・メトリクス・成果物の記録と比較
- データバージョン管理: トレーニングデータのバージョン・系譜の管理
- モデルレジストリ: モデルのバージョン・ステージング・本番デプロイの管理
- パイプライン: 前処理→学習→評価→デプロイの自動化
- 特徴量ストア: 特徴量の計算・保存・共有・再利用
主要ツールの概要
MLflow
2018年にDatabricksが開発したオープンソースのML実験管理プラットフォームです。GitHubスター20k+。MLflow Tracking(実験ログ)・MLflow Projects(再現可能な実行)・MLflow Models(モデル形式の統一)・MLflow Registry(モデルバージョン管理)の4コンポーネントで構成されます。Python・R・Java・REST APIからアクセスでき、Azure ML・AWS SageMaker・Databricksのバックエンドとしても使えます。
# MLflow Trackingでモデルを実験管理
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, f1_score
import pandas as pd
# MLflowサーバーの接続先を設定(セルフホストの場合)
mlflow.set_tracking_uri("http://localhost:5000")
# 実験を設定(なければ作成)
mlflow.set_experiment("fraud-detection-v2")
# 実験を記録
with mlflow.start_run(run_name="random-forest-baseline"):
# ハイパーパラメーターを記録
params = {
"n_estimators": 100,
"max_depth": 10,
"min_samples_split": 5,
"random_state": 42,
}
mlflow.log_params(params)
# モデルの学習
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = RandomForestClassifier(**params)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
# メトリクスを記録
metrics = {
"accuracy": accuracy_score(y_test, y_pred),
"f1_score": f1_score(y_test, y_pred, average="weighted"),
}
mlflow.log_metrics(metrics)
# モデルを保存(Scikit-learn自動ロギング)
mlflow.sklearn.log_model(
model,
artifact_path="random-forest-model",
registered_model_name="fraud-detection", # モデルレジストリに登録
)
# カスタムアーティファクトを記録(特徴量重要度グラフ等)
import matplotlib.pyplot as plt
feat_imp = pd.Series(model.feature_importances_, index=X.columns).sort_values()
feat_imp.plot(kind="barh")
plt.savefig("feature_importance.png")
mlflow.log_artifact("feature_importance.png")
print(f"Accuracy: {metrics['accuracy']:.4f}")
# MLflowサーバーをDockerで起動(PostgreSQL + S3バックエンド)
docker run -d \
--name mlflow-server \
--restart unless-stopped \
-p 5000:5000 \
-e MLFLOW_S3_ENDPOINT_URL=http://minio:9000 \
-e AWS_ACCESS_KEY_ID=minioadmin \
-e AWS_SECRET_ACCESS_KEY=minioadmin \
ghcr.io/mlflow/mlflow:latest \
mlflow server \
--backend-store-uri postgresql://mlflow:password@postgres/mlflow \
--default-artifact-root s3://mlflow-artifacts/ \
--host 0.0.0.0
# WebUI: http://localhost:5000
# MLflowモデルレジストリでの本番デプロイ管理
from mlflow.tracking import MlflowClient
client = MlflowClient("http://localhost:5000")
# モデルバージョンを「Staging」から「Production」に昇格
client.transition_model_version_stage(
name="fraud-detection",
version=3,
stage="Production",
archive_existing_versions=True # 既存のProductionをArchiveに
)
# 本番モデルをロードして推論
import mlflow.pyfunc
model = mlflow.pyfunc.load_model("models:/fraud-detection/Production")
predictions = model.predict(new_data)
DVC(Data Version Control)
2017年に開発されたGit拡張のデータ・モデルバージョン管理ツールです。GitHubスター14k+。大規模データセット(数GB〜数TB)をGitリポジトリに直接コミットせず、S3・GCS・Azure Blob等のストレージに保存しながらGitのワークフロー(ブランチ・差分・コラボ)でデータとモデルを管理します。MLflowと組み合わせることで完全なMLOpsパイプラインを実現できます。
# DVCのインストールとセットアップ
pip install dvc dvc-s3 # S3ストレージ対応
# Gitリポジトリ内でDVCを初期化
git init my-ml-project
cd my-ml-project
dvc init
# リモートストレージを設定(S3の場合)
dvc remote add -d myremote s3://your-bucket/dvc-storage
# または MinIOをローカルで使う
dvc remote add -d localremote s3://dvc-storage
dvc remote modify localremote endpointurl http://localhost:9000
# データファイルをDVCで管理
dvc add data/train.csv data/test.csv
git add data/.gitignore data/train.csv.dvc data/test.csv.dvc
git commit -m "Add training data"
dvc push # S3に実データをアップロード
# dvc.yaml - ML パイプラインの定義
stages:
preprocess:
cmd: python src/preprocess.py
deps:
- src/preprocess.py
- data/raw/train.csv
params:
- params.yaml:
- preprocessing.test_size
- preprocessing.random_state
outs:
- data/processed/train_features.csv
- data/processed/test_features.csv
train:
cmd: python src/train.py
deps:
- src/train.py
- data/processed/train_features.csv
params:
- params.yaml:
- model.n_estimators
- model.max_depth
outs:
- models/fraud_detector.pkl
metrics:
- metrics/train_metrics.json
evaluate:
cmd: python src/evaluate.py
deps:
- src/evaluate.py
- models/fraud_detector.pkl
- data/processed/test_features.csv
metrics:
- metrics/eval_metrics.json:
cache: false
plots:
- plots/confusion_matrix.png:
cache: false
# DVCパイプラインを実行・実験を比較
dvc repro # パイプライン全体を実行(変更のあるステージのみ)
dvc params diff # パラメーターの差分を表示
dvc metrics show # 全ブランチのメトリクスを比較
# 実験を作成・比較
dvc exp run --set-param model.n_estimators=200 # パラメーターを変えて実験
dvc exp show # 実験一覧を表示
dvc exp apply exp-abc123 # 最良の実験を適用
Kubeflow
2017年にGoogleがKubernetes上のML基盤として開発したOSSプラットフォームです。GitHubスター14k+。Kubernetes上でMLのライフサイクル全体(前処理・学習・評価・デプロイ・モニタリング)を管理します。JupyterHubでノートブック環境を提供し、Kubeflow Pipelines(KFP)でDAG形式のMLパイプラインを定義します。大規模なGPUクラスターを活用した分散学習に向いています。
# Kubeflow Pipelines(KFP)でMLパイプラインを定義
import kfp
from kfp import dsl
from kfp.components import create_component_from_func
@create_component_from_func
def preprocess(input_path: str, output_path: str):
import pandas as pd
df = pd.read_csv(input_path)
# 前処理ロジック
df.to_csv(output_path, index=False)
@create_component_from_func
def train_model(data_path: str, model_path: str, n_estimators: int = 100):
from sklearn.ensemble import RandomForestClassifier
import joblib, pandas as pd
df = pd.read_csv(data_path)
X, y = df.drop("label", axis=1), df["label"]
model = RandomForestClassifier(n_estimators=n_estimators)
model.fit(X, y)
joblib.dump(model, model_path)
@dsl.pipeline(name="Fraud Detection Pipeline")
def fraud_detection_pipeline(input_data: str = "gs://bucket/raw/train.csv"):
preprocess_task = preprocess(
input_path=input_data,
output_path="gs://bucket/processed/train.csv"
)
train_task = train_model(
data_path=preprocess_task.outputs["output_path"],
model_path="gs://bucket/models/fraud_detector.pkl",
n_estimators=200,
)
# パイプラインをKubeflowにデプロイ
client = kfp.Client(host="http://kubeflow.yourcompany.com")
client.create_run_from_pipeline_func(fraud_detection_pipeline, arguments={})
機能比較表
| 比較項目 | MLflow | DVC | Kubeflow |
|---|---|---|---|
| 実験追跡 | ✅(コア機能) | ✅(基本) | ✅ |
| データバージョン管理 | ❌ | ✅(コア機能) | ❌ |
| モデルレジストリ | ✅ | △ | ✅ |
| パイプライン | △ | ✅(dvc repro) | ✅(KFP) |
| Kubernetes依存 | ❌ | ❌ | ✅(必須) |
| 分散学習 | △ | ❌ | ✅ |
| GitHub Stars | 20k+ | 14k+ | 14k+ |
MLflowで追跡した実験結果はDevOpsカテゴリ/categories/devopsのGrafanaでリアルタイム可視化できます。学習済みモデルをプロダクションAPIとして提供する際のサーバー管理はDevOpsカテゴリ/categories/devopsのDockerとKubernetesの知識が必要です。LLMのファインチューニングと実験管理の組み合わせはLLMツールカテゴリ/categories/llm-toolsを参照してください。
FAQ
Q. MLflowとWeights & Biasesはどちらを選ぶべきですか?
A. **Weights & Biases(W&B)**が優れている点: ①リアルタイムメトリクス表示が美麗②スイープ(ハイパーパラメーターサーチ)が内蔵③チームコラボレーション機能が成熟④モデルアーティファクトのビジュアライズが優れる。MLflowが優れている点: ①完全OSSでセルフホスト可能(コスト・プライバシー)②AWS/Azure/Databricksのマネージドオプションがある③実装がシンプルで既存コードへの組み込みが容易④モデルレジストリとデプロイ連携が充実。個人・小規模チームはW&Bの無料枠が便利。企業でデータをクラウドに送りたくない場合はMLflow一択です。
Q. DVCとGit LFSはどう違いますか?どちらを選ぶべきですか?
A. Git LFSはGitリポジトリ内で大きなファイルをリモートに保存しますが、データのバージョン差分の可視化・パイプライン管理・実験追跡はありません。DVCはGit LFSの代替ではなくMLワークフロー専用のデータバージョン管理ツールです。DVCを選ぶ場合: ①ML実験のパイプライン管理も必要②データの変更履歴・比較が必要③複数の実験(異なるデータ前処理)を管理したい。Git LFSを選ぶ場合: ①単に大きなバイナリファイルをGitで管理したい②ML以外の用途(ゲームアセット・デザインファイル等)。
Q. MLflowのセルフホストサーバーのバックアップ方法は?
A. MLflowのデータは2か所に保存されます。①PostgreSQL(実験メタデータ・パラメーター・メトリクス)→通常のPostgreSQLバックアップで対応②S3/MinIO(モデルアーティファクト・プロット等)→S3のバージョニングまたはrcloneでバックアップ。
# MLflowメタデータのバックアップ(PostgreSQL)
pg_dump -U mlflow mlflow | gzip > mlflow_backup_$(date +%Y%m%d).sql.gz
# アーティファクトのバックアップ(S3/MinIOの場合)
rclone copy s3://mlflow-artifacts/ s3-backup:backup-bucket/mlflow-artifacts/
Q. KubeflowとAirflow(Apache)はMLパイプラインとして競合しますか?
A. 役割が異なります。Kubeflow Pipelines: Kubernetes上でのMLパイプライン特化。GPU・分散学習・モデルサービングに最適化。Apache Airflow: 汎用ワークフローオーケストレーター。ETL・BI・非ML処理に強い。KubeflowでMLトレーニングパイプラインを管理し、学習済みモデルをAirflowでデータウェアハウスに連携するという組み合わせが現実的なアーキテクチャです。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| 実験追跡・モデルレジストリ | MLflow |
| データ・モデルのバージョン管理 | DVC |
| Kubernetes上の大規模ML基盤 | Kubeflow |