MLflow を使用して Azure Machine Learning でモデル レジストリを管理する
Azure Machine Learning では、ワークスペースに接続している場合、モデル管理用の MLflow がサポートされています。 このアプローチは、MLFlow クライアントに精通しているユーザーにとって、モデルのライフサイクル全体をサポートする便利な方法です。
この記事では、MLflow を使用してモデル レジストリを管理するための機能と、この方法と他の管理オプションとの比較について説明します。
前提条件
MLflow SDK パッケージ
mlflow
と MLflow 用の Azure Machine Learningazureml-mlflow
プラグインをインストールします。pip install mlflow azureml-mlflow
ヒント
SQL ストレージ、サーバー、UI、またはデータ サイエンスの依存関係のない軽量 MLflow パッケージであるパッケージ
mlflow-skinny
を使用できます。 主に必要とするのは MLflow の追跡およびログ機能であり、デプロイを含め、完全な機能のスイートのインポートは必要としないユーザーにはmlflow-skinny
が推奨されます。Azure Machine Learning ワークスペース。 ワークスペースを作成するには、「機械学習リソースの作成チュートリアル」を参照してください。 ワークスペース内で MLflow 操作を実行するために必要なアクセス許可を確認します。
リモート追跡 (つまり、Azure Machine Learning の外部で実行されている実験の追跡) を実行する場合は、Azure Machine Learning ワークスペースの追跡 URI を指すように MLflow を構成します。 MLflow をワークスペースに接続する方法の詳細については、「Azure Machine Learning 用に MLflow を構成する」を参照してください。
この記事の手順では、
client
オブジェクトを使用して MLflow クライアントを参照します。一部の操作は、MLflow fluent API (
mlflow.<method>
) を使用して直接実行できます。 その他の操作では、MLflow プロトコルで Machine Learning との通信を有効にするために MLflow クライアントが必要です。 次のコードでは、MlflowClient
オブジェクトを作成します。import mlflow client = mlflow.tracking.MlflowClient()
制限事項
Azure Machine Learning では、モデルの名前変更はサポートされていません。
Machine Learning では、モデル コンテナー全体の削除はサポートされていません。
組織レジストリは、MLflow を使用したモデル管理ではサポートされていません。
特定のモデル ステージからのモデル デプロイは、Machine Learning では現在サポートされていません。
ワークスペース間の操作は、Machine Learning では現在サポートされていません。
新しいモデルを登録する
モデル レジストリは、ワークスペースでモデルを管理するための便利で一元的な方法を提供します。 各ワークスペースには、独自の独立したモデル レジストリがあります。 次のセクションでは、MLflow SDK を使用してモデルをレジストリに登録する 2 つの方法を示します。
既存の実行からモデルを作成する
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 を使用して、レジストリに登録されているモデルのクエリと検索を行うことができます。 次のセクションでは、モデルに対してクエリを実行する 2 つの方法を示します。
レジストリ内のすべてのモデルに対してクエリを実行する
MLflow クライアントを使用して、レジストリに登録されているすべてのモデルに対してクエリを実行できます。
次のコードは、レジストリ内のすべてのモデルの名前を出力します。
for model in client.search_registered_models():
print(f"{model.name}")
order_by
メソッドを使用して、name
、version
、creation_timestamp
、last_updated_timestamp
などの特定のプロパティで出力を整理します。
client.search_registered_models(order_by=["name ASC"])
Note
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)
レジストリからモデルを読み込む
レジストリからモデルを直接読み込んで、ログに記録されたモデル オブジェクトを復元できます。 このタスクでは、関数 mlflow.<flavor>.load_model()
または mlflow.pyfunc.load_model()
を使用して、読み込むモデルの URI を指定します。
これらの関数は、次の構文を使用して実装できます。
models:/<model-name>/latest
: モデルの最新のバージョンを読み込みます。models:/<model-name>/<version-number>
: モデルの特定のバージョンを読み込みます。models:/<model-name>/<stage-name>
: モデルの特定のステージで特定のバージョンを読み込みます。 詳細については、「モデル ステージを操作する」を参照してください。
関数 mlflow.<flavor>.load_model()
と mlflow.pyfunc.load_model()
の違いを理解するには、「MLflow モデルを読み込むためのワークフロー」を参照してください。
モデル ステージを操作する
MLflow では、モデルのライフサイクルを管理するためのモデルのステージがサポートされています。 モデル バージョンは、あるステージから別のステージに移行できます。 ステージはモデルの特定のバージョンに割り当てられます。 1 つのモデルが異なるステージで複数のバージョンを持つことができます。
重要
ステージには、MLflow SDK を使用してのみアクセスできます。 これらは Azure Machine Learning スタジオには表示されません。 Azure Machine Learning SDK、Azure Machine Learning CLI、または Azure Machine Learning REST API を使用してステージを取得することはできません。 特定のモデル ステージからのデプロイは現在サポートされていません。
モデル ステージに対してクエリを実行する
次のコードは、MLflow クライアントを使用して、モデルで可能なすべてのステージを確認します。
client.get_model_version_stages(model_name, version="latest")
レジストリからモデルを取得すると、各モデル ステージのモデル バージョンを確認できます。 次のコードは、現在 Staging
ステージにあるモデル バージョンを取得します。
client.get_latest_versions(model_name, stages=["Staging"])
MLflow では、複数のモデル バージョンが同時に同じステージに存在する可能性があります。 前の例では、メソッドはステージのすべてのバージョンの中で最後 (最新) のバージョンを返します。
重要
MLflow SDK では、ステージ名は大文字と小文字が区別されます。
モデル バージョンを移行する
MLflow クライアントを使用して、モデル バージョンを特定のステージに移行できます。
client.transition_model_version_stage(model_name, version=3, stage="Staging")
モデル バージョンを特定のステージに移行する場合、そのステージに既に他のモデル バージョンが存在する場合、既存のバージョンは変更されません。 この動作は既定で適用されます。
もう 1 つの方法は、移行中に archive_existing_versions=True
パラメーターを設定することです。 このアプローチでは、既存のモデル バージョンをステージ Archived
に移動するように MLflow に指示します。
client.transition_model_version_stage(
model_name, version=3, stage="Staging", archive_existing_versions=True
)
ステージからモデルを読み込む
load_model
関数と次の URI 形式を使用して、Python から特定のステージのモデルを直接読み込むことができます。 このメソッドを成功させるには、すべてのライブラリと依存関係が作業環境にインストールされている必要があります。
Staging
ステージからモデルを読み込みます。
model = mlflow.pyfunc.load_model(f"models:/{model_name}/Staging")
モデルを編集および削除する
登録済みモデルの編集は MLflow と Azure Machine Learning の両方でサポートされていますが、いくつか重要な違いがあります。 次のセクションでは、いくつかのオプションについて説明します。
Note
モデル オブジェクトは不変であるため、Azure Machine Learning ではモデルの名前変更はサポートされていません。
モデルの説明とタグを編集する
MLflow SDK を使用してモデルの説明とタグを編集できます。
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")
タグを削除するには、delete_model_version_tag
メソッドを使用します。
client.delete_model_version_tag(model_name, version="1", key="type")
モデル バージョンの削除
MLflow クライアントを使用してレジストリ内の任意のモデル バージョンを削除できます。
client.delete_model_version(model_name, version="2")
Note
Machine Learning では、モデル コンテナー全体の削除はサポートされていません。 このタスクを実行するには、特定のモデルのすべてのモデル バージョンを削除します。
モデル管理でサポートされている機能を確認する
MLflow クライアントでは、モデルを取得および管理するためのいくつかのメソッドが公開されています。 次の表は、Azure Machine Learning に接続したときに MLflow で現在サポートされているメソッドを一覧で示しています。 また、この表では MLflow を Azure Machine Learning の他のモデル管理機能と比較しています。
機能の説明 |
MLflow のみ | MLflow を使用した Machine Learning | Machine Learning CLI v2 | Machine Learning スタジオ |
---|---|---|---|---|
MLflow 形式でモデルを登録する | ✓ | ✓ | ✓ | ✓ |
MLflow 形式以外でモデルを登録する | ✓ | ✓ | ||
実行出力/成果物からモデルを登録する | ✓ | ✓ 1 | ✓ 2 | ✓ |
実行出力/成果物からモデルを別の追跡サーバー/ワークスペースに登録する | ✓ | ✓ 5 | ✓ 5 | |
登録済みモデルの検索/一覧表示 | ✓ | ✓ | ✓ | ✓ |
登録済みモデルのバージョンの詳細の取得 | ✓ | ✓ | ✓ | ✓ |
登録済みモデルのバージョンの説明を編集する | ✓ | ✓ | ✓ | ✓ |
登録済みモデルのバージョンのタグを編集する | ✓ | ✓ | ✓ | ✓ |
登録済みモデルの名前を変更する | ✓ | 3 | 3 | 3 |
登録済みモデル (コンテナー) を削除する | ✓ | 3 | 3 | 3 |
登録済みモデルのバージョンを削除する | ✓ | ✓ | ✓ | ✓ |
MLflow モデル ステージの管理 | ✓ | ✓ | ||
登録済みモデルを名前で検索 | ✓ | ✓ | ✓ | ✓ 4 |
文字列比較演算子 LIKE および ILIKE を使用して登録モデルを検索する |
✓ | ✓ 4 | ||
登録済みモデルをタグで検索 | ✓ 4 | |||
組織レジストリのサポート | ✓ | ✓ |
表の脚注:
- 1
runs:/<ruin-id>/<path>
形式の Uniform Resource Identifiers (URI) を使用します。 - 2
azureml://jobs/<job-id>/outputs/artifacts/<path>
形式の URI を使用します。 - 3 登録されたモデルは、Azure Machine Learning の不変オブジェクトです。
- 4 Azure Machine Learning スタジオの検索ボックスを使用します。 部分一致がサポートされています。
- 5 レジストリを使用して、異なるワークスペース間でモデルを移動し、系統を保持します。