Unity Catalogでモデルのライフサイクルを管理する

重要

この記事では、機械学習ワークフローの一環としてUnity Catalogのモデルを使用し、MLモデルのライフサイクル全体を管理する方法について説明します。Databricksは、Unity CatalogでMLflow Model Registryのホストされたバージョンを提供しています。Unity Catalogのモデルを使用すると、ワークスペース間での一元的なアクセス制御、監査、リネージ、モデルディスカバリーなど、Unity Catalogの利点をMLモデルに拡張できます。Unity Catalogのモデルは、オープンソースのMLflow Pythonクライアントと互換性があります。

Model Registry概念の概要については、「MLflow を使用した機械学習ライフサイクル管理」を参照してください。

要件

  1. Unity Catalog は、ワークスペースで有効にする必要があります。 「Unity Catalog の使用を開始する」を参照して、Unity Catalog メタストアを作成し、ワークスペースで有効にして、カタログを作成します。Unity Catalogが有効になっていない場合は、ワークスペース モデルレジストリを使用します。

  2. Unity Catalogにアクセスできるコンピュート リソースを使用する必要があります。MLワークロードの場合、これはコンピュートのアクセスモードがシングルユーザーである必要があることを意味します。詳細については、「 アクセス モード」を参照してください。

  3. 新規登録モデルを作成するには、以下の権限が必要です。

    • USE SCHEMA スキーマとそれを囲むカタログに対する USE CATALOG 権限。

    • CREATE_MODEL スキーマに対する特権。 この権限を付与するには、Catalog Explorer UI または次の SQL GRANT コマンドを使用します。

    GRANT CREATE_MODEL ON SCHEMA <schema-name> TO <principal>
    

ワークスペースが、権限の継承をサポートするUnity Catalogメタストアにアタッチされている必要があります。2022年8月25日以降に作成されたすべてのメタストアは、これを満たしています。古いメタストアで実行している場合は、こちらのドキュメントに従ってアップグレードしてください。

Unity Catalog 用の MLflow クライアントをインストールして構成する

このセクションでは、Unity Catalog の MLflow クライアントをインストールして構成する手順について説明します。

MLflow Pythonクライアントをインストールする

Databricks Runtime 13.2 ML以降には、Unity Catalogのモデルのサポートが含まれています。

次のコードを使用して、最新バージョンの MLflow Python クライアントをノートブックにインストールすることで、Databricks Runtime 11.3 LTS 以降の Unity Catalog でモデルを使用することもできます。

%pip install --upgrade "mlflow-skinny[databricks]"
dbutils.library.restartPython()

Unity Catalog内のモデルにアクセスできるようにMLflowクライアントを構成する

ワークスペース のデフォルトカタログ が(hive_metastoreではなく) Unity Catalog にあり、 Databricks Runtime 13.3 LTS 以上を使用してクラスターを実行している場合、モデルは自動的にデフォルトカタログに作成され、デフォルトカタログからロードされます。 この手順を実行する必要はありません。

その他のワークスペースの場合、 MLflow Python クライアントは Databricks ワークスペース モデルレジストリにモデルを作成します。 Unity Catalog のモデルにアップグレードするには、ノートブックで次のコードを使用して MLflow クライアントを構成します。

import mlflow
mlflow.set_registry_uri("databricks-uc")

デフォルト カタログが 2024 年 1 月より前の Unity Catalog カタログに構成され、ワークスペース モデルレジストリが 2024 年 1 月より前に使用された少数のワークスペースでは、上記のコマンドを使用してデフォルト カタログを手動で Unity Catalog に設定する必要があります。

Unity Catalog互換モデルのトレーニングと登録

必要な権限:新しい登録済みモデルを作成するには、それを含むスキーマに対するCREATE_MODEL権限とUSE SCHEMA権限、それを含むカタログに対するUSE CATALOG権限が必要です。登録済みモデルの下に新しいモデルバージョンを作成するには、登録済みモデルの所有者である必要があり、モデルを含むスキーマとカタログに対するUSE SCHEMA権限とUSE CATALOG権限が必要です。

UCのMLモデルバージョンにはモデル署名が必要です。モデルトレーニングワークロードで署名付きのMLflowモデルをまだロギングしていない場合は、以下のいずれかを行うことができます。

  • Databricks の自動ログ記録を使用すると、多くの一般的な機械学習フレームワークの署名を使用して自動的に記録済みモデルが作成されます。サポートされているフレームワークについては、 MLflow のドキュメントを参照してください。

  • MLflow 2.5.0以降では、mlflow.<flavor>.log_modelコールで入力例を指定でき、モデル署名が自動的に推論されます。詳細については、 MLflowドキュメントを参照してください。

次に、モデルの 3 レベル名を <catalog>.<schema>.<model> の形式で MLflow APIsに渡します。

