ML実験管理比較:MLflow vs Weights & Biases vs DVC で機械学習を再現可能にする
オープンソースラボ編集部 ・ 2026年6月14日
ML実験管理比較:MLflow vs Weights & Biases vs DVC で機械学習を再現可能にする
機械学習プロジェクトで「あのモデルがなぜ精度が良かったのか分からない」「半年前の実験を再現できない」という問題を解決するのがML実験管理(MLOps)ツールです。MLflow(Apache・OSS・セルフホスト)・Weights & Biases(W&B)(SaaS・充実した可視化)・DVC(Git拡張・データバージョン管理)の3つが主要ツールです。
ML実験管理ツールを使う理由
- 再現性: ハイパーパラメーター・データセット・コード・環境を全て記録して同じモデルを再現
- 比較: 複数の実験を並べてメトリクス(Accuracy・Loss・F1スコア)を視覚的に比較
- モデルレジストリ: ベストモデルをバージョン管理してステージング→本番への昇格を管理
- コラボレーション: チームメンバーが互いの実験結果を確認・コメント・共有
主要ツールの概要
MLflow
2018年公開(Databricks)、Python製のOSSです。GitHubスター19k+。セルフホストで完全無料で使えるML実験管理の標準です。Tracking(実験記録)・Projects(再現可能なコードパッケージ)・Models(モデルレジストリ)・Deployments(デプロイ管理)の4コンポーネントで構成されます。
# docker-compose.yml - MLflow Tracking Server(PostgreSQL + MinIO)
version: "3.8"
services:
mlflow:
image: ghcr.io/mlflow/mlflow:v2.16.0
restart: unless-stopped
ports:
- "5000:5000"
environment:
MLFLOW_BACKEND_STORE_URI: postgresql://mlflow:${POSTGRES_PASSWORD}@postgres:5432/mlflow
MLFLOW_ARTIFACT_ROOT: s3://mlflow-artifacts/
AWS_ACCESS_KEY_ID: ${MINIO_ACCESS_KEY}
AWS_SECRET_ACCESS_KEY: ${MINIO_SECRET_KEY}
MLFLOW_S3_ENDPOINT_URL: http://minio:9000
command: >
mlflow server
--host 0.0.0.0
--port 5000
--backend-store-uri postgresql://mlflow:${POSTGRES_PASSWORD}@postgres:5432/mlflow
--default-artifact-root s3://mlflow-artifacts/
depends_on: [postgres, minio]
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: mlflow
POSTGRES_USER: mlflow
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- mlflow_pg_data:/var/lib/postgresql/data
minio:
image: minio/minio:latest
ports:
- "9000:9000"
environment:
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY}
command: server /data --console-address ":9001"
volumes:
- minio_data:/data
volumes:
mlflow_pg_data:
minio_data:
# MLflow: PyTorchモデルの実験記録
import mlflow
import mlflow.pytorch
import torch
import torch.nn as nn
from torch.utils.data import DataLoader
mlflow.set_tracking_uri('http://localhost:5000')
mlflow.set_experiment('image-classifier-v2')
def train_model(config: dict):
with mlflow.start_run(run_name=f'lr={config["lr"]}_batch={config["batch_size"]}'):
# ハイパーパラメーターを記録
mlflow.log_params(config)
# タグを設定
mlflow.set_tags({
'model_type': 'ResNet50',
'dataset': 'CIFAR-10',
'author': 'ml-team',
})
model = build_model(config)
optimizer = torch.optim.Adam(model.parameters(), lr=config['lr'])
criterion = nn.CrossEntropyLoss()
for epoch in range(config['epochs']):
train_loss, train_acc = train_epoch(model, optimizer, criterion)
val_loss, val_acc = validate(model, criterion)
# メトリクスをエポックごとに記録
mlflow.log_metrics({
'train_loss': train_loss,
'train_acc': train_acc,
'val_loss': val_loss,
'val_acc': val_acc,
}, step=epoch)
# モデルをアーティファクトとして保存
mlflow.pytorch.log_model(
model,
artifact_path='model',
registered_model_name='image-classifier',
)
# 混同行列・学習曲線をアーティファクトとして保存
fig = plot_confusion_matrix(model)
mlflow.log_figure(fig, 'confusion_matrix.png')
# カスタムアーティファクト(特徴量重要度等)
mlflow.log_artifact('feature_importance.csv')
return val_acc
# 実験グリッドサーチ
configs = [
{'lr': 0.001, 'batch_size': 32, 'epochs': 50, 'dropout': 0.3},
{'lr': 0.0001, 'batch_size': 64, 'epochs': 50, 'dropout': 0.5},
{'lr': 0.0003, 'batch_size': 128, 'epochs': 50, 'dropout': 0.3},
]
best_acc = 0
for config in configs:
acc = train_model(config)
if acc > best_acc:
best_acc = acc
print(f'新しいベストモデル: {acc:.4f}')
# モデルレジストリで本番昇格
from mlflow.tracking import MlflowClient
client = MlflowClient()
# ベストモデルをStagingに昇格
client.transition_model_version_stage(
name='image-classifier',
version='3',
stage='Staging',
)
# テスト完了後にProductionに昇格
client.transition_model_version_stage(
name='image-classifier',
version='3',
stage='Production',
)
# MLflow: 実験結果の比較・分析
import mlflow
import pandas as pd
mlflow.set_tracking_uri('http://localhost:5000')
# 全実験のメトリクスをDataFrameで取得
runs = mlflow.search_runs(
experiment_names=['image-classifier-v2'],
filter_string='metrics.val_acc > 0.85',
order_by=['metrics.val_acc DESC'],
max_results=20,
)
print(runs[['run_id', 'params.lr', 'params.batch_size', 'metrics.val_acc', 'metrics.val_loss']].to_string())
DVC(Data Version Control)
2017年公開、Python製のOSSです。GitHubスター14k+。Gitの拡張として大容量データセット・モデルファイルをS3/GCS/Azure Blobでバージョン管理するツールです。実験管理よりもデータパイプラインとデータバージョニングに特化しており、MLflowと組み合わせて使うことが多いです。
# DVC: データセットとモデルのバージョン管理
pip install dvc dvc-s3
# Git + DVCプロジェクト初期化
git init
dvc init
# S3 をリモートストレージに設定
dvc remote add -d myremote s3://my-ml-bucket/dvc-store
dvc remote modify myremote access_key_id ${AWS_ACCESS_KEY_ID}
dvc remote modify myremote secret_access_key ${AWS_SECRET_ACCESS_KEY}
# 大容量ファイルをDVCで管理(GitではなくS3に保存)
dvc add data/train.csv data/test.csv
dvc add models/best_model.pkl
# Git には .dvc ポインターファイルのみコミット
git add data/train.csv.dvc data/test.csv.dvc models/best_model.pkl.dvc .gitignore
git commit -m "Add training data and model v1"
dvc push # 実データをS3にアップロード
# チームメンバーがデータを取得
git pull
dvc pull # S3から実データをダウンロード
# データパイプラインを定義(dvc.yaml)
dvc repro # パイプラインを順番に実行(変更があったステップのみ再実行)
# dvc.yaml: 再現可能なMLパイプライン定義
stages:
preprocess:
cmd: python src/preprocess.py --input data/raw.csv --output data/processed.csv
deps:
- src/preprocess.py
- data/raw.csv
outs:
- data/processed.csv
train:
cmd: python src/train.py --data data/processed.csv --output models/model.pkl
deps:
- src/train.py
- data/processed.csv
outs:
- models/model.pkl
metrics:
- metrics/train_metrics.json:
cache: false
evaluate:
cmd: python src/evaluate.py --model models/model.pkl --data data/test.csv
deps:
- src/evaluate.py
- models/model.pkl
- data/test.csv
metrics:
- metrics/eval_metrics.json:
cache: false
機能比較表
| 比較項目 | MLflow | W&B | DVC |
|---|---|---|---|
| セルフホスト | ✅ | △(有料) | ✅ |
| 実験可視化 | ✅ | ✅ 最充実 | △ |
| データバージョニング | △ | △ | ✅ 最強 |
| モデルレジストリ | ✅ | ✅ | △ |
| 無料枠 | 無制限(OSS) | 月200h | OSS無制限 |
| 学習コスト | 低 | 低 | 中 |
ML実験管理はDevOpsカテゴリ/categories/devopsのCI/CDパイプライン(GitHub Actions)と統合して、PRごとにモデルの精度回帰テストを実行して品質を自動担保します。LLM Toolsカテゴリ/categories/llm-toolsのファインチューニング(Unsloth・Axolotl)ジョブのハイパーパラメーター探索と実験記録にもMLflowが広く使われています。
FAQ
Q. MLflowをGitHub ActionsのCI/CDに統合するには?
A. PRのたびにモデルを再訓練して精度回帰を自動検知するワークフローを構築します。①GitHub Actionsワークフロー(.github/workflows/ml-ci.yml)でdvc reproを実行して再現可能なパイプラインを実行②MLflowに実験結果を記録③mlflow.search_runs()で前回のベースラインと精度を比較④精度が閾値を下回った場合はPRにコメントを投稿して警告。MLflow Tracking ServerへのアクセスはGitHub Secrets(MLFLOW_TRACKING_URI・MLFLOW_TRACKING_USERNAME)で管理します。
Q. W&BとMLflowはどう使い分けますか?
A. チーム規模が大きく・可視化の品質・リアルタイム進捗共有が重要ならW&B、コスト0・セルフホスト・データ完全管理ならMLflowが向いています。W&Bの優位点: ①実験の可視化UI(並列座標チャート・ハイパーパラメーター重要度)がMLflowより格段に充実②Sweeps(ハイパーパラメーター自動探索・Bayesian最適化)が標準搭載③Academic向けは無料で商用も月200h無料。MLflowの優位点: ①AWS/GCP/Azure上に完全セルフホストしてデータが外部に出ない②Databricks MLflowとの統合で大規模企業向けガバナンス③モデルレジストリのステージング/本番管理がシンプルなUIで操作可能。
Q. DVCはMLflowと組み合わせて使えますか?
A. DVCとMLflowは補完的な役割を持ち、組み合わせが推奨されます。役割分担: ①DVC: データセット(data/)・モデルアーティファクト(models/)のGitバージョン管理+パイプライン定義②MLflow: 実験ごとのメトリクス記録・パラメーター記録・可視化・モデルレジストリ。実装: DVCのパイプラインステージ(dvc.yaml)内でPythonスクリプトを実行し、そのスクリプト内でMLflowのmlflow.start_run()でメトリクスを記録します。dvc reproが実行された各Runの結果がMLflow UIで比較できる完全な実験管理環境になります。
Q. モデルをMLflowからFastAPIでサービングするには?
A. mlflow.pyfunc.load_model()でモデルを読み込んでFastAPIエンドポイントで提供します。①pip install mlflow fastapi uvicorn②model = mlflow.pyfunc.load_model('models:/image-classifier/Production')③FastAPIの起動時にモデルをメモリにロード④@app.post('/predict')エンドポイントで推論を実行。MLflow Serving組み込み: mlflow models serve -m models:/image-classifier/Production -p 8080 --no-condaでMLflow自体がFlaskベースのサービングサーバーを起動(本番用途ではFastAPIのほうが高速・柔軟)。コンテナイメージ生成: mlflow models build-docker -m models:/image-classifier/Production -n my-classifierでDockerイメージを自動生成してKubernetesにデプロイできます。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| セルフホスト・モデルレジストリ・コスト0 | MLflow |
| チーム共有・充実した可視化・Sweeps | Weights & Biases |
| データバージョン管理・再現可能パイプライン | DVC |