はじめに
この記事では、Apple Silicon M5 Max を搭載したMac上で、MLflow公式の MLflow Tracking Quickstart を最初から順番に実行します。
対象となる公式チュートリアルはこちらです。
公式チュートリアルでは pip を使っていますが、uvに変更しています。
今回のゴール
最終的には、次の流れをM5 Max上で動かします。
MLflowを使うと、
- どんなパラメータで学習したか
- 精度はいくつだったか
- どんなモデルが生成されたか
- Pythonやライブラリの環境
- いつ、誰が実験したか
といった情報を「実験」としてまとめて管理できるようになります。
動作環境
今回想定する環境です。
| 項目 | 環境 |
|---|---|
| Machine | Apple Silicon M5 Max |
| OS | macOS |
| CPU Architecture | arm64 |
| Python | 3.14.6 |
| Python管理 | uv |
| MLflow | 3.x |
| Machine Learning | scikit-learn |
| データ | Iris Dataset |
| Tracking Store | SQLite |
| ブラウザ | Chrome / Safariなど |
全体の手順
公式Quickstartとの対応は次のようになります。
| この記事 | MLflow公式 |
|---|---|
| STEP 0 | M5 Max + uv用の追加準備 |
| STEP 1 | Set up MLflow |
| STEP 2 | Prepare training data |
| STEP 3 | Train a model with MLflow Autologging |
| STEP 4 | View the Run in the MLflow UI |
| STEP 5 | Log a model and metadata manually |
| STEP 6 | Load the model back for inference |
STEP 1〜6については公式Quickstartと同じ順番です。
STEP 0: M5 Max + uv環境を準備する
ここだけはMLflow公式Quickstartにはない、この記事独自の準備です。
STEP 0-1: uvとpythonをインストールする
すでにインストールされていたら無視してください。
curl -LsSf https://astral.sh/uv/install.sh | sh
uv --version
uv python install 3.14.6
uv python list 3.14
STEP 0-2: MLflow用プロジェクトを作る
プロジェクトを作成します。
uv init --no-package mlflow-quickstart
cd mlflow-quickstart
uv python pin 3.14.6
STEP 0-3: 必要なパッケージをインストール
MLflow、pandas、scikit-learn、JupyterLabを追加します。
uv add mlflow pandas scikit-learn jupyterlab ipykernel
uv sync
動作確認
uv run python -c "import platform; print(platform.machine())"
結果:
arm64
MLflowを確認します。
uv run mlflow --version
結果:
mlflow, version 3.15.1
scikit-learnも確認します。
uv run python -c "import sklearn; print(sklearn.__version__)"
結果:
1.9.0
この時点の構成
STEP 1: Set up MLflow
ここから公式Quickstartに入ります。
公式Quickstartの最初のステップはMLflowのセットアップです。
今回はローカルMacなので、MLflow公式のセットアップガイドでQuickstart/Local Development向けとして推奨されている SQLite をTracking Storeに使用します。
JupyterLabを起動
uv run jupyter lab
ブラウザでJupyterLabが開きます。

