MLflow
公開日: 2025-05-12 更新日: 2025-05-18
概要
MLflowは機械学習モデルの開発からデプロイまでのライフサイクルを一貫して管理するためのオープンソースプラットフォーム。以下のような機能によって、 MLOps のワークフローをシンプルにする事ができる。
- 効率的な実験管理:実験を一元管理し、最適な設定を可視化・比較
- 再現性の確保:依存関係やコードを管理し、誰でも同じ結果を再現
- チーム開発の強化:Model Registry によるバージョン管理で、複数人でも混乱なくモデルを運用
主な特徴として、実験結果の追跡(Tracking)、プロジェクトの再現性確保(Projects)、モデルのパッケージ化とデプロイ(Models)、モデルバージョン管理(Model Registry)という4つのコアコンポーネントを提供し、あらゆるMLライブラリやデプロイ環境と連携が可能。
主なコンポーネント
MLflow Tracking
- パラメータ、メトリクス、成果物(モデルファイルなど)を記録
- Web UI で複数の実験を比較・フィルタリング可能
MLflow Projects
- MLproject ファイルで依存関係を宣言
- Conda/Docker と連携し、誰でも同じ環境で実行できる
MLflow Models
- 訓練済みモデルを標準フォーマットで保存
- Docker、SageMaker、Azure ML などへワンクリックでデプロイ
MLflow Model Registry
- モデルのバージョン管理
- ステージング→本番への昇格やロールバックをサポート
- コメントやタグで開発チーム内の共有が容易
アーキテクチャ
サーバー/クライアント構成
- サーバーは任意のデータベース(MySQL、PostgreSQL、SQLite 等)に実験情報を保存
- オブジェクトストレージ(S3、Azure Blob Storage 等)に成果物を保管
拡張性
- REST API 経由で新しいバックエンドや認証方式をプラグインとして追加可能
使ってみる
pip でインストールして使う。
$ pip install mlflow
$ mlflow server
開発環境からは MLflow のトラッキングサーバーを指定して使う。
import mlflow
mlflow.set_tracking_uri("http://localhost:5000")
# デモ用にアイリスのデータセット用の分類器を設定する
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
# 1. Load the iris dataset
iris = load_iris()
x, y = iris.data, iris.target
# 2. Split into training and testing datasets
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
# 3. Train a logistic regression classifier
model = LogisticRegression(max_iter=200)
model.fit(x_train, y_train)
# 4. Evaluate accuracy on the test dataset
y_pred = model.predict(x_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"Accuracy: {accuracy:.2f}")
Tracking
モデルを記録
記録は、 mlflow.start_run()
を使って実験用の枠内で行う。
MLflow では、主要ライブラリ向けに “フレーバー” と呼ばれるモデル記録用インターフェース (mlflow.(フレーバー).~
) が用意されている。また、未対応ライブラリには “Models From Code” が使える。
以前は mlflow.pyfunc.PythonModel
を継承した方法も有ったが、現在は非推奨。
import mlflow
# 実験枠を作成
mlflow.set_experiment(f"MLflow")
with mlflow.start_run():
signature = mlflow.models.infer_signature(x_train, y_train)
model_info_1 = mlflow.sklearn.log_model(model, "model", signature=signature, input_example=x_train[:10])
# 情報を記録
mlflow.log_params(model.get_params())
mlflow.log_input(mlflow.data.from_numpy(x_train, source="iris"), context="Train")
mlflow.log_metric("accuracy", model.score(x_test, y_test))
mlflow.set_tag("sample-tag", "hello MLflow")
エクスポート & インポート
ローカルへモデルを書き出したり、他所から取ってきたモデルを取り込むことも可能。
# トラッキング記録からモデルを取得
print(model_info_1.model_uri)
model_1 = mlflow.sklearn.load_model(model_info_1.model_uri)
# モデルを手元へエクスポート (アーティファクトから. 方法1)
# mlflow.artifacts.download_artifacts("dbfs:/databricks/mlflow-tracking/1478265101077117/646f425ef1014acd8b78303e241995a2/artifacts/model", dst_path="exported")
# モデルを手元へエクスポート (アーティファクトから. 方法2)
mlflow.artifacts.download_artifacts(model_info_1.model_uri, dst_path="exported")
# モデルを手元へエクスポート (インスタンスから)
mlflow.sklearn.save_model(
model, "exported/saved_model", signature=signature, input_example=x_train[:10]
)
# モデルを手元からインポート
model_1 = mlflow.pyfunc.load_model("exported/model/")
Model
機械学習モデルを様々なツールで利用できるようパッケージ化するための標準フォーマット。モデルの入出力の形式・サンプルやライブラリ依存関係をモデルと共に保存する。
パッケージは MLmodel
ファイル (中身は YAML) をルートに持つディレクトリとして表現される。パッケージングは各フレーバーから提供される機能から行えるため、直接作る必要は無い。
Model Registry
モデルのライフサイクル管理向け機能を提供。モデルへ名前を付けて登録し、バージョン管理が出来る。モデルは既定では Unity Catalog へ保存される。
レジストリへ登録
# モデル登録 (uri: runs:/646f425ef1014acd8b78303e241995a2/model)
model_ver_1 = mlflow.register_model(model_info_1.model_uri, "iris-estimator-1")
レジストリから取得
model_1 = mlflow.sklearn.load_model(f"models:/iris-estimator-1/{model_ver_1.version}")
from mlflow import MlflowClient
client = MlflowClient()
# モデルへエイリアス割り当て
client.set_registered_model_alias(f"iris-estimator-1", "confirmed", model_ver_1.version)
# エイリアスでモデル取得
client.get_model_version_by_alias(f"iris-estimator-1", "confirmed")
# モデルからエイリアス削除
# client.delete_registered_model_alias("iris-estimator-1", "confirmed")