MLflowでの機械学習モデル管理：Tracking、Model Registry、Projectsの活用法とDocker環境構築

## はじめに
MLflowについて最低限の環境構築を行い、各種機能などについて触れたので備忘メモとして残しておきます。

## 機能コンポーネントの説明
**MLflow Core Components Documentation** に基づき、MLflowが提供する主要機能は次の通りです。

### MLflow Tracking（トラッキング）
MLflow Trackingは、機械学習プロジェクトのパラメータ、コードバージョン、メトリクス、アーティファクトを記録するためのAPIとUIを提供します。これにより、実験結果を一元管理し、チームでの協力や実験の比較が簡単に行えます。

### Model Registry（モデルレジストリ）
機械学習モデルのバージョン管理、ステージ管理（開発中、本番運用中など）を行うシステムです。UIでモデルのステージを簡単に確認・変更でき、モデル管理が容易になります。

### MLflow Deployments for LLMs（LLMのデプロイメント）
LLMを含むモデルのデプロイを、標準化されたAPIを通じてサポートします。セキュアで効率的なデプロイが可能です。

### Evaluate（評価）
モデルの精度を詳細に分析し、異なるモデル間の比較ができます。

### Prompt Engineering UI（プロンプトエンジニアリングUI）
UIを使用してプロンプトを実験し、調整することができます。大規模言語モデル（LLM）の最適化に役立ちます。

### Recipes（レシピ）
機械学習プロジェクトの構造をテンプレート化し、ベストプラクティスを提供することで効率的なデプロイメントをサポートします。

### MLflow Projects（プロジェクト）
機械学習コードやワークフローをパッケージ化し、依存関係や実行方法を一貫して定義することで、再現性のある実験環境を提供します。

---

## Docker環境でのMLflow設定と解説
ここでは、MLflowの Tracking、Model Registry、Projects の各機能を活用し、機械学習モデルの管理とデプロイメントをどのように行うかを紹介します。まず、MLflowをDocker環境でセットアップする方法について説明します。

### Docker環境構築のディレクトリ構成
```bash
├── docker-compose.yml        # Docker Compose設定ファイル
├── mlruns/                   # MLflowが保存する実験結果やアーティファクト
│   └── ...                   # MLflowが自動生成するファイルやフォルダ
├── notebooks/                # Jupyter Notebook用の作業フォルダ
│   └── example_notebook.ipynb # 実験用Notebookファイル
└── postgres-data/            # PostgreSQLのデータベース保存場所
    └── ...                   # PostgreSQLが自動生成するデータベースファイル
```

---

## MLflow Tracking（トラッキング）の使い方
MLflow Trackingは、すべての機械学習実験の結果（パラメータ、メトリクス、アーティファクト）を追跡する強力な機能です。各実験の結果を比較し、モデルのパフォーマンス向上に貢献します。

### 追跡内容
- **パラメータ**: `n_estimators`、`max_depth` などのモデルハイパーパラメータ。
- **メトリクス**: `RMSE`、`R²スコア` などのモデルのパフォーマンス指標。
- **アーティファクト**: モデルの予測結果のプロット画像や、モデルファイルそのもの。

この追跡情報を **MLflow UI** で確認でき、実験の進捗や改善点を一目で把握できるようになります。

### 実際のコード例
```python
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split

# トラッキングサーバーの設定
mlflow.set_tracking_uri("http://mlflow:5000")
mlflow.set_experiment("California Housing Price Prediction")

# データの読み込みと分割
X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# 実験を開始
with mlflow.start_run() as run:
    # モデルのトレーニング
    model = RandomForestRegressor(n_estimators=100, max_depth=10)
    model.fit(X_train, y_train)
    
    # パラメータ、メトリクスを記録
    mlflow.log_param("n_estimators", 100)
    mlflow.log_param("max_depth", 10)
    mlflow.log_metric("rmse", 0.5)  # ダミー値
    
    # モデルをMLflowに保存
    mlflow.sklearn.log_model(model, "model")
```