このセクションの例では、 prod カタログの下の ml_team スキーマでモデルを作成し、アクセスします。

本節のモデル学習例では、新しいモデルバージョンを作成し、 prod カタログに登録します。 prodカタログを使用しても、必ずしもモデル バージョンが本番運用トラフィックを処理するとは限りません。モデル バージョンを囲むカタログ、スキーマ、および登録済みモデルには、その環境 (prod) と関連するガバナンス ルール (たとえば、管理者のみが prod カタログから削除できるように特権を設定できます) が反映されますが、デプロイ ステータスは反映されません。 デプロイの状態を管理するには、 モデル エイリアスを使用します。

自動ロギングを使用してモデルをUnity Catalogに登録する

モデルを登録するには、MLflow クライアント API の register_model() メソッドを使用します。 mlflow.登録するを参照してください。

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 を使用してモデルを登録する

以下の手順に従います。

  1. エクスペリメント 実行ページで、UI の右上隅にある [登録する model ] をクリックします。

  2. ダイアログで [Unity Catalog] を選択し、ドロップダウン リストから宛先モデルを選択します。

    登録する Model Version dialog with ドロップダウン menu
  3. 登録」をクリックします。

    登録する [ボタン付きモデルバージョン] ダイアログ

モデルの登録には時間がかかる場合があります。 進行状況を監視するには、Unity Catalog で目的地のモデルに移動し、定期的に更新します。

エイリアスを使用したモデルのデプロイ

モデル エイリアスを使用すると、登録済みモデルの特定のバージョンに変更可能な名前付き参照を割り当てることができます。 エイリアスを使用して、モデルバージョンのデプロイステータスを示すことができます。 たとえば、現在本番運用にあるモデルバージョンに「チャンピオン」エイリアスを割り当て、本番運用モデルを使用するワークロードでこのエイリアスをターゲットにすることができます。 その後、"Champion" エイリアスを別のモデル バージョンに再割り当てすることで、本番運用モデルを更新できます。

モデルのエイリアスの設定と削除

必要な権限:登録されたモデルの所有者である必要があり、そのモデルを含むスキーマとカタログに対するUSE SCHEMA権限とUSE CATALOG権限が必要です。

Unity Catalog のモデルのエイリアスは、 カタログ エクスプローラーを使用して設定、更新、削除できます。 モデルの詳細ページで登録済みモデル全体のエイリアスを管理し、モデルバージョンの詳細ページで特定のモデルバージョンのエイリアスを設定できます。

MLflow クライアント 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")

エイリアス クライアント APIsの詳細については、 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 Catalog内のモデルにアクセスできます。 たとえば、開発ワークスペースのprodカタログからモデルにアクセスすると、新しく開発されたモデルと本番運用ベースラインの比較が容易になります。

作成した登録済みモデルで他のユーザーと共同作業(書き込み権限を共有)するには、自分自身と共同作業したいユーザーが含まれるグループにモデルの所有権を付与する必要があります。共同作業者には、モデルを含むカタログとスキーマに対するUSE CATALOG権限とUSE SCHEMA権限も必要があります。詳細については、「Unity Catalog権限とセキュリティ保護可能なオブジェクト」を参照してください。

別のリージョンまたはアカウントのユーザーとモデルを共有する

他の地域のユーザーまたはアカウントとモデルを共有するには、 Delta Sharing Databricks-to-Databricks共有フロー を使用します。 「共有にモデルを追加する(プロバイダーの場合)」およびDatabricks-to-Databricksモデルでアクセスを取得する(受信者の場合)」を参照してください。 受信者は、共有からカタログを作成した後、Unity Catalog 内の他のモデルと同じ方法でその共有カタログ内のモデルにアクセスします。

Unity Catalog内のモデルのデータリネージを追跡する

Unity Catalogでのテーブルからモデルへのリネージのサポートは、MLflow 2.11.0 以降で利用できます。

Unity Catalogのテーブルでモデルをトレーニングすると、トレーニングおよび評価された上流データセットへのモデルのリネージを追跡できます。 これを行うには、 mlflow.log_inputを使用します。 これにより、モデルを生成した MLflow 実行とともに入力テーブル情報が保存されます。 Feature Store APIsを使用してログに記録されたモデルの場合も、データリネージが自動的にキャプチャされます。 機能ガバナンスとリネージを参照してください。

モデルを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権限が必要です。

カタログ エクスプローラーを使用して、Unity Catalog で登録済みのモデルとモデル バージョンを表示および管理できます。

モデルの名前を変更する

権限が必要:登録されたモデルの所有者である必要があり、登録されたモデルを含むスキーマのCREATE_MODEL権限、モデルを含むスキーマとカタログのUSE SCHEMA権限とUSE CATALOG権限が必要です。

登録されたモデルの名前を変更するには、MLflowクライアントAPIのrename_registered_model()メソッドを使用します。

