Unity Catalog 内でモデル ライフサイクルを管理する
重要
- この記事では、Databricks でモデルの管理とデプロイに推奨される Unity Catalog のモデルについて説明します。 ワークスペースで Unity Catalog が有効になっていない場合、このページの機能は使用できません。 代わりに、「ワークスペース モデル レジストリを使用してモデルのライフサイクルを管理する」を参照してください。 ワークスペース モデル レジストリから Unity Catalog にアップグレードする方法のガイダンスについては、「ワークフローおよびモデルの Unity Catalog への移行」を参照してください。
- Unity Catalog のモデルは、Azure Government リージョンでは使用できません。
この記事では、ML モデルのライフサイクル全体を管理する機械学習ワークフローの一部として Unity Catalog のモデルを使用する方法について説明します。 Databricks は、Unity Catalog 内でホステッド バージョンの MLflow モデル レジストリを提供しています。 Unity Catalog のモデルは、Unity Catalog の利点を ML モデルに拡張します。これには、ワークスペース全体の一元的なアクセス制御、監査、系列、モデル検出が含まれます。 Unity Catalog のモデルは、オープンソースの MLflow Python クライアントと互換性があります。
モデル レジストリの概念の概要については、「MLflow を使用した ML ライフサイクル管理」を参照してください。
要件
Unity Catalog はワークスペースで有効になっている必要があります。 「Unity Catalog の使用の開始」を参照して、Unity Catalog メタストアを作成し、それをワークスペースで有効にし、カタログを作成します。 Unity カタログが有効になっていない場合は、ワークスペース モデル レジストリを使用してください。
Unity カタログにアクセスできるコンピューティング リソースを使用する必要があります。 ML ワークロードの場合、これは、コンピューティングのアクセス モードが Single ユーザーでなければならないことを意味します。 詳細については、「アクセス モード」を参照してください。
新しく登録済みモデルを作成するには、次の権限が必要です。
- スキーマとその包含カタログに対する
USE SCHEMA
およびUSE CATALOG
の権限。 - スキーマに対する
CREATE_MODEL
権限。 この権限を付与するには、カタログ エクスプローラー UI または次の SQL GRANT コマンドを使用します。
GRANT CREATE_MODEL ON SCHEMA <schema-name> TO <principal>
- スキーマとその包含カタログに対する
Note
ワークスペースは、権限継承をサポートする Unity Catalog メタストアにアタッチされている必要があります。 これは、2022 年 8 月 25 日より後に作成されたすべてのメタストアに当てはまります。 古いメタストアで実行している場合は、ドキュメントに従ってアップグレードしてください。
Unity カタログ用の MLflow クライアントをインストールして構成する
このセクションでは、Unity カタログ用の MLflow クライアントをインストールして構成する手順について説明します。
MLflow Python クライアントをインストールする
Unity カタログでのモデルのサポートは、Databricks Runtime 13.2 ML 以降 (Azure China では Databricks Runtime 15.0 ML 以降) に含まれています。
以下のコードを使い、最新バージョンの MLflow Python クライアントをノートブックにインストールして、Databricks Runtime 11.3 LTS 以降の Unity カタログのモデルも使用できます。
%pip install --upgrade "mlflow-skinny[databricks]"
dbutils.library.restartPython()
Unity Catalog のモデルにアクセスするように MLflow クライアントを構成する
ワークスペースの既定のカタログが (hive_metastore
ではなく) Unity カタログ内にあり、Databricks Runtime 13.3 LTS 以降 (Azure China リージョンでは Databricks Runtime 15.0 以降) を使ってクラスターを実行している場合、モデルは自動的に既定のカタログ内に作成され、そこから読み込まれます。 この手順を実行する必要はありません。
その他のワークスペースでは、MLflow Python クライアントは Databricks ワークスペースのモデル レジストリにモデルを作成します。 Unity カタログ内のモデルにアップグレードするには、MLflow クライアントを構成するために、ノートブックで次のコードを使用します。
import mlflow
mlflow.set_registry_uri("databricks-uc")
2024 年 1 月以前に既定のカタログが Unity カタログ内のカタログに構成され、2024 年 1 月以前にワークスペース モデル レジストリが使用されていたワークスペースが少数存在する場合、上記のコマンドを使用して既定のカタログを Unity カタログに手動で設定する必要があります。
Unity カタログ互換モデルのトレーニングと登録
必要な権限: 新しい登録済みモデルを作成するには、外側のスキーマに対する CREATE_MODEL
および USE SCHEMA
権限、そして外側のカタログに対する USE CATALOG
権限が必要です。 登録済みモデルの下に新しいモデル バージョンを作成するには、登録済みモデルの所有者であり、モデルを含むスキーマとカタログに対する USE SCHEMA
および USE CATALOG
権限を持っている必要があります。
UC の ML モデル バージョンには、モデル シグネチャが必要です。 モデル トレーニング ワークロードでまだシグネチャを使用して MLflow モデルのログ記録を行っていない場合は、次のいずれかを実行できます。
- Databricks の自動ログを使用します。これは、多くの一般的な ML フレームワーク向けのシグネチャを使用してモデルのログ記録を自動的に行います。 MLflow ドキュメントでサポートされているフレームワークを確認してください。
- MLflow 2.5.0 以降では、
mlflow.<flavor>.log_model
呼び出しで入力例を指定でき、モデル署名が自動的に推論されます。 詳細については、「MLflow ドキュメント」を参照してください。
次に、モデルの 3 レベルの名前を MLflow API に <catalog>.<schema>.<model>
という形式で渡します。
このセクションの例では、ml_team
カタログの下の prod
スキーマにモデルを作成し、アクセスします。
このセクションのモデル トレーニングの例では、新しいモデル バージョンを作成し、それを prod
カタログに登録します。 prod
カタログを使用しても、そのモデル バージョンが運用トラフィックに対応するとは限りません。 モデル バージョンを囲むカタログ、スキーマ、および登録モデルは、その環境 (prod
) および関連するガバナンス ルール (たとえば、管理者のみが prod
カタログから削除できるように権限を設定できます) を反映しますが、デプロイの状態は反映しません。 デプロイの状態を管理するには、モデル エイリアスを使用します。
自動ログを使用して Unity Catalog にモデルを登録する
モデルを登録するには、MLflow Client API register_model()
メソッドを使用します。 mlflow.register_model を参照してください。
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
# Train a sklearn model on the iris dataset
X, y = datasets.load_iris(return_X_y=True, as_frame=True)
clf = RandomForestClassifier(max_depth=7)
clf.fit(X, y)
# Note that the UC model name follows the pattern
# <catalog_name>.<schema_name>.<model_name>, corresponding to
# the catalog, schema, and registered model name
# in Unity Catalog under which to create the version
# The registered model will be created if it doesn't already exist
autolog_run = mlflow.last_active_run()
model_uri = "runs:/{}/model".format(autolog_run.info.run_id)
mlflow.register_model(model_uri, "prod.ml_team.iris_model")
API を使用してモデルを登録する
mlflow.register_model(
"runs:/<run_uuid>/model", "prod.ml_team.iris_model"
)
自動的に推測された署名を使用してモデルを Unity Catalog に登録する
自動的に推論される署名のサポートは、MLflow バージョン 2.5.0 以降で利用でき、Databricks Runtime 11.3 LTS ML 以降でサポートされます。 自動的に推論された署名を使用するには、次のコードを使用して最新の MLflow Python クライアントをノートブックにインストールします。
%pip install --upgrade "mlflow-skinny[databricks]"
dbutils.library.restartPython()
次のコードは、自動的に推論された署名の例を示しています。
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
with mlflow.start_run():
# Train a sklearn model on the iris dataset
X, y = datasets.load_iris(return_X_y=True, as_frame=True)
clf = RandomForestClassifier(max_depth=7)
clf.fit(X, y)
# Take the first row of the training dataset as the model input example.
input_example = X.iloc[[0]]
# Log the model and register it as a new version in UC.
mlflow.sklearn.log_model(
sk_model=clf,
artifact_path="model",
# The signature is automatically inferred from the input example and its predicted output.
input_example=input_example,
registered_model_name="prod.ml_team.iris_model",
)
UI を使用してモデルを登録する
次のステップを実行します。
実験実行ページ UI の右上隅で [モデルを登録] リンクをクリックします。
ダイアログで [Unity Catalog] を選択し、ドロップダウン リストからターゲット モデルを選択します。
[登録] をクリックします。
モデルの登録には時間がかかる場合があります。 進行状況を監視するには、Unity Catalog のターゲット モデルに移動し、定期的に更新します。
別名を使用してモデルをデプロイする
モデル エイリアスを使用すると、登録済みモデルの特定のバージョンに変更可能な名前付き参照を割り当てることができます。 エイリアスを使用して、モデル バージョンのデプロイの状態を示すことができます。 たとえば、現在運用中のモデル バージョン “Champion” エイリアスを割り当て、運用モデルを使用するワークロードでこのエイリアスをターゲットにすることができます。 その後、“Champion” エイリアスを別のモデル バージョンに再割り当てすることで、運用モデルを更新できます。
モデルのエイリアスの設定と削除
必要な権限: 登録済みモデルの所有者、およびモデルを含むスキーマとカタログに対する USE SCHEMA
および USE CATALOG
権限。
カタログ エクスプローラーを使用して、Unity Catalog 内のモデルの別名を設定、更新、および削除できます。 モデルの詳細ページで登録済みモデル全体のエイリアスを管理したり、モデル バージョンの詳細ページで特定のモデル バージョンのエイリアスを構成したりできます。
MLflow Client API を使用してエイリアスを設定、更新、削除するには、以下の例を参照してください。
from mlflow import MlflowClient
client = MlflowClient()
# create "Champion" alias for version 1 of model "prod.ml_team.iris_model"
client.set_registered_model_alias("prod.ml_team.iris_model", "Champion", 1)
# reassign the "Champion" alias to version 2
client.set_registered_model_alias("prod.ml_team.iris_model", "Champion", 2)
# get a model version by alias
client.get_model_version_by_alias("prod.ml_team.iris_model", "Champion")
# delete the alias
client.delete_registered_model_alias("prod.ml_team.iris_model", "Champion")
別名クライアント API の詳細については、MLflow API ドキュメントを参照してください。
推論ワークロードの別名によるモデル バージョンの読み込み
必要な権限: 登録済みモデルに対する EXECUTE
権限、そしてモデルを含むスキーマとカタログに対する USE SCHEMA
および USE CATALOG
権限。
モデル バージョンを別名で参照するバッチ推論ワークロードを記述できます。 次のスニペットは、バッチ推論に “Champion” モデル バージョンを読み込んで適用します。 “Champion” バージョンが新しいモデル バージョンを参照するように更新されると、バッチ推論ワークロードは次の実行でそれを自動的に取得します。 これにより、モデル デプロイをバッチ推論ワークロードから切り離すことができます。
import mlflow.pyfunc
model_version_uri = "models:/prod.ml_team.iris_model@Champion"
champion_version = mlflow.pyfunc.load_model(model_version_uri)
champion_version.predict(test_x)
モデル サービス エンドポイントは、別名によってモデル バージョンを参照することもできます。 デプロイ ワークフローを記述して、別名でモデル バージョンを取得し、モデル配信 REST API を使用して、そのバージョンを配信するようにモデル配信エンドポイントを更新することができます。 次に例を示します。
import mlflow
import requests
client = mlflow.tracking.MlflowClient()
champion_version = client.get_model_version_by_alias("prod.ml_team.iris_model", "Champion")
# Invoke the model serving REST API to update endpoint to serve the current "Champion" version
model_name = champion_version.name
model_version = champion_version.version
requests.request(...)
推論ワークロード用にバージョン番号でモデル バージョンを読み込む
次のようにバージョン番号でモデル バージョンを読み込むこともできます。
import mlflow.pyfunc
# Load version 1 of the model "prod.ml_team.iris_model"
model_version_uri = "models:/prod.ml_team.iris_model/1"
first_version = mlflow.pyfunc.load_model(model_version_uri)
first_version.predict(test_x)
ワークスペース間でモデルを共有する
同じリージョンのユーザーとモデルを共有する
適切な権限を持っている限り、モデルを含むメタストアにアタッチされている任意のワークスペースから Unity カタログ内のモデルにアクセスできます。 たとえば、開発ワークスペース内の prod
カタログからモデルにアクセスして、新しく開発されたモデルを運用ベースラインと比較することを支援することができます。
作成した登録済みモデルで他のユーザーと共同作業 (書き込み権限を共有) するには、自分自身および共同作業したいユーザーを含むグループにモデルの所有権を付与する必要があります。 共同作業者には、モデルを含むカタログとスキーマに対する USE CATALOG
および USE SCHEMA
権限も必要です。 詳細については、「Unity Catalog の権限とセキュリティ保護可能なオブジェクト」を参照してください。
別のリージョンまたはアカウントのユーザーとモデルを共有する
他のリージョンまたはアカウントのユーザーとモデルを共有するには、Delta Sharing の Databricks 間共有フローを使用します。 「共有にモデルを追加する」 (プロバイダーの場合) と「Databricks-to-Databricks モデルでアクセスする」 (受信者の場合) を参照してください。 受信者は、共有からカタログを作成した後、その共有カタログ内のモデルに Unity カタログ内の他のモデルと同じ方法でアクセスします。
Unity Catalog でモデルのデータ系列を追跡する
Note
Unity Catalog でのテーブルからモデルへの系列のサポートは、MLflow 2.11.0 以降で利用できます。
Unity Catalog のテーブルでモデルをトレーニングする場合、モデルのトレーニングおよび評価の元になったアップストリーム データセットに対してモデルの系列を追跡できます。 これを行うには、mlflow.log_input を使用します。 これにより、モデルを生成した MLflow 実行で入力テーブル情報が保存されます。 データ系列は、機能ストア API を使用してログに記録されたモデルに対しても自動的にキャプチャされます。 「特徴量ガバナンスと系統」を参照してください。
モデルを Unity Catalog に登録すると、系列情報が自動的に保存され、カタログ エクスプローラーのモデル バージョン UI の [系列] タブに表示されます。
次のコードは例を示します。
import mlflow
import pandas as pd
import pyspark.pandas as ps
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestRegressor
# Write a table to Unity Catalog
iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df.rename(
columns = {
'sepal length (cm)':'sepal_length',
'sepal width (cm)':'sepal_width',
'petal length (cm)':'petal_length',
'petal width (cm)':'petal_width'},
inplace = True
)
iris_df['species'] = iris.target
ps.from_pandas(iris_df).to_table("prod.ml_team.iris", mode="overwrite")
# Load a Unity Catalog table, train a model, and log the input table
dataset = mlflow.data.load_delta(table_name="prod.ml_team.iris", version="0")
pd_df = dataset.df.toPandas()
X = pd_df.drop("species", axis=1)
y = pd_df["species"]
with mlflow.start_run():
clf = RandomForestRegressor(n_estimators=100)
clf.fit(X, y)
mlflow.log_input(dataset, "training")
# Take the first row of the training dataset as the model input example.
input_example = X.iloc[[0]]
# Log the model and register it as a new version in UC.
mlflow.sklearn.log_model(
sk_model=clf,
artifact_path="model",
# The signature is automatically inferred from the input example and its predicted output.
input_example=input_example,
registered_model_name="prod.ml_team.iris_classifier",
)
モデルへのアクセスの制御
Unity Catalog では、登録済みモデルは FUNCTION
セキュリティ設定が可能なオブジェクトのサブタイプです。 Unity Catalog に登録されているモデルへのアクセスを許可するには、GRANT ON FUNCTION
を使用します。 詳細については、「Unity Catalog の権限とセキュリティ設定が可能なオブジェクト」を参照してください。 カタログとスキーマ全体でモデルを整理するためのベスト ベスト プラクティスについては、「データの整理」を参照してください。
Grants REST API を使用して、モデルのアクセス許可をプログラムで構成できます。 モデルのアクセス許可を構成するには、REST API 要求で securable_type
を "FUNCTION"
に設定します。 たとえば、登録されたモデルのアクセス許可を更新するには、PATCH /api/2.1/unity-catalog/permissions/function/{full_name}
を使用します。
UI でモデルを表示する
必要な権限: 登録済みモデルとそのモデル バージョンを UI で表示するには、登録済みモデルに対する EXECUTE
権限と、モデルを含むスキーマとカタログに対する USE SCHEMA
および USE CATALOG
権限が必要です
Catalog Explorer を使用して、Unity Catalog の登録済みモデルとモデル バージョンを表示および管理できます。
モデルの名前を変更する
必要な権限: 登録済みモデルの所有者、登録済みモデルを含むスキーマに対する CREATE_MODEL
権限、そしてモデルを含むスキーマとカタログに対する USE SCHEMA
および USE CATALOG
権限。
登録されているモデルの名前を変更するには、MLflow Client API rename_registered_model()
メソッドを使用します。
client=MlflowClient()
client.rename_registered_model("<full-model-name>", "<new-model-name>")
モデル バージョンをコピーする
Unity Catalog では、あるモデルから別のモデルにモデル バージョンをコピーできます。
UI を使用してモデル バージョンをコピーする
次のステップを実行します。
モデル バージョン ページ UI の右上隅にある [このバージョンをコピー] をクリックします。
ドロップダウン リストからターゲット モデルを選択し、[コピー] をクリックします。
モデルのコピーには時間がかかる場合があります。 進行状況を監視するには、Unity Catalog のターゲット モデルに移動し、定期的に更新します。
API を使用したモデル バージョンのコピー
モデル バージョンをコピーするには、MLflow の copy_model_version() Python API を使用します。
client = MlflowClient()
client.copy_model_version(
"models:/<source-model-name>/<source-model-version>",
"<destination-model-name>",
)
モデルまたはモデル バージョンを削除する
必要な権限: 登録済みモデルの所有者、およびモデルを含むスキーマとカタログに対する USE SCHEMA
および USE CATALOG
権限。
カタログ エクスプローラー UI または API を使用して、登録済みモデルまたは登録済みモデル内のモデル バージョンを削除できます。
警告
この操作を元に戻すことはできません。 モデルを削除すると、Unity Catalog によって保存されているすべてのモデル成果物と、登録済みモデルに関連付けられているすべてのメタデータが削除されます。
UI を使用してモデル バージョンまたはモデルを削除する
Unity カタログでモデルまたはモデル バージョンを削除するには、次の手順に従います。
[モデル] ページまたは [モデル バージョン] のページの右上隅にある [ケバブ] メニュー をクリックします。
[モデル] ページから:
[モデル バージョン] ページから:
[削除] を選択します。
確認ダイアログが表示されます。 [削除] をクリックして確定します。
API を使用してモデル バージョンまたはモデルを削除する
モデル バージョンを削除するには、MLflow Client API delete_model_version()
メソッドを使用します。
# Delete versions 1,2, and 3 of the model
client = MlflowClient()
versions=[1, 2, 3]
for version in versions:
client.delete_model_version(name="<model-name>", version=version)
モデルを削除するには、MLflow Client API delete_registered_model()
メソッドを使用します。
client = MlflowClient()
client.delete_registered_model(name="<model-name>")
モデルでタグを使用する
タグは、登録されたモデルおよびモデルのバージョンに関連付けるキーと値のペアであり、機能またはステータスごとにラベルを付けて分類することができます。 たとえば、キー "task"
と値 "question-answering"
(UI では task:question-answering
として表示される) を持つタグを、質問応答タスクを目的とした登録済みモデルに適用できます。 モデルのバージョン レベルでは、デプロイ前検証中のバージョンに validation_status:pending
をタグ付けし、デプロイのためにクリアされたバージョンには validation_status:approved
をタグ付けできます。
必要な権限: 登録されたモデルに対する APPLY_TAG
権限に加えて、モデルを含むスキーマおよびカタログに対する USE SCHEMA
および USE CATALOG
権限を持つ所有者またはユーザー。
UI を使用してタグを設定および削除する方法については、「カタログ エクスプローラーを使用してタグを追加および更新する」を参照してください。
MLflow Client API を使用してタグを設定および削除するには、以下の例を参照してください。
from mlflow import MlflowClient
client = MlflowClient()
# Set registered model tag
client.set_registered_model_tag("prod.ml_team.iris_model", "task", "classification")
# Delete registered model tag
client.delete_registered_model_tag("prod.ml_team.iris_model", "task")
# Set model version tag
client.set_model_version_tag("prod.ml_team.iris_model", "1", "validation_status", "approved")
# Delete model version tag
client.delete_model_version_tag("prod.ml_team.iris_model", "1", "validation_status")
登録されたモデル タグとモデル バージョン タグは両方とも、プラットフォーム全体の制約を満たす必要があります。
タグ クライアント API の詳細については、「MLflow API ドキュメント」を参照してください。
モデルまたはモデル バージョンに説明 (コメント) を追加する
必要な権限: 登録済みモデルの所有者、およびモデルを含むスキーマとカタログに対する USE SCHEMA
および USE CATALOG
権限。
Unity カタログには、任意のモデルまたはモデル バージョンのテキストの説明を含めることができます。 たとえば、問題の概要や、使用した手法やアルゴリズムに関する情報を提供できます。
モデルの場合は、AI が生成したコメントを使用することもできます。 「AI が生成したコメントを Unity Catalog オブジェクトに追加する」を参照してください。
UI を使用してモデルに説明を追加する
モデルの説明を追加するには、AI が生成したコメントを使用するか、独自のコメントを入力することができます。 必要に応じて、AI が生成したコメントを編集できます。
- 自動的に生成されたコメントを追加するには、[AI 生成] ボタンをクリックします。
- 独自のコメントを追加するには、[追加] をクリックします。 ダイアログにコメントを入力し、[保存] をクリックします。
UI を使用して、モデル バージョンに説明を追加する
Unity カタログのモデル バージョンに説明を追加するには、次の手順に従います。
[モデル バージョン] ページで、[説明] の下にある鉛筆アイコンをクリックします。
ダイアログにコメントを入力し、[保存] をクリックします。
API を使用してモデルとモデル バージョンの説明を追加する
登録済みモデルの説明を更新するには、次のように MLflow Client API の update_registered_model()
メソッドを使用します。
client = MlflowClient()
client.update_registered_model(
name="<model-name>",
description="<description>"
)
モデル バージョンの説明を更新するには、MLflow Client API update_model_version()
メソッドを使用します。
client = MlflowClient()
client.update_model_version(
name="<model-name>",
version=<model-version>,
description="<description>"
)
モデルの一覧表示と検索
Unity カタログ内の登録済みモデルの一覧を取得するには、次のように MLflow の Python API である search_registered_models() を使用します。
client=MlflowClient()
client.search_registered_models()
特定のモデル名を検索し、そのモデルのバージョンに関する情報を取得するには、 search_model_versions()
を使用します。
from pprint import pprint
client=MlflowClient()
[pprint(mv) for mv in client.search_model_versions("name='<model-name>'")]
Note
一部の検索 API フィールドと演算子は、Unity Catalog のモデルではサポートされていません。 詳細については、「制限事項」を参照してください。
モデル ファイルをダウンロードする (高度なユース ケース)
ほとんどの場合、モデルを読み込むには、mlflow.pyfunc.load_model
や mlflow.<flavor>.load_model
などの MLflow API を使用する必要があります (たとえば、HuggingFace モデルの場合は mlflow.transformers.load_model
)。
場合によっては、モデルの動作またはモデルの読み込みの問題をデバッグするために、モデル ファイルをダウンロードする必要があります。 次のように、mlflow.artifacts.download_artifacts
を使用してモデル ファイルをダウンロードできます。
import mlflow
mlflow.set_registry_uri("databricks-uc")
model_uri = f"models:/{model_name}/{version}" # reference model by version or alias
destination_path = "/local_disk0/model"
mlflow.artifacts.download_artifacts(artifact_uri=model_uri, dst_path=destination_path)
環境間でモデルを昇格する
Databricks では、ML パイプラインをコードとしてデプロイすることをお勧めしています。 こうすると、運用環境で自動化されたトレーニング ワークフローを通じてあらゆる運用モデルを作成できるため、環境間でモデルを昇格する必要がなくなります。
ただし、場合によっては、環境間でのモデルの再トレーニングのコストがきわめて高くなることがあります。 代わりに、Unity Catalog に登録されているモデル間でモデル バージョンをコピーして、環境間で昇格させることができます。
以下のコード例を実行するには、次の権限が必要です。
USE CATALOG
およびstaging
カタログに対するprod
。USE SCHEMA
およびstaging.ml_team
スキーマに対するprod.ml_team
。EXECUTE
に対するstaging.ml_team.fraud_detection
。
さらに、登録済みモデル prod.ml_team.fraud_detection
の所有者である必要があります。
次のコード スニペットでは、MLflow バージョン 2.8.0 以上で利用できる copy_model_version
MLflow Client API を使用しています。
import mlflow
mlflow.set_registry_uri("databricks-uc")
client = mlflow.tracking.MlflowClient()
src_model_name = "staging.ml_team.fraud_detection"
src_model_version = "1"
src_model_uri = f"models:/{src_model_name}/{src_model_version}"
dst_model_name = "prod.ml_team.fraud_detection"
copied_model_version = client.copy_model_version(src_model_uri, dst_model_name)
モデル バージョンが運用環境に昇格された後、必要なデプロイ前の検証を実行できます。 次に、別名を使用して、デプロイ用のモデル バージョンをマークできます。
client = mlflow.tracking.MlflowClient()
client.set_registered_model_alias(name="prod.ml_team.fraud_detection", alias="Champion", version=copied_model_version.version)
上記の例では、登録済みモデル staging.ml_team.fraud_detection
から読み取り、登録済みモデル prod.ml_team.fraud_detection
に書き込むことのできるユーザーのみが、ステージング モデルを運用環境に昇格させることができます。 また、同一のユーザーが別名を使用して、運用環境内にデプロイされるモデル バージョンを管理することもできます。 モデルの昇格とデプロイを管理するために、他のルールやポリシーを構成する必要はありません。
このフローをカスタマイズして、セットアップに一致する複数の環境 (dev
、qa
、prod
など) 間でモデル バージョンを昇格させることができます。 アクセスの制御は、各環境で構成されているとおりに適用されます。
ノートブックの例
このノートブック例では、Unity カタログ API のモデルを使用して、モデルとモデル バージョンの登録、説明の追加、モデルの読み込みとデプロイ、モデルエイリアスの使用、モデルとモデルバージョンの削除など、Unity カタログ内のモデルを管理する方法を示します。
Unity カタログノートブックのモデルの例
ノートブック を取得する
ワークフローとモデルを Unity Catalog に移行する
Databricks では、ガバナンスの向上、ワークスペースと環境の間の簡単な共有、柔軟性の高い MLOps ワークフローのために、Unity Catalog のモデルを使用することをお勧めします。 次の表は、ワークスペース モデル レジストリと Unity Catalog の機能を比較したものです。
機能 | ワークスペース モデル レジストリ (レガシ) | Unity Catalog のモデル (推奨) |
---|---|---|
名前付きエイリアスによるモデル バージョンの参照 | モデル レジストリ ステージ: モデル バージョンを 4 つの固定ステージのいずれかに移動し、そのステージで参照します。 ステージの名前変更や追加はできません。 | モデル レジストリ エイリアス: 登録されている各モデルのモデル バージョンへのカスタムおよび再割り当て可能な名前付き参照を最大 10 個作成します。 |
モデルのアクセス制御環境を作成する | モデル レジストリ ステージ: 1 つの登録済みモデル内のステージを使用して、モデル バージョンの環境を示し、4 つの固定ステージのうちの 2 つのみ (Staging および Production ) でアクセス制御を行います。 |
登録済みモデル: 3 レベルの名前空間と Unity Catalog のアクセス許可を利用してガバナンスを表現し、MLOps ワークフロー内の各環境に登録されたモデルを作成します。 |
環境間でのモデルの昇格 (モデルのデプロイ) | transition_model_version_stage() MLflow クライアント API を使用してモデル バージョンを別のステージに移動すると、前のステージを参照するワークフローが中断する可能性があります。 |
copy_model_version() MLflow クライアント API を使用して、登録済みモデル間でモデル バージョンをコピーします。 |
ワークスペース間でモデルにアクセスして共有する | ワークスペース間でモデルを手動でエクスポートおよびインポートするか、個人用アクセス トークンとワークスペース シークレット スコープを使用してリモート モデル レジストリへの接続を構成します。 | 同じアカウント内のワークスペース間でモデルにすぐにアクセスできます。 コンフィギュレーションは必要ありません。 |
権限の構成 | ワークスペース レベルでアクセス許可を設定します。 | アカウント レベルでアクセス許可を設定します。これは、ワークスペース間で一貫したガバナンスを適用します。 |
Databricks マーケットプレースのモデルにアクセスする | 使用不可。 | Databricks マーケットプレースから Unity Catalog メタストアにモデルを読み込み、ワークスペース間でアクセスします。 |
以下のリンク先の記事では、ワークフロー (モデル トレーニングとバッチ推論ジョブ) とモデルをワークスペース モデル レジストリから Unity Catalog に移行する方法について説明します。
制限事項
- ステージは Unity Catalog のモデルではサポートされていません。 Databricks では、Unity Catalog の 3 レベルの名前空間を使用してモデルが置かれている環境を表現し、エイリアスを使用してモデルをデプロイ用に昇格することをお勧めします。 詳細については、「環境間でモデルを昇格させる」を参照してください。
- Webhook は Unity Catalog のモデルではサポートされていません。 アップグレード ガイドで提案されている代替案を参照してください。
- 一部の検索 API フィールドと演算子は、Unity Catalog のモデルではサポートされていません。 これは、サポートされているフィルターを使用して検索 API を呼び出し、結果をスキャンすることで軽減できます。 次は一部の例です。
order_by
パラメーターは、search_model_versions または search_registered_models クライアント API ではサポートされていません。- タグベースのフィルター (
tags.mykey = 'myvalue'
) は、search_model_versions
またはsearch_registered_models
ではサポートされていません。 - 完全等価以外の演算子 (たとえば、
LIKE
、ILIKE
、!=
) は、search_model_versions
またはsearch_registered_models
ではサポートされません。 - 登録されているモデルを名前で検索する(たとえば、
MlflowClient().search_registered_models(filter_string="name='main.default.mymodel'")
はサポートされていません。 特定の登録済みモデルを名前で取得するには、get_registered_model を使用します。
- Unity Catalog では、登録されたモデルおよびモデル バージョンに関するメール通知とコメント ディスカッション スレッドはサポートされていません。
- アクティビティ ログは、Unity Catalog のモデルではサポートされていません。 Unity カタログ内のモデルのアクティビティをトラッキングするには、監査ログを使用します。
search_registered_models
は、Delta Sharing を通じて共有されるモデルに対して古い結果を返す可能性があります。 最新の結果を確認するには、Databricks CLI または SDK を使用してスキーマ内のモデルを一覧表示します。