こんばんは。今日は機械学習のライフサイクル管理に利用されるOSSライブラリ MLFlowの概要を調べつつ、一部機能を試してみたので、メモを残しておこうと思います。
それではまいります。
Contents
ML Flowとは?
MLflow は、機械学習ライフサイクル全体でワークフローと成果物を管理するための、汎用性が高く拡張可能なオープンソース プラットフォーム
MLflow とは何ですか?— MLflow 2.4.1 のドキュメント
ライブラリの本体はこちらで提供されています。
MLflow – A platform for the machine learning lifecycle | MLflow
MLFlowでは以下の5つの機能が提供されています。
- MLFlow Tracking(実験管理)
- MLFlow Models(モデル管理)
- MLFlow Model Registry(モデルのライフサイクル管理)
- MLFlow Projects(コード管理)
- MLFlow Recipes
MLFlow Tracking
機械学習コードの実行時に、パラメーター、コード バージョン、メトリック、モデル環境の依存関係、モデル成果物をログに記録するための API群を提供します。また、APIで記録した結果を参照するためのGUIもあわせて提供されています。(以下、画面サンプル)
MLFlow Models
Docker、Apache Spark、Databricks、Azure ML、AWS SageMaker などのプラットフォームで、バッチまたはリアルタイム推論のために (任意の ML ライブラリから) トレーニング済みモデルを簡単にデプロイできるモデル パッケージ形式とツール スイートを提供します。
MLFlow Model Registry
一元化されたモデルストアを提供。モデルのバージョン管理や、ステージ遷移(ステージング、運用など)を管理することができます。
MLFlow Projects
ちゃんと調べれてないので、以下のリンクを貼っておきます。
MLflow Projects — MLflow 0.1.0 documentation
MLflow: 2. Projects を使った実験管理 – connecting the dots (hatenablog.com)
MLFlow Recipes
ちゃんと調べれてないので、以下のリンクを貼っておきます。
MLflow Recipes — MLflow 2.4.1 documentation
MLflow Recipes 機能しらべてみました – Qiita
MLFlowに対応しているプラットフォーム
今回MLFlowについて調べるきっかけになった部分ですが、このMLFlow、機械学習のライフサイクル管理標準として、既にいろいろなサービスで対応しているようです。いくつか代表的ななものを。
Databricks
MLflow ガイド – Azure Databricks | Microsoft Learn
Azure Machine Learning
MLflow と Azure Machine Learning – Azure Machine Learning | Microsoft Learn
Microsoft Fabric
機械学習モデル – Microsoft Fabric | Microsoft Learn
はやってるの?
参考までに各国のGoogle検索トレンドをみてみました。比較のためにMLOpsも入れてみていますが、全世界でみると、MLOpsのトレンド上昇と併せてmlflowのトレンドも右肩上がり中。MLOpsの浸透につれて、これからまだまだ需要が高まりそうです。
全世界の検索トレンド
日本での検索トレンド
一方で日本の検索トレンドはMLOps, mlflowともにまだまだ下火?(2021年末頃から少しトレンドが上向いているようにもみえますが)
(参考)アメリカでの検索トレンド
おそらく全世界のトレンドはアメリカがけん引している模様。
(参考)イギリスでの検索トレンド
イギリスは日本よりももう少し明確にトレンドが上向き始めたくらい?
(参考)インドでの検索トレンド
さすがインドも明確な上昇トレンド。
(参考)中国での検索トレンド
意外にも中国ではトレンド確認できず。アメリカと同じくらいのトレンドを想像していたのですが・・・国の規制でGoogle検索つかってなかったりするのが影響してるのかな・・?
MLFlowのTracking機能を試してみた
今回は、MLFlowの中でも必須で利用されるであろう、Trackingの機能を利用してみました。
この機能を気軽に試してみるには、MLFlowの公式ドキュメントページのチュートリアルがおすすめです。
Tutorial — MLflow 2.4.1 documentation
Jupyter Notebookから実行する場合のコードはこちらに。
mlflow/examples/sklearn_elasticnet_wine/train.ipynb at master · mlflow/mlflow · GitHub
私の場合はAnacondaでPython環境を構築済だったので、追加で以下をインストールするだけで動きました。
conda install -c conda-forge mlflow
コード本体は以下。
# Wine Quality Sample
def train(in_alpha, in_l1_ratio):
import os
import warnings
import sys
import pandas as pd
import numpy as np
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.linear_model import ElasticNet
import mlflow
from mlflow.models import infer_signature
import mlflow.sklearn
import logging
logging.basicConfig(level=logging.WARN)
logger = logging.getLogger(__name__)
def eval_metrics(actual, pred):
rmse = np.sqrt(mean_squared_error(actual, pred))
mae = mean_absolute_error(actual, pred)
r2 = r2_score(actual, pred)
return rmse, mae, r2
warnings.filterwarnings("ignore")
np.random.seed(40)
# Read the wine-quality csv file from the URL
csv_url = (
"http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
)
try:
data = pd.read_csv(csv_url, sep=";")
except Exception as e:
logger.exception(
"Unable to download training & test CSV, check your internet connection. Error: %s", e
)
# Split the data into training and test sets. (0.75, 0.25) split.
train, test = train_test_split(data)
# The predicted column is "quality" which is a scalar from [3, 9]
train_x = train.drop(["quality"], axis=1)
test_x = test.drop(["quality"], axis=1)
train_y = train[["quality"]]
test_y = test[["quality"]]
# Set default values if no alpha is provided
if float(in_alpha) is None:
alpha = 0.5
else:
alpha = float(in_alpha)
# Set default values if no l1_ratio is provided
if float(in_l1_ratio) is None:
l1_ratio = 0.5
else:
l1_ratio = float(in_l1_ratio)
# Useful for multiple runs (only doing one run in this sample notebook)
with mlflow.start_run():
print("mlflow")
# Execute ElasticNet
lr = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, random_state=42)
lr.fit(train_x, train_y)
# Evaluate Metrics
predicted_qualities = lr.predict(test_x)
(rmse, mae, r2) = eval_metrics(test_y, predicted_qualities)
# Print out metrics
print("Elasticnet model (alpha=%f, l1_ratio=%f):" % (alpha, l1_ratio))
print(" RMSE: %s" % rmse)
print(" MAE: %s" % mae)
print(" R2: %s" % r2)
# Infer model signature
predictions = lr.predict(train_x)
signature = infer_signature(train_x, predictions)
# Log parameter, metrics, and model to MLflow
mlflow.log_param("alpha", alpha)
mlflow.log_param("l1_ratio", l1_ratio)
mlflow.log_metric("rmse", rmse)
mlflow.log_metric("r2", r2)
mlflow.log_metric("mae", mae)
mlflow.sklearn.log_model(lr, "model", signature=signature)
# 実行1
train(0.5, 0.5)
# 実行2
train(0.2, 0.2)
# 実行3
train(0.1, 0.1)
これらを実行したあとで、Notebookファイルと同じディレクトリ階層で以下コマンドを実行し、localhostのURLへ。(同じ階層でないと、mlflowの各種ログファイルが認識されず、何も表示されませんので注意)
mlflow ui
http://localhost:5000
すると、さきほど実行した3回分の実行記録が反映されていました。
この中の1つの中をみてみると、実行に際して与えられたパラメータやメトリクス、モデルの情報が記録されていました。
実体ファイルはどこにあるのか?
さて、この情報の元ネタは、ローカルのNotebookファイルと同じ階層に自動作成されたmlrunsディレクトリ内に蓄積されています。0がデフォルトのExperiment(実験)のディレクトリっぽいです。
このあたりの説明は以下にありました。
MLflow Tracking — MLflow 2.4.1 documentation
ちなみに、今回は上記のようにローカルのファイルシステム上に情報を蓄積するパターンでしたが、上のリンクをみると、他にもいろいろなパターン(リモートに蓄積する、など)がサポートされていることが分かります。
さて、そのままディレクトリ「0」の中に進むと、その実験の中の実行ごとにディレクトリがきられています。
実行の中をみると、さらに、情報ごとにディレクトリがきられていました。それぞれの中身をもう少し見ておきたいと思います。
artifacts
これは学習させたモデルの実体が保管される場所のようですね。上記サンプルコードの、以下部分を実行することで記録されるしくみのようでした。
mlflow.sklearn.log_model(lr, "model", signature=signature)
metrics
こちらは実行におけるメトリック情報が保管される場所のようです。以下のコード部分を実行することで保存されるしくみのようです。
mlflow.log_metric("rmse", rmse)
mlflow.log_metric("r2", r2)
mlflow.log_metric("mae", mae)
params
こちらは、実行時に与えたパラメータを保管する場所のようで、こちらもコード中に明示的に保存するように指示を与えていますね。
mlflow.log_param("alpha", alpha)
mlflow.log_param("l1_ratio", l1_ratio)
とりあえず、各情報の記録の仕方と実体データがどのように保管されるのかを理解したところで、今日はおしまいにしたいと思います。他の機能も含めてもっと試して理解を深めていければ。
おしまい
コメントを残す