機械学習のライフサイクルを管理するOSS MLFlowをローカルで試してみた

こんばんは。今日は機械学習のライフサイクル管理に利用される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 とは何ですか?— MLflow 2.4.1 のドキュメント

MLFlow Models

Docker、Apache Spark、Databricks、Azure ML、AWS SageMaker などのプラットフォームで、バッチまたはリアルタイム推論のために (任意の ML ライブラリから) トレーニング済みモデルを簡単にデプロイできるモデル パッケージ形式とツール スイートを提供します。

MLflow とは何ですか?— MLflow 2.4.1 のドキュメント

MLFlow Model Registry

一元化されたモデルストアを提供。モデルのバージョン管理や、ステージ遷移(ステージング、運用など)を管理することができます。

MLflow モデル レジストリ — MLflow 2.4.1 のドキュメント

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環境を構築済だったので、追加で以下をインストールするだけで動きました。

Mlflow :: Anaconda.org

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)

とりあえず、各情報の記録の仕方と実体データがどのように保管されるのかを理解したところで、今日はおしまいにしたいと思います。他の機能も含めてもっと試して理解を深めていければ。

おしまい

この記事を気に入っていただけたらシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT US
Yuu113
初めまして。ゆうたろうと申します。 兵庫県出身、東京でシステムエンジニアをしております。現在は主にデータ分析、機械学習を活用してビジネスモデリングに取り組んでいます。 日々学んだことや経験したことを整理していきたいと思い、ブログを始めました。旅行、カメラ、IT技術、江戸文化が大好きですので、これらについても記事にしていきたいと思っています。