MLflow は、機械学習の実験管理を効率化するオープンソースプラットフォームです。実験の追跡、プロジェクト管理、モデルの登録・追跡をサポートし、機械学習のライフサイクル全体を管理できます。この記事では、MLflow を使用した実験管理の基本と、具体的な実装例を解説します。
実験管理の必要性
機械学習プロジェクトにおいて、モデルの精度向上は重要な課題です。しかし、そのためには様々なアルゴリズムやハイパーパラメータを試し、最適な組み合わせを見つける必要があります。その過程で、実験の記録、結果の比較、モデルの再現性確保、チームでの情報共有といった、実験管理に関する様々な課題に直面します。
例えば、顧客の購買履歴データに基づいて、次に購入する商品を予測するレコメンデーションモデルを開発するとします。「様々なアルゴリズムとパラメータを試して最適なモデルを見つけ、実験過程は全て記録して後で比較検討できるようしたい」と考えると思います。このような状況で、MLflow は実験の記録や比較を効率化するツールとなります。このようにMLflow は機械学習の実験の追跡、プロジェクト管理、モデルの登録・追跡をサポートし、機械学習のライフサイクル全体を管理できます。
実験管理における課題
機械学習プロジェクトでは、以下のような実験管理の課題が発生しがちです。このような背景からMLflow などのツールを用いた効率的な実験管理が必要となります。
- パラメータ管理の煩雑さ: どのアルゴリズム、どのハイパーパラメータの組み合わせが最良だったか、手作業での記録は限界があります。
- 結果比較の困難さ: 異なる実験の結果を比較する際、記録が整理されていないと、比較作業に時間がかかります。
- モデル再現性の問題: 過去の実験で作成したモデルを、後から正確に再現することが難しい場合があります。
- チーム内共有の非効率性: 実験結果やモデルをチームメンバーと共有するのに手間がかかることがあります。
MLflow の主要機能
MLflow は、以下の主要な機能から構成されています。これらの機能を組み合わせ、機械学習の実験の追跡、管理し、ライフサイクル全体を管理していきます。
- トラッキング (Tracking): 実験のパラメータ、メトリクス、モデル、その他の成果物 (アーティファクト) を記録します。
- プロジェクト (Projects): 実行環境を定義し、コード、データ、依存関係を再現可能な形でパッケージ化します。
- モデル (Models): 様々な機械学習ライブラリで作成されたモデルを統一的な形式で管理し、デプロイを容易にします。
- レジストリ (Registry): モデルのバージョン管理、ステージング (開発、ステージング、本番など) 、注釈の追加を可能にします。
MLflow の導入
MLflow は pip で簡単にインストールできます。
pip install mlflow
Python コード内で MLflow を使用するには、mlflow モジュールをインポートします。
import mlflow import mlflow.sklearn # scikit-learn モデルを扱う場合
実践:AIモデル開発における MLflow の活用
レコメンデーションモデル開発プロジェクトを例に、MLflow の具体的な活用方法を見ていきます。開発手順は以下の通りです。
- データの準備: 購買履歴データを前処理し、学習用データとテスト用データに分割します。
- ベースラインモデルの作成: シンプルなモデルをベースラインとして作成し、性能を評価します。
- 様々なアルゴリズムの試行: 複数のアルゴリズムを試し、パラメータを調整しながら性能を比較します。
- 最適なモデルの選択: 最も性能の良いモデルを選択し、詳細な評価を行います。
- モデルの保存と共有: 最終的なモデルを MLflow に保存し、チームメンバーと共有します。
ステップ 1: データの準備
import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder # 購買履歴データの読み込み (サンプルデータ) # 実際には、適切なデータ読み込み処理を記述 data = pd.read_csv("purchase_history.csv") # データの前処理 (例: 欠損値の処理、カテゴリ変数のエンコーディング) # ... # 目的変数のエンコーディング label_encoder = LabelEncoder() data['product_id'] = label_encoder.fit_transform(data['product_id']) # 特徴量と目的変数の分割 X = data.drop('product_id', axis=1) y = data['product_id'] # 学習データとテストデータに分割 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
ステップ 2: ベースラインモデルの作成と実験のトラッキング
ここからMLflowを使っていきます。まず、シンプルなロジスティック回帰モデルでベースライン性能を確認します。MLflow で実験のパラメータ、メトリクス、モデルを記録します。
import mlflow import mlflow.sklearn from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 実験の設定 mlflow.set_experiment("recommendation_model_experiments") # 実験の開始 with mlflow.start_run(run_name="Baseline_LogisticRegression") as run: # パラメータの設定 params = {"C": 1.0, "solver": "liblinear", "random_state": 42} mlflow.log_params(params) # モデルの学習 model = LogisticRegression(**params) model.fit(X_train, y_train) # モデルの評価 y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) # メトリクスの記録 mlflow.log_metric("accuracy", accuracy) # モデルの保存 mlflow.sklearn.log_model(model, "baseline_model") # run_id の取得 run_id = run.info.run_uuid print(f"MLflow Run ID: {run_id}")
ステップ 3: 様々なアルゴリズムの試行と記録
次に、ランダムフォレストなど、他のアルゴリズムを試します。パラメータを変えながら性能を比較し、その結果を MLflow に記録します。
from sklearn.ensemble import RandomForestClassifier # 実験の開始 (ランダムフォレスト) with mlflow.start_run(run_name="RandomForest_n_estimators=100") as run: # パラメータの設定 params = {"n_estimators": 100, "max_depth": 10, "random_state": 42} mlflow.log_params(params) # モデルの学習 model = RandomForestClassifier(**params) model.fit(X_train, y_train) # モデルの評価 y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) # メトリクスの記録 mlflow.log_metric("accuracy", accuracy) # モデルの保存 mlflow.sklearn.log_model(model, "random_forest_model")
異なるアルゴリズムやパラメータ設定で複数の実験を繰り返し、MLflow に結果を蓄積していきます。
ステップ 4: 最適なモデルの選択と詳細評価
mlflow ui を起動し実験結果を確認します。
mlflow ui
ブラウザで http://localhost:5000 にアクセスし、最も高い精度のモデルを選択します。 そして、選択したモデルに対し、混同行列や適合率・再現率などの詳細な評価指標も算出し、MLflow に記録します。
ステップ 5: モデルの保存と共有
最終的に最も性能の良いモデルを MLflow に保存し、チームメンバーと共有します。MLflow のモデルレジストリ機能を使うと、モデルのバージョン管理やステージング(開発、ステージング、本番環境)が容易になります。
実験結果の確認と活用
MLflow には、実験結果を可視化するための UI が組み込まれています。
mlflow ui
上記コマンドをターミナルで実行し、ブラウザで http://localhost:5000 にアクセスすると、実行した実験の一覧、パラメータ、メトリクス、モデルなどを確認できます。
Python コードから直接実験結果にアクセスすることも可能です。
import pandas as pd # 全ての実験結果を取得 runs_df = mlflow.search_runs(experiment_names=["recommendation_model_experiments"]) print(runs_df[["run_id", "experiment_id", "metrics.accuracy", "params.C", "params.solver"]])
mlflow.search_runs() は、pandas.DataFrame 形式で実験結果を返します。これにより、結果のフィルタリング、ソート、分析が容易になります。
特定の実験のメトリクスを取得する場合は、mlflow.get_run() で Run オブジェクトを取得します。
# 特定の実験結果の取得 run_id = "先ほどのコードで取得したrun_id" # ここには取得したrun_idの文字列を記述 run = mlflow.get_run(run_id) print(f"Accuracy: {run.data.metrics['accuracy']}")
まとめ
MLflow を活用することで、機械学習プロジェクトは以下のようなメリットを得られることを説明してきました。
- 実験の効率化: パラメータ、メトリクス、モデルを自動記録し、手作業での記録作業を削減。
- 結果の可視化: MLflow UI で実験結果を容易に比較検討。
- モデルの再現性: 過去の実験を正確に再現可能。
- チーム連携の強化: 実験結果やモデルをチームメンバーとスムーズに共有。
このように、MLflow は機械学習プロジェクトの管理を効率化し、エンジニアの負担を軽減することができます。MLflow を活用することで、実験管理の負担を軽減し、モデルの品質向上に集中できるようになります。
[PR]