新しいNotebookを作成してください。
ファイル名は例えば、
mlflow_quickstart.ipynb
とします。
Tracking URIを設定
最初のセルです。
import mlflow
mlflow.set_tracking_uri("sqlite:///mlflow.db")
mlflow.set_experiment("MLflow Quickstart")
実行します。
この時点では概念的に、
という状態になります。
確認してみます。
print("Tracking URI:", mlflow.get_tracking_uri())
想定結果:
Tracking URI: sqlite:///mlflow.db
STEP 2: Prepare training data
次は機械学習に使用するデータを準備します。
公式Quickstartでは有名な Iris Dataset を使用しています。
次のセルを実行します。
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# Load the Iris dataset
X, y = datasets.load_iris(return_X_y=True)
# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
random_state=42,
)
# Define the model hyperparameters
params = {
"solver": "lbfgs",
"max_iter": 1000,
"random_state": 8888,
}
ここまでの処理は、
という流れです。
データ数を確認してみます。
print("X_train:", X_train.shape)
print("X_test :", X_test.shape)
STEP 3: Train a model with MLflow Autologging
ここがMLflowの面白いところです。
通常、実験情報を保存するには、
mlflow.log_param(...)
mlflow.log_metric(...)
mlflow.log_model(...)
などを自分で書く必要があります。
しかしscikit-learnには Autologging が用意されています。
公式Quickstartでは次のコードを実行します。
import mlflow
# Enable autologging for scikit-learn
mlflow.sklearn.autolog()
# Just train the model normally
lr = LogisticRegression(**params)
lr.fit(X_train, y_train)
ポイントはこの1行です。
mlflow.sklearn.autolog()
これだけでMLflowがモデル学習に関する情報を自動的に取得します。Autologgingではモデル、パラメータ、メトリクスなどを自動記録できます。
イメージすると、
となります。
STEP 4: View the Run in the MLflow UI
次は保存された実験をWeb UIから確認します。
JupyterLabはそのまま起動しておき、新しいTerminalを開きます。
プロジェクトディレクトリへ移動してください。
cd mlflow-quickstart
SQLiteをBackend StoreとしてMLflow Serverを起動します。
uv run mlflow server \
--backend-store-uri sqlite:///mlflow.db \
--port 5000
MLflow公式のローカルDB構成でも、SQLite使用時はこのようにBackend Storeを指定してUIを起動します。
ブラウザで、
http://localhost:5000
を開きます。
MLflow Quickstartを開く
Experiment一覧から、
MLflow Quickstart
をクリックします。
左のメニューで「Model training」を選択すると
Autologgingによって作成されたRunが表示されます。
さらに「Run Name」をクリックすると詳細な情報を確認できます。
STEP 5: Log a model and metadata manually
ここまでは
mlflow.sklearn.autolog()
によって自動的に実験を記録しました。
次は公式Quickstartの通り、手動でログを記録します。
jupyternotebookに戻り、次のセルを追加します。
# Start an MLflow run
with mlflow.start_run():
# Log the hyperparameters
mlflow.log_params(params)
# Train the model
lr = LogisticRegression(**params)
lr.fit(X_train, y_train)
# Log the model
model_info = mlflow.sklearn.log_model(
sk_model=lr,
name="iris_model",
)
# Predict on the test set, compute and log the loss metric
y_pred = lr.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
mlflow.log_metric("accuracy", accuracy)
# Optional: Set a tag that we can use to remind ourselves
# what this run was for
mlflow.set_tag(
"Training Info",
"Basic LR model for iris data",
)
今度はAutologgingに任せるのではなく、
mlflow.log_params()
mlflow.sklearn.log_model()
mlflow.log_metric()
mlflow.set_tag()
を明示的に呼び出しています。
図にすると、
となります。
UIでも確認する
MLflow UIに戻ります。
必要に応じてブラウザを更新してください。
新しいRunが追加されています。
STEP 6: Load the model back for inference
最後に、MLflowに保存したモデルをもう一度読み込みます。
これは非常に重要です。
MLflowは単に、
「学習結果をグラフで見るツール」
ではありません。
保存したモデルを再びロードして推論に利用できます。
公式Quickstartでは mlflow.pyfunc を使用します。
次のセルを実行します。
# Load the model back for predictions as a generic Python Function model
loaded_model = mlflow.pyfunc.load_model(
model_info.model_uri
)
predictions = loaded_model.predict(X_test)
iris_feature_names = datasets.load_iris().feature_names
result = pd.DataFrame(
X_test,
columns=iris_feature_names,
)
result["actual_class"] = y_test
result["predicted_class"] = predictions
result[:4]
Notebookに結果が表示されます。
イメージすると、
となります。
完成したプロジェクト
最終的には、おおむね次のような構成になります。
mlflow-quickstart-m5max/
├── .python-version
├── .venv/
├── mlflow.db
├── mlflow_quickstart.ipynb
├── pyproject.toml
├── README.md
└── uv.lock
特に重要なのが、
.python-version
pyproject.toml
uv.lock
です。
これらを管理することで、どのPythonとどのライブラリを使ったのか再現しやすくなります。
初学者向け解説
ここからは、ここまで登場した技術について整理します。
MLflowとは何か
機械学習では、
モデルを作る
ことだけが仕事ではありません。
実際には何度も、
パラメータ変更
↓
学習
↓
評価
↓
パラメータ変更
↓
再学習
を繰り返します。
例えば、
実験1
max_iter = 100
accuracy = 0.92
実験2
max_iter = 500
accuracy = 0.95
実験3
max_iter = 1000
accuracy = 0.97
となった場合、
どの設定で0.97になったんだっけ?
という問題が発生します。
これを管理するのがMLflow Trackingです。
Experimentとは
Experimentは、
実験プロジェクト
のような箱です。
今回は、
mlflow.set_experiment("MLflow Quickstart")
としました。
したがって、
MLflow Quickstart
というExperimentの中に複数のRunが保存されます。
Runとは
Runは、
1回の実験
です。
例えば、
MLflow Quickstart
│
├── Run A
│ └── Autologging
│
└── Run B
└── Manual Logging
となります。
Parameterとは
Parameterはモデルを作るための設定値です。
今回の場合、
params = {
"solver": "lbfgs",
"max_iter": 1000,
"random_state": 8888,
}
が該当します。
Metricとは
Metricはモデルの性能を表す数値です。
今回は、
accuracy
を記録しました。
例えば、
accuracy = 0.9666
なら、
約96.7%
正しく分類できたという意味になります。
Artifactとは
Artifactは実験で生成されたファイルです。
例えば、
モデル
設定ファイル
依存パッケージ情報
などです。
MLflowは単に数値だけではなく、モデルそのものも実験結果として管理できます。
Autologgingとは
今回特に重要なのが、
mlflow.sklearn.autolog()
です。
通常なら、
パラメータを保存
メトリクスを保存
モデルを保存
という処理をそれぞれ実装しなければなりません。
Autologgingなら、
となります。
そのため、既存の機械学習コードにMLflowを導入する際にも非常に便利です。
pyfuncとは
最後に使用した、
mlflow.pyfunc.load_model()
の pyfunc は、
Python Function
というMLflow共通のモデルインターフェースです。
scikit-learnだけではなく、
scikit-learn
PyTorch
TensorFlow
XGBoost
独自Python Model
などをMLflow上で扱うとき、共通の操作方法を提供する役割があります。
uvを使う理由
Pythonプロジェクトでは、
Python本体
仮想環境
依存パッケージ
バージョン固定
を管理する必要があります。
uvでは、
のようにまとめて扱えます。
今回のようなML/AI環境では、Pythonとライブラリの組み合わせが再現できることは非常に重要です。
M5 Maxを使う意味
今回のQuickstart自体は非常に小さなIris Datasetを扱うため、M5 Maxの性能を使い切る処理ではありません。
むしろ今回確認したかったのは、
Apple Silicon
+
Python
+
uv
+
scikit-learn
+
MLflow
というML開発環境をMac上だけで構築できることです。
今後、
MLflow Tracking
↓
Hyperparameter Tuning
↓
PyTorch
↓
Apple MPS
↓
Transformer
↓
LoRA
と進めていけば、M5 Maxをより活かしたモデル開発環境に発展させられます。
まとめ
今回、M5 Max上でMLflow公式Quickstartを順番通り実行しました。
実施したことは、
uv
↓
Python
↓
MLflow
↓
Iris Dataset
↓
LogisticRegression
↓
Autologging
↓
MLflow UI
↓
Manual Logging
↓
Model Load
↓
Inference
です。
特に重要なのは、
MLflowは「モデルを作るライブラリ」ではなく、「モデルを作る過程を管理する仕組み」である
という点です。
モデル開発では、
コード
データ
パラメータ
評価結果
モデル
実行環境
をセットで管理できなければ、「なぜそのモデルが良かったのか」を後から再現できません。
MLflow Trackingは、その実験履歴を管理するための第一歩になります。