client=MlflowClient()
client.rename_registered_model("<full-model-name>", "<new-model-name>")

モデル バージョンのコピー

Unity Catalog では、モデルバージョンを 1 つのモデルから別のモデルにコピーできます。

UI を使用したモデルバージョンのコピー

以下の手順に従います。

  1. モデルのバージョンページで、UI の右上隅にある [ このバージョンをコピー ] をクリックします。

  2. ドロップダウンリストから出力先モデルを選択し、[ コピー]をクリックします。

    [モデルバージョンのコピー]ダイアログ

モデルのコピーには時間がかかる場合があります。 進行状況を監視するには、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 Catalogでモデルまたはモデル バージョンを削除するには、次の手順に従います。

  1. モデルページまたはモデルバージョンページで、右上隅にあるケバブメニュー ケバブメニュー をクリックします。

    モデルページから:

    モデルページケバブメニュー削除付き

    モデルバージョンページから:

    モデル版ページケバブメニュー削除付
  2. [削除] を選択します。

  3. 確認ダイアログが表示されます。 [削除] をクリックして確定します。

APIを使用してモデルバージョンまたはモデルを削除する

モデルバージョンを削除するには、MLflowクライアント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クライアント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 クライアント 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")

登録されたモデル タグとモデル バージョン タグは両方とも、プラットフォーム全体の制約を満たす必要があります。

タグ クライアント APIsの詳細については、 MLflow API のドキュメントを参照してください。

モデルまたはモデル バージョンに説明(コメント)を追加する

必要な権限:登録されたモデルの所有者である必要があり、そのモデルを含むスキーマとカタログに対するUSE SCHEMA権限とUSE CATALOG権限が必要です。

Unity Catalog には、任意のモデルまたはモデル バージョンのテキスト説明を含めることができます。 たとえば、問題の概要や、使用された方法論やアルゴリズムに関する情報を提供できます。

モデルの場合、AI が生成したコメントを使用するオプションもあります。 「AI で生成されたコメントを Unity Catalog オブジェクトに追加する」を参照してください。

UI を使用してモデルに説明を追加する

モデルの説明を追加するには、AI が生成したコメントを使用するか、独自のコメントを入力できます。 必要に応じて、AIが生成したコメントを編集できます。

  • 自動生成されたコメントを追加するには、 AI生成 ボタンをクリックします。

  • 独自のコメントを追加するには、[ 追加] をクリックします。 ダイアログにコメントを入力し、[ 保存] をクリックします。

UCモデルの説明ボタン

UI を使用したモデルバージョンへの説明の追加

Unity Catalogでモデルバージョンに説明を追加するには、次の手順に従います。

  1. モデル バージョン ページで、[ 説明] の下にある鉛筆アイコンをクリックします。

    モデルバージョンにコメントを追加するための鉛筆アイコン
  2. ダイアログにコメントを入力し、[ 保存] をクリックします。

API を使用してモデルまたはモデル バージョンに説明を追加する

登録されたモデルの説明を更新するには、MLflowクライアントAPIのupdate_registered_model()メソッドを使用します。

client = MlflowClient()
client.update_registered_model(
  name="<model-name>",
  description="<description>"
)

モデルバージョンの説明を更新するには、MLflowクライアントAPIのupdate_model_version()メソッドを使用します。

client = MlflowClient()
client.update_model_version(
  name="<model-name>",
  version=<model-version>,
  description="<description>"
)

モデルの一覧表示と検索

Unity Catalog に登録されているモデルの一覧を取得するには、MLflow の search_registered_models() Python API を使用します。

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>'")]

Unity Catalog のモデルでは、すべての検索 API フィールドと演算子がサポートされているわけではありません。 詳細については、「 制限事項 」を参照してください。

モデルファイルのダウンロード(高度なユースケース)

ほとんどの場合、モデルを読み込むには、mlflow.pyfunc.load_modelmlflow.<flavor>.load_model (たとえば、HuggingFace モデルの場合は mlflow.transformers.load_model) などのMLflow APIsを使用する必要があります。

場合によっては、モデルの動作やモデルの読み込みの問題をデバッグするために、モデル ファイルをダウンロードする必要があります。 モデルファイルは、次のように 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 、機械学習パイプラインをコードとしてデプロイすることをお勧めします。 これにより、すべての本番運用モデルを本番運用環境で自動化されたトレーニング ワークフローを通じて生成できるため、環境間でモデルをプロモートする必要がなくなります。

ただし、場合によっては、環境間でモデルを再トレーニングするにはコストがかかりすぎることがあります。 代わりに、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 クライアント 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登録モデルへの書き込みが可能なユーザーのみが、ステージング モデルを本番運用環境に昇格できます。 同じユーザーは、エイリアスを使用して、本番運用環境内にどのモデル バージョンがデプロイされているかを管理することもできます。 モデルのプロモーションとデプロイメントを管理するために、他のルールやポリシーを構成する必要はありません。

