MLflow を使用して Azure Machine Learning でモデル レジストリを管理する

Azure Machine Learning では、ワークスペースに接続している場合、モデル管理用の MLflow がサポートされています。 このようなアプローチは、MLFlow クライアントに精通しているユーザーのモデル ライフサイクル全体をサポートする便利な方法を示しています。 次の記事では、さまざまな機能と、他のオプションとの比較について説明します。

前提条件

  • MLflow SDK パッケージ mlflow と MLflow 用の Azure Machine Learning プラグイン azureml-mlflow をインストールします。

    pip install mlflow azureml-mlflow
    

    ヒント

    SQL ストレージ、サーバー、UI、またはデータ サイエンスの依存関係のない軽量 MLflow パッケージであるパッケージ mlflow-skinny を使用できます。 主に追跡機能とログ機能を必要とし、デプロイを含む MLflow の全機能はインポートしないユーザーには、mlflow-skinny が推奨されます。

  • Azure Machine Learning ワークスペース。 「機械学習リソースの作成に関するチュートリアル」に従って作成できます。

  • リモート追跡 (Azure Machine Learning の外部で実行されている実験の追跡) を実行している場合は、Azure Machine Learning ワークスペースの追跡 URI を指すように MLflow を構成します。 MLflow をワークスペースに接続する方法の詳細については、「Azure Machine Learning 用に MLflow を構成する」を参照してください。

  • 組織レジストリは、MLflow を使用したモデル管理でサポートされていないことに注意してください。

  • 一部の操作は、MLflow fluent API (mlflow.<method>) を使用して直接実行できる場合があります。 ただし、MLflow プロトコルでの Azure Machine Learning との通信を可能にする MLflow クライアントを作成する必要がある場合もあります。 MlflowClient オブジェクトを作成する方法は、次のとおりです。 このチュートリアルでは、このような MLflow クライアントを参照するのに、オブジェクト client を使用します。

    import mlflow
    
    client = mlflow.tracking.MlflowClient()
    

レジストリに新しいモデルを登録する

モデル レジストリは、ワークスペースでモデルを管理するための便利で一元的な方法を提供します。 各ワークスペースには、独自の独立したモデル レジストリがあります。 次のセクションでは、MLflow SDK を使用してレジストリにモデルを登録する複数の方法について説明します。

既存の実行からのモデルの作成

MLflow モデルが実行の内部でログ記録されていて、それをレジストリに登録する場合は、モデルがログ記録された実行 ID とパスを使用します。 これがない場合に、この情報をクエリする方法については、「MLflow を使用した実験と実行の管理」を参照してください。

mlflow.register_model(f"runs:/{run_id}/{artifact_path}", model_name)

Note

モデルは、実行が追跡されたのと同じワークスペース内のレジストリだけに登録できます。 クロス ワークスペース操作が現時点では Azure Machine Learning でサポートされていません。

ヒント

実行からモデルを登録するか、実行内からメソッド mlflow.<flavor>.log_model を使用してモデルを登録することをお勧めします。これにより、資産を生成したジョブからの系列が保持されるためです。

アセットからのモデルの作成

MLModel MLflow モデルを含むフォルダーがある場合は、直接登録できます。 実行のコンテキストで常にモデルを使用する必要はありません。 これを行うには、URI スキーマ file://path/to/model を使用して、ローカル ファイル システムに格納されている MLflow モデルを登録できます。 Scikit-Learn を使用して単純なモデルを作成し、ローカル ストレージに MLflow 形式で保存してみましょう。

from sklearn import linear_model

reg = linear_model.LinearRegression()
reg.fit([[0, 0], [1, 1], [2, 2]], [0, 1, 2])

mlflow.sklearn.save_model(reg, "./regressor")

ヒント

このメソッド save_model()log_model() と同じように動作します。 log_model() がモデルをアクティブな実行で内部に保存しますが、save_model() はローカル ファイル システムをモデルの保存で使用します。

これで、ローカル パスからモデルを登録できるようになりました。

import os

model_local_path = os.path.abspath("./regressor")
mlflow.register_model(f"file://{model_local_path}", "local-model-test")

モデル レジストリのクエリ

MLflow SDK を使用して、レジストリに登録されているモデルのクエリと検索を行うことができます。 次のセクションでは、それを実現する複数の方法について説明します。

レジストリ内のすべてのモデルのクエリを実行する

MLflow クライアントを使用して、レジストリに登録されているすべてのモデルに対してクエリを実行できます。 次の例では、すべてのモデルの名前を出力します。

for model in client.search_registered_models():
    print(f"{model.name}")

order_by を使用して、nameversioncreation_timestamplast_updated_timestamp などの特定のプロパティで並べ替えます。

client.search_registered_models(order_by=["name ASC"])

注意

MLflow 2.0 アドバイザリ: 以前のバージョンの Mlflow (<2.0) の場合は、代わりにメソッド MlflowClient.list_registered_models() を使います。

モデルの特定のバージョンの取得

search_registered_models() コマンドは、すべてのモデル バージョンを含むモデル オブジェクトを取得します。 ただし、特定のモデルの最後に登録されたモデル バージョンを取得する場合は、次のように get_registered_model を使用できます。

client.get_registered_model(model_name)

モデルの特定のバージョンが必要な場合は、次のように示すことができます。

client.get_model_version(model_name, version=2)

レジストリからのモデルの読み込み