### 解説
このコードでは、ランダムフォレストモデルをトレーニングし、パラメータ（`n_estimators` と `max_depth`）と、モデルのメトリクス（`RMSE`）を記録しています。また、トレーニング済みのモデルは、アーティファクトとしてMLflowに保存されます。このように、MLflow Trackingは実験の結果を詳細に管理し、比較や分析をサポートします。

### UIでの追跡結果確認
実行後、MLflow UI（`http://localhost:5002`）にアクセスすると、記録されたパラメータやメトリクスを確認することができます。特に、異なるハイパーパラメータでの実験を比較したいときに役立ちます。

---

## Model Registry（モデルレジストリ）の利用方法
Model Registryは、機械学習モデルのライフサイクル管理を効率化する機能です。登録されたモデルのバージョン管理やステージ管理ができ、本番環境に移行する前のステージングやテストが簡単に行えます。

### モデルの登録・管理
- **登録**: MLflowによってトレーニングされたモデルは、自動的にレジストリに登録されます。
- **ステージ管理**: モデルのバージョンを開発中（`Staging`）から本番（`Production`）へとUIで簡単に変更できます。

### 実際のコード例
```python
from mlflow.tracking import MlflowClient

# モデルのバージョンをレジストリに登録
client = MlflowClient()
model_uri = "runs:/<run-id>/model"
client.create_registered_model("CaliforniaHousingModel")
client.create_model_version("CaliforniaHousingModel", model_uri, run_id)
```

### 解説
ここでは、トレーニング済みモデルを Model Registry に登録し、管理を行っています。登録後、MLflowのUIからモデルのステージを切り替えることができます。たとえば、新しいバージョンを Staging でテストし、問題がなければ Production にステージを変更することで、本番環境へのデプロイが可能になります。

### UIでの操作
- **モデルバージョンの確認**: 各モデルのバージョンとその状態（開発中、本番運用中など）を確認。
- **ステージの切り替え**: 必要に応じてUIからステージを変更し、モデルのデプロイフローを管理。

---

## MLflow Projects（プロジェクト）による再現可能な環境構築
MLflow Projectsは、機械学習プロジェクトを一貫した形で実行するための環境を提供します。コードと依存関係をパッケージ化し、再現性の高い実行環境を作ることができます。

### 利用のメリット
- **再現性の保証**: プロジェクトを別の環境やチームメンバーが再実行した場合でも、同じ結果が得られます。
- **依存関係の管理**: `MLproject` ファイルにより、すべての依存関係が管理され、複数環境間での一貫性が保たれます。

### 実際のコード例
```yaml
# MLprojectファイル
name: CaliforniaHousingModel

conda_env: conda.yaml

entry_points:
  main:
    parameters:
      n_estimators: {type: int, default: 100}
      max_depth: {type: int, default: 10}
    command: >
      python your_script.py --n_estimators {n_estimators} --max_depth {max_depth}
```

```yaml
# conda.yamlファイル
name: california_housing_env
channels:
  - defaults
dependencies:
  - python=3.9
  - scikit-learn
  - mlflow
  - numpy
  - pandas
  - matplotlib
  - pip
  - pip:
      - boto3
```

### 解説
上記の `MLproject` ファイルは、プロジェクトを再現するために必要な依存関係と実行方法を定義しています。このプロジェクトは `mlflow run .` で実行でき、同じ実行環境とパラメータで再現可能な結果を得ることができます。また、Conda環境を使って、依存関係が適切に管理されています。

---

## まとめ
Dockerを使用してMLflow環境をセットアップし、**MLflow Tracking** で実験結果を追跡し、**Model Registry** でモデルを管理、さらに **MLflow Projects** で再現可能な実行環境を提供しました。

今度はモデルでの推論結果をAPIで取得できるとこや、LLMを用いた他の機能を試してみたいなと思います。