このフローをカスタマイズして、 devqaprodなど、設定に一致する複数の環境間でモデルバージョンを昇格させることができます。 アクセス制御は、各環境で構成されているとおりに適用されます。

この例では、Unity Catalogのモデルを使用して機械学習アプリケーションを構築する方法を示します。

Unity Catalogのモデルの例

ワークフローとモデルをUnity Catalogに移行する

Databricks では、ガバナンスの向上、ワークスペースや環境間での簡単な共有、より柔軟な MLOps ワークフローのために、Unity Catalog のモデルを使用することを推奨しています。 この表は、 Workspace Model Registry と Unity Catalog の機能を比較したものです。

機能

Workspace Model Registry (レガシー)

Unity Catalog のモデル (推奨)

名前付きエイリアスによるモデルバージョンの参照

Model Registry ステージ: モデル バージョンを 4 つの固定ステージのいずれかに移動して、そのステージで参照します。 ステージの名前変更や追加はできません。

Model Registry エイリアス: 登録されたモデルごとに、モデル バージョンへのカスタムおよび再割り当て可能な名前付き参照を最大 10 個作成します。

モデルのアクセス制御された環境を作成する

Model Registry ステージ: 1 つの登録済みモデル内のステージを使用して、そのモデル バージョンの環境を示し、4 つの固定ステージ (StagingProduction) のうち 2 つのみに対するアクセス制御を行います。

登録済みモデル: MLOps ワークフローの環境ごとに登録済みモデルを作成し、Unity Catalog の 3 レベルの名前空間とアクセス許可を利用してガバナンスを表現します。

環境間でのモデルの昇格 (モデルのデプロイ)

transition_model_version_stage() MLflow クライアント API を使用してモデル バージョンを別のステージに移動すると、前のステージを参照するワークフローが中断される可能性があります。

copy_model_version() MLflow クライアント API を使用して、登録されているモデルから別のモデルにモデル バージョンをコピーします。

ワークスペース間でのモデルへのアクセスと共有

ワークスペース間でモデルを手動でエクスポートおよびインポートするか、personal アクセストークンとワークスペース シークレットスコープを使用してリモート モデル レジストリへの接続を構成します。

同じアカウント内のワークスペース間でモデルにすぐにアクセスできます。 設定は必要ありません。

アクセス許可の構成

ワークスペース レベルでアクセス許可を設定します。

アカウント レベルでアクセス許可を設定し、ワークスペース全体に一貫したガバナンスを適用します。

Databricks マークプレースでモデルにアクセスする

使用禁止。

Databricks Marketplace から Unity Catalog メタストアにモデルを読み込み、ワークスペース間でアクセスします。

以下にリンクされている記事では、ワークフロー (モデル トレーニングとバッチ推論ジョブ) とモデルを Workspace Model Registry から Unity Catalog に移行する方法について説明します。

制限事項

  • Unity Catalog内のモデルではステージはサポートされていません。 Databricks では、Unity Catalog の 3 レベルの名前空間を使用してモデルが存在する環境を表現し、エイリアスを使用してモデルを展開用に昇格することを推奨しています。 詳細については、「 環境間でのモデルの昇格 」を参照してください。

  • Webhook は Unity Catalog のモデルではサポートされていません。 アップグレードガイドで推奨される代替案を参照してください。

  • Unity Catalog のモデルでは、一部の検索 API フィールドと演算子がサポートされていません。これは、サポートされているフィルタを使用して検索 API を呼び出し、結果をスキャンすることで軽減できます。以下にいくつかの例を示します。

    • search_model_versions または search_registered_models クライアント API では、order_by パラメーターがサポートされていません。

    • search_model_versions または search_registered_models では、タグベースのフィルター(tags.mykey = 'myvalue')がサポートされていません。

    • search_model_versions または search_registered_models では、完全等価以外の演算子(例:LIKEILIKE!=)がサポートされていません。

    • 名前による登録済みモデルの検索(例:MlflowClient().search_registered_models(filter_string="name='main.default.mymodel'"))はサポートされていません。特定の登録済みモデルを名前で取得するには、get_registered_model を使用します。

  • Unity Catalog では、登録されているモデルおよびモデルバージョンに関する E メール通知とコメントディスカッションスレッドがサポートされていません。

  • アクティビティ ログは、Unity Catalog のモデルではサポートされていません。 Unity Catalog でモデルのアクティビティを追跡するには、 監査ログを使用します。

  • search_registered_models Delta Sharingを通じて共有されたモデルに対して古い結果が返される可能性があります。 最新の結果を確認するには、Databricks CLI またはSDKを使用してスキーマ内のモデルを一覧表示します。