レジストリからモデルを直接読み込んで、ログに記録されたモデル オブジェクトを復元できます。 次の構文を使用して、読み込むモデルの URI を示す関数 mlflow.<flavor>.load_model() または mlflow.pyfunc.load_model() を使用します。

  • models:/<model-name>/latest: モデルの最新のバージョンを読み込みます。
  • models:/<model-name>/<version-number>: モデルの特定のバージョンを読み込みます。
  • models:/<model-name>/<stage-name>: モデルの特定のステージで特定のバージョンを読み込みます。 詳細については「モデルのステージ」を参照してください。

ヒント

mlflow.<flavor>.load_model()mlflow.pyfunc.load_model() の違いについては、MLflow モデルを読み込むためのワークフローに関する記事を参照してください。

モデルのステージ

MLflow では、モデルのライフサイクルを管理するためのモデルのステージがサポートされています。 モデルのバージョンは、あるステージから別のステージに移行できます。 ステージはモデルのバージョン (モデルではなく) に割り当てられます。つまり、特定のモデルが異なるステージで複数のバージョンを持つことができます。

重要

ステージには、MLflow SDK を使用してのみアクセスできます。 Azure ML Studio ポータルには表示されないため、Azure ML SDK、Azure ML CLI、Azure ML REST API を使用して取得することはできません。 特定のモデルのステージからのデプロイの作成は、現時点ではサポートされていません。

モデル ステージのクエリ

次のように、MLflow クライアントを使用して、モデルで可能なすべてのステージを確認できます。

client.get_model_version_stages(model_name, version="latest")

レジストリからモデルを取得することで、各ステージでモデルのバージョンを確認できます。 次の例では、現在ステージ Staging にあるモデルのバージョンを取得します。

client.get_latest_versions(model_name, stages=["Staging"])

Note

Mlflow では、複数のバージョンが同時に同じステージに存在する可能性があります。ただし、このメソッドはそれらのすべてから最新バージョン (より大きいバージョン) を返します。

警告

ステージ名の大文字と小文字は区別されます。

モデルの移行

モデルのバージョンを特定のステージに移行するには、MLflow クライアントを使用します。

client.transition_model_version_stage(model_name, version=3, stage="Staging")

既定では、その特定のステージに既存のモデル バージョンがあった場合は、それはそこに残ります。 そのため、複数のモデルのバージョンが同時に同じステージにある可能性があるため、置き換えられません。 または、既存のモデルのバージョンをステージ Archived に移動するように archive_existing_versions=True を指定して MLflow に指示することもできます。

client.transition_model_version_stage(
    model_name, version=3, stage="Staging", archive_existing_versions=True
)

ステージからのモデルの読み込み

load_model 関数と次の URI 形式を使用して、Python から特定のステージのモデルを直接読み込むことができます。 この方法を成功させるためには、作業中の環境にすべてのライブラリと依存関係が既にインストールされている必要があることに注意してください。

model = mlflow.pyfunc.load_model(f"models:/{model_name}/Staging")

モデルの編集と削除

登録済みモデルの編集は、Mlflow と Azure ML の両方でサポートされています。 ただし、注意すべき重要な違いがいくつかあります。

警告

モデル オブジェクトは不変であるため、Azure Machine Learning ではモデルの名前変更はサポートされていません。

モデルの編集

Mlflow を使用して、モデルの説明とタグを編集できます。

client.update_model_version(model_name, version=1, description="My classifier description")

タグを編集するには、次のようにメソッド set_model_version_tag および remove_model_version_tag を使用する必要があります。

client.set_model_version_tag(model_name, version="1", key="type", value="classification")

次のようにタグを削除します。

client.delete_model_version_tag(model_name, version="1", key="type")

モデルのバージョンの削除

次の例に示すように、MLflow クライアントを使用してレジストリ内の任意のモデル バージョンを削除できます。

client.delete_model_version(model_name, version="2")

Note

Azure Machine Learning では、モデル コンテナー全体の削除はサポートされていません。 同じことを実現するには、特定のモデルからすべてのモデル バージョンを削除する必要があります。

MLflow を使用してモデルを管理するためのサポート マトリックス

MLflow クライアントでは、モデルを取得および管理するためのいくつかのメソッドが公開されています。 次の表は、Azure ML に接続したときに MLflow で現在サポートされているメソッドを示しています。 また、Azure ML の他のモデル管理機能と比較しています。

機能 MLflow MLflow を使用した Azure ML Azure ML CLIv2 Azure ML Studio
MLflow 形式でのモデルの登録
MLflow 形式以外でのモデルの登録
実行出力または成果物からのモデルの登録 1 2
実行出力/成果物からのモデルを別の追跡サーバー/ワークスペースで登録する 5 5
登録済みモデルの検索/一覧表示
登録済みモデルのバージョンの詳細の取得
登録済みモデルのバージョンの説明の編集
登録済みモデルのバージョンのタグの編集
登録済みモデルの名前変更 3 3 3
登録済みモデル (コンテナー) の削除 3 3 3
登録済みモデルのバージョンの削除
MLflow モデル ステージの管理
登録済みモデルを名前で検索 4
文字列比較器 LIKEILIKE を使用して登録済みモデルを検索し 4
登録済みモデルをタグで検索 4
組織レジストリのサポート

Note

  • 1 形式 runs:/<ruin-id>/<path> で URI を使用します。
  • 2 形式 azureml://jobs/<job-id>/outputs/artifacts/<path> で URI を使用します。
  • 3 登録されたモデルは、Azure ML の不変オブジェクトです。
  • 4 Azure ML Studio で検索ボックスを使用します。 部分一致がサポートされています。
  • 5レジストリを使って、系列を維持しながら、異なるワークスペース間でモデルを移動します。

次のステップ