Databricksにおける機械学習モデルライフサイクルの管理

[Manage model lifecycle \| Databricks on AWS](https://docs.databricks.com/machine-learning/manage-model-lifecycle/index.html) [2022/10/27時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksでは、MLflowモデルの完全なライフサイクルの管理に役立つホスティングバージョンのMLflowモデルレジストリを提供しています。モデルレジストリは以下の機能を提供します。

- 時系列順のモデルのリネージュ(どの時点でどのMLflowエクスペリメントとランがモデルを生成したのか)。
- [サーバレスリアルタイム推論](https://qiita.com/taka_yayoi/items/32266655075795f5ab65)、あるいは[クラシックMLflowモデルサービング](https://qiita.com/taka_yayoi/items/b5a5f83beb4c532cf921)によるモデルサービング。
- モデルのバージョン管理。
- ステージの移行(ステージングからプロダクション、アーカイブへなど)。
- レジストリのイベントに基づいて自動でアクションを起動する[Webhook](https://qiita.com/taka_yayoi/items/33c2c60a4ce2c5d37eee)。
- モデルのイベントに対するメールの通知。

また、モデルの説明文を作成、参照したり、コメントすることができます。

本書では、機械学習ワークフローの一部としてどの様にモデルレジストリを使うのかと、モデルレジストリUIとモデルレジストリAPIの使用法をカバーしています。

モデルレジストリのコンセプトの概要については、[Databricks MLflowガイド](https://qiita.com/taka_yayoi/items/1a4e82f7e20c56ba4f72)をご覧ください。

# モデルの作成と登録

## UIを用いたモデルの作成、登録

モデルレジストリにモデルを登録する方法は2つあります。MLflowに記録された既存のモデルを登録するか、新規の空のモデルを作成、登録し、過去に記録したモデルを割り当てることができます。

### ノートブックから既存の記録済みモデルを登録する

1. ワークスペースで登録したいモデルを含むMLflowランを特定します。
    1. ノートブックツールバーの![](https://docs.databricks.com/_images/experiment.png)**Experiment**をクリックします。
![](https://docs.databricks.com/_images/notebook-toolbar.png)
    1. エクスペリメントランのサイドバーの中で、ランの日付の隣にある![](https://docs.databricks.com/_images/external-link.png)アイコンをクリックします。MLflowランのページが表示されます。このページには、パラメーター、メトリクス、タグ、アーティファクト一覧を含むランの詳細が表示されます。
1. アーティファクトのセクションで、**xxx-model**といった名前のディレクトリをクリックします。
![](https://docs.databricks.com/_images/register-model.png)
1. 一番右にある**Register Model**をクリックします。
1. ダイアログでは、**Model**ボックスをクリックし、以下のいずれかを行います。
    - ドロップダウンメニューから**Create New Model**を選択します。**Model Name**フィールドが表示されます。`scikit-learn-power-forecasting`のようなモデル名を入力します。
    - ドロップダウンメニューから既存のモデルを選択します。
![](https://docs.databricks.com/_images/create-model.png)
1. **Register**をクリックします。
    - **Create New Model**を選択した場合、`scikit-learn-power-forecasting`という名前のモデルを登録し、MLflowモデルレジストリによって管理されるセキュアな場所にモデルをコピーし、新規バージョンのモデルを作成します。
    - 既存のモデルを選択した場合、選択したモデルの新たなバージョンを登録します。

    少しすると、**Register Model**ボタンは新たに登録したモデルバージョンへのリンクに変化します。
![](https://docs.databricks.com/_images/registered-model-version.png)

1. モデルレジストリUIで新規モデルバージョンを開くためにリンクをクリックします。サイドバーの![](https://docs.databricks.com/_images/models-icon.png)**Models**をクリックすることでも、モデルレジストリのモデルを参照することができます。

### 新規登録モデルを作成し、記録されたモデルを割り当てる

登録モデルページで新規の空のモデルを作成し、記録されたモデルを割り当てるために**Create Model**ボタンを使うことができます。以下の手順を踏んでください。

1. 登録モデルページで、**Create Model**をクリックします。モデル名を入力し、**Create**をクリックします。
1. [ノートブックから既存の記録済みモデルを登録する](#ノートブックから既存の記録済みモデルを登録する)のステップ1からステップ3を実施します。
1. 登録モデルダイアログで、ステップ1で作成したモデル名を選択し、**Register**をクリックします。これによって、作成した名前のモデルを登録し、MLflowモデルレジストリによって管理されるセキュアな場所にモデルをコピーし、モデルバージョン`Version 1`を作成します。

    少しすると、**Register Model**ボタンは新たに登録したモデルバージョンへのリンクに変化します。**Experiment Runs**ページのRegister Modelダイアログの**Model**ドロップダウンリストからモデルを選択できる様になります。また、[Create ModelVersion](https://mlflow.org/docs/latest/rest-api.html#create-modelversion)のようなAPIコマンドでモデル名を指定することで、モデルの新規バージョンを登録することができます。

## APIによるモデルの登録

プログラムからモデルレジストリにモデルを登録する方法は3つあります。すべての方法はMLflowモデルレジストリによって管理されるセキュアな場所にモデルをコピーします。

- MLflowエクスペリメントの過程でモデルを記録し、指定された他名前で登録するには、`mlflow.<model-flavor>.log_model(...)`メソッドを使います。指定された名前の登録モデルが存在しない場合には、このメソッドは新規モデルを登録してバージョン1を作成し、`ModelVersion` MLflowオブジェクトを返却します。指定された名前の登録モデルがすでに存在しているのであれば、このメソッドは新規モデルバージョンを作成し、バージョンオブジェクトを返却します。

    ```py:Python
    with mlflow.start_run(run_name=<run-name>) as run:
      ...
      mlflow.<model-flavor>.log_model(<model-flavor>=<model>,
        artifact_path="<model-path>",
        registered_model_name="<model-name>"
      )
    ```

- すべてのエクスペリメントのランが完了した後に、指定した名前でモデルを登録し、どのモデルをレジストリに追加するのが最も適切であるのかを決定したのであれば、`mlflow.register_model()`メソッドを使います。このメソッドには、引数`mlruns:URI`にランIDを指定する必要があります。指定された名前の登録モデルが存在しない場合、このメソッドは新規モデルを登録してバージョン1を作成し、`ModelVersion`MLflowオブジェクトを返却します。すでに指定された名前のモデルが登録されているのであれば、このメソッドは新規モデルバージョンを作成し、新規バージョンオブジェクトを返却します。

    ```py:Python
    result=mlflow.register_model("runs:<model-path>", "<model-name>")
    ```

- 指定された名前で新たに登録モデルを作成するには、MLflow Client APIの`create_registered_model()`メソッドを使います。モデル名が存在する場合には、このメソッドは`MLflowException`をスローします。

    ```py:Python
    client = MlflowClient()
    result = client.create_registered_model("<model-name>")
    ```

また、[Databricks Terraformプロバイダー](https://qiita.com/taka_yayoi/items/691ee4909b0961de5ad1)や[databricks\_mlflow\_model](https://registry.terraform.io/providers/databricks/databricks/latest/docs/resources/mlflow_model)を用いてモデルを登録することができます。

# モデルのアクセスコントロール

モデルレジストリに登録されているモデルへのアクセスをどのようにコントロールするには、[MLflowモデルのアクセス権](https://qiita.com/taka_yayoi/items/2dd6711b7b254505e4a3#mlflow%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9)をご覧ください。

# モデルステージの移行

モデルバージョンは以下のステージのいずれかに存在することになります：**None**、**Staging**、**Production**、**Archived**です。**Staging**ステージは、モデルのテストや検証を意味しますが、**Production**ステージはテストやレビュープロセスが完了したモデルバージョン向けのためのものであり、ライブなスコアリングのためのアプリケーションにデプロイされます。[削除できる](#モデルやモデルバージョンを削除する)と考えた時点でアーカイブされたモデルバージョンは、不活性状態と見なされます。バージョンが異なるモデルは異なるステージになることができます。

適切な[アクセス権](https://qiita.com/taka_yayoi/items/2dd6711b7b254505e4a3#mlflow%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9)を持つユーザーが、ステージ間でモデルバージョンを移行することができます。特定のステージにモデルバージョンを移行する権限を持っているのであれば、移行を直接行うことができます。権限がない場合には、ステージ移行をリクエストし、モデルバージョンの移行できる権限を持つユーザーが、リクエストを[承認、却下、キャンセル](#モデルバージョンのステージ移行リクエストの承認却下キャンセル)します。

## UIによるモデルのステージ移行

モデルのステージを移行するには以下の手順に従ってください。

1. 使用できるモデルのステージの一覧と、あなたが使える選択肢の一覧を表示するには、モデルバージョンページで**Stage**の隣のドロップダウンリストをクリックします: 別のステージへのリクエストあるいは移行を選択します。
![](https://docs.databricks.com/_images/stage-options.png)
1. オプションのコメントを入力して**OK**をクリックします。

### モデルバージョンをプロダクションステージに移行する

テストや検証の後に、プロダクションステージへの移行や移行のリクエストを行うことができます。

モデルレジストリでは、1つ以上のバージョンの登録モデルがそれぞれのステージに存在することを許容します。プロダクションに1つのバージョンのみのモデルが存在する様にしたい場合には、**Transition existing Production model versions to Archived**をチェックすることで、現在プロダクションにあるすべてのモデルバージョンをアーカイブすることができます。

### モデルバージョンのステージ移行リクエストの承認、却下、キャンセル

ステージ移行の権限を持たないユーザーは、ステージ移行のリクエストを行うことができます。リクエストはモデルバージョンページの**Pending Requests**セクションに表示されます。
![](https://docs.databricks.com/_images/handle-transition-request.png)

ステージ移行リクエストを承認、却下、キャンセルするには、**Approve**、**Reject**、**Cancel**のリンクをクリックします。

移行リクエストを作成したユーザーもリクエストをキャンセルすることができます。

### モデルバージョンに対するアクティビティの参照

モデルバージョンに適用されたすべての移行リクエスト、承認、承認待ちを参照するには、Activitiesセクションに移動します。アクティビティの記録は、監査や調査のためにモデルのライフサイクルに関するリネージュを提供します。

## APIによるモデルのステージ移行

適切な[権限](https://qiita.com/taka_yayoi/items/2dd6711b7b254505e4a3#mlflow%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9)を持つユーザーは、モデルバージョンを新たなステージに移行することができます。

モデルバージョンを新たなステージにアップデートするには、MLflow Client APIの`transition_model_version_stage()`メソッドを使います。

```py:Python
  client = MlflowClient()
  client.transition_model_version_stage(
    name="<model-name>",
    version=<model-version>,
    stage="<stage>",
    description="<description>"
  )
```

`<stage>`に使える値は、`"Staging"|"staging"`、`"Archived"|"archived"`、`"Production"|"production"`、`"None"|"none"`です。

# モデルを推論に使う

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

モデルレジストリにモデルを登録した後に、バッチ推論やストリーミング推論のためのモデルを使用するノートブックを自動で生成することができます。あるいは、Databricksの[サーバレスリアルタイム推論](https://qiita.com/taka_yayoi/items/32266655075795f5ab65)、あるいは[クラシックMLflowモデルサービング](https://qiita.com/taka_yayoi/items/b5a5f83beb4c532cf921)を用いて、リアルタイムサービングにモデルを使用するエンドポイントを作成することができます。

[登録モデルページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E7%99%BB%E9%8C%B2%E3%83%A2%E3%83%87%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8)か[モデルバージョンページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E3%83%A2%E3%83%87%E3%83%AB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)の右上にある![](https://docs.databricks.com/_images/use-model-for-inference.png)をクリックします。モデル推論設定ダイアログが表示され、バッチ、ストリーミング、リアルタイム推論を設定することができます。

:::note warn
**重要！**
Anaconda Inc.はanaconda.orgチャンネルの[利用条件](https://www.anaconda.com/terms-of-service)を更新しました。Anacondaのパッケージングやディストリビューションに依存しているのであれば、新たな利用条件によって商用ライセンスが必要になる場合があります。詳細は[Anaconda Commercial Edition FAQ](https://www.anaconda.com/blog/anaconda-commercial-edition-faq)をご覧ください。Anacondaチャンネルを使用する際には、彼らの利用条件の影響下にあることになります。

[v1\.18](https://mlflow.org/news/2021/06/18/1.18.0-release/index.html)以前に記録されたMLflowモデルは、依存関係としてデフォルトでcondaの`defaults`チャンネル( https://repo.anaconda.com/pkgs/ )を用いて記録されます。DatabricksではMLflow v1.18移行を用いて記録したモデルでは、`defaults`チャンネルの利用を停止しています。現在記録されるデフォルトチャンネルは、コミュニティ https://conda-forge.org/ で管理されている`conda-forge`となっています。

モデルでconda環境の`defaults`チャンネルを除外しないで、MLflow v1.18以前でモデルを記録してる場合、意図せずにモデルに`defaults `チャンネルの依存関係が含まれる場合があります。モデルにこの依存関係があるかどうかを手動で確認するには、記録されたモデルにパッケージングされている`conda.yaml`ファイルの`channel`の値を確認します。例えば、`defaults`チャンネルの依存関係を持つモデルの`conda.yaml`は以下の様になります。

```yaml:YAML
channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
      name: mlflow-env
```

Databricksでは、皆様がお使いのモデルとやり取りしているAnacondaリポジトリの使用がAnacondaに許可されているかどうかを判断できないので、Databricksがお客様に変更を強制することはありません。Anacondamの使用条件のもと、Databricksの使用を通じたAnaconda.comのリポジトリの使用が許可されているのであれば、いかなるアクションも不要です。

モデルの環境で使用されるチャンネルを変更したい場合には、新たな`conda.yaml`を用いてモデルレジストリにモデルを再登録することができます。`log_model()`の`conda_env`パラメーターにチャンネルを指定することで、これを行うことができます。

`log_model()`APIの詳細に関しては、[log\_model for scikit\-learn](https://www.mlflow.org/docs/latest/python_api/mlflow.sklearn.html#mlflow.sklearn.log_model)のように、お使いのモデルフレーバーに関するMLflowドキュメントを参照ください。

`conda.yaml`ファイルの詳細については、[MLflow documentation](https://www.mlflow.org/docs/latest/models.html#additional-logged-files)をご覧ください。
:::

![](https://docs.databricks.com/_images/configure-model-inference.png)

## バッチ推論を設定する

バッチ推論ノートブックを作成するためにこれらのステップを踏む際、モデル名のフォルダー配下の`Batch-Inference`フォルダーにノートブックが保存されます。

1. **Batch inference**タブをクリックします。
1. **Model version**ドロップダウンから、使用するモデルバージョンを選択します。ドロップダウンの最初の2つの項目は、(存在する場合には)モデルの現在のプロダクションとステージングバージョンになります。これらの選択肢のいずれかを選択すると、ノートブックは自動でランの実行時のプロダクションとステージングバージョンを使用します。モデルの開発を進めている際にはこのノートブックをアップデートする必要はありません。
1. **Input table**の隣の**Browse**ボタンをクリックします。**Select input data**ダイアログが表示されます。必要に応じて、**Compute**ドロップダウンでクラスターを変更することができます。

    :::note
    **注意**
    Unity Catalogが有効化されているワークスペースでは、**Select input data**ダイアログで3レベルの`<catalog_name>.<database_name>.<table_name>`を選択することができます。
:::

1. モデルに対する入力データを含むテーブルを選択し、**Select**をクリックします。生成されるノートブックは自動でこのデータをインポートし、モデルに送信します。モデルに入力する前に何かしらの変換処理がデータに必要な場合には、生成されたノートブックを編集することができます。
1. 予測結果はディレクトリ`dbfs:/FileStore/batch-inference`のフォルダーに保存されます。デフォルトでは、モデル名と同じ名前のフォルダーの中に保存されます。生成されたノートブックのそれぞれのランは、名前にタイムスタンプを追加した新規ファイルを書き込みます。また、以降のノートブックのランにおいてはタイムスタンプを含めずにファイルを上書きする様にすることもできます。手順は生成されたノートブックに含まれています。

    **Output table location**フィールドに新たなフォルダー名を入力するか、ディレクトリをブラウズして異なるフォルダーを選択することで、予測結果が保存されるフォルダーを変更することができます。

    Unity Catalogのロケーションに予測結果を保存するには、ノートブックを編集する必要があります。サンプルノートブックでは、Unity Catalogのデータを使用するモデルをどの様にトレーニングし、結果をUnity Catalogを書き戻すのかを説明しています。[Python ML model training with Unity Catalog data](https://docs.databricks.com/data-governance/unity-catalog/machine-learning.html)をご覧ください。

## Delta Live Tablesを用いたストリーミング推論を設定する

ストリーミング推論ノートブックを作成するためにこれらのステップを踏む際には、モデル名のフォルダーの配下のフォルダー`DLT-Inference`配下にノートブックが保存されます。

1. **Streaming (Delta Live Tables)** タブをクリックします。
1. **Model version**ドロップダウンから、使用するモデルバージョンを選択します。ドロップダウンの最初の2つの項目は、(存在する場合には)モデルの現在のプロダクションとステージングバージョンになります。これらの選択肢のいずれかを選択すると、ノートブックは自動でランの実行時のプロダクションとステージングバージョンを使用します。モデルの開発を進めている際にはこのノートブックをアップデートする必要はありません。
1. **Input table**の隣の**Browse**ボタンをクリックします。**Select input data**ダイアログが表示されます。必要に応じて、**Compute**ドロップダウンでクラスターを変更することができます。

    :::note
    **注意**
    Unity Catalogが有効化されているワークスペースでは、**Select input data**ダイアログで3レベルの`<catalog_name>.<database_name>.<table_name>`を選択することができます。
:::

1. モデルに対する入力データを含むテーブルを選択し、**Select**をクリックします。生成されたノートブックは、ソースとしての入力テーブルを使用するデータ変換処理を作成し、モデル予測を実行するためにMLflowの[PySpark推論UDF](https://mlflow.org/docs/latest/models.html#export-a-python-function-model-as-an-apache-spark-udf)とインテグレーションします。モデルを適用する前後で追加の変換処理が必要であれば、生成されたノートブックを編集することができます。
1. 出力のDelta Live Table名を指定します。ノートブックは指定された名前でライブテーブルを作成し、モデル予測結果を格納するために使用します。必要に応じてターゲットデータセットをカスタマイズするために、生成されたノートブックを編集することができます。例えば、出力としてストリーミングライブテーブルを定義し、スキーマ情報やデータ品質制約を追加します。
1. このノートブックを用いて新たなDelta Live Tablesパイプラインを[作成](https://docs.databricks.com/workflows/delta-live-tables/delta-live-tables-ui.html#create-a-pipeline)するか、追加のノートブックライブラリとして既存のライブラリに[追加](https://docs.databricks.com/workflows/delta-live-tables/delta-live-tables-ui.html#edit-settings)します。

## リアルタイム推論を設定する

1. モデル推論ダイアログの設定ダイアログで**Real-time**タブをクリックします。
1. モデルに対してサービングが有効化されていない場合は**Enable serving**をクリックします。[登録モデルページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E7%99%BB%E9%8C%B2%E3%83%A2%E3%83%87%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8)の[サービングタブ](https://qiita.com/taka_yayoi/items/b5a5f83beb4c532cf921)が開き、**Status**はPendingとなっています。数分後に**Status**はReadyに変化します。

    サービングがすでに有効化されているのであれば、[サービングタブ](https://qiita.com/taka_yayoi/items/b5a5f83beb4c532cf921)を表示するために、**View existing real-time inference**をクリックします。

## フィードバックを提供する

この機能はプレビューであり、皆様からのフィードバックをいただければと考えています。フィードバックを提供するには、Configure model inferenceダイアログの`Provide Feedback`をクリックします。

# モデルバージョンを比較する

モデルレジストリでモデルバージョンを比較することができます。

1. [登録モデルページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E7%99%BB%E9%8C%B2%E3%83%A2%E3%83%87%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8)で、モデルバージョンの左のチェックボックスをクリックすることで2つ以上のモデルバージョンを選択します。
1. **Compare**をクリックします。
1. `<N>`バージョンを比較する画面が表示され、選択されたモデルバージョンのパラメーター、スキーマ、メトリクスを比較するテーブルが表示されます。画面の下には、プロットのタイプ(scatter、contour、parallel coordinates)とプロットするパラメーターやメトリクスを選択することができます。

# 通知設定を制御する

指定した登録モデルとモデルバージョンにおけるアクティビティに関して、メール通知を行う様にモデルレジストリを設定することができます。

登録モデルページで、**Notify me about**メニューに3つのオプションが表示されます。
![](https://docs.databricks.com/_images/email-notifications-menu.png)

- **All new activity:** このモデルのすべてのモデルバージョンのすべてのアクティビティについてメールの通知を送信します。登録モデルを作成した際、この設定がデフォルトになります。
- **Activity on versions I follow:** フォローしているモデルバージョン位関してのみメール通知を行います。この選択によって、フォローしているすべてのモデルバージョンの通知を受け取ります。特定のモデルバージョンの通知をオフにすることはできません。
- **Mute notifications:** この登録モデルのアクティビティについてメール通知を送信しません。

以下のイベントによって通知が行われます。

- 新規モデルバージョンの作成
- ステージ移行のリクエスト
- ステージ移行
- 新規コメント

以下のいずれかを行った際にはモデルの通知を自動で購読します。

- モデルバージョンへのコメント
- モデルバージョンのステージの移行
- モデルのステージの移行をリクエスト

モデルバージョンをフォローしているのかどうか確認するには、[モデルバージョンページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E3%83%A2%E3%83%87%E3%83%AB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)、あるいは[登録モデルページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E7%99%BB%E9%8C%B2%E3%83%A2%E3%83%87%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8)のモデルバージョンのテーブルのFollow Statusフィールドを参照します。

## すべてのメール通知をオフにする

User SettingsメニューのModel Registry Settingsタブでメール通知をオフにすることができます。

1. Databricksワークスペースの左下の![](https://docs.databricks.com/_images/user-settings-icon.png)**Settings**をクリックします。
1. **User Settings**をクリックします。
1. **Email preferences**タブに移動します。
1. **Model Registry email notifications**をオフにします。

管理者は[Admin Console](https://docs.databricks.com/administration-guide/admin-console.html)で企業全体でメール通知をオフにすることができます。

## メール送信の最大数

モデルレジストリは、アクティビティごとの日毎のユーザーに通知するメールの数に制限を設けています。例えば、ある登録モデルにおいて新規モデルバージョンに関するメールを1日に20回受け取った場合、モデルレジストリは1日の制限に達したことを告げるメールを送信し、次の日までイベントに関するメールを送信しません。

許可するメールの数の制限を増やすには、Databricks担当者にお問い合わせください。

# Webhook

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

Webhookを用いることで、お使いのインテグレーションが自動でアクションを起動できる様に、モデルレジストリのイベントをリッスンできるようになります。自動化や既存のCI/CDツールやワークフローとお使いの機械学習パイプライン解いて具レーションするためにwebhookを使うことができます。例えば、新規モデルバージョンが作成された際にCIのビルドを起動したり、モデルのプロダクションへの移行がリクエストされるたびにSlackを通じてチームメンバーに通知を行うことができます。

- [DatabricksにおけるMLflowモデルレジストリWebhook](https://qiita.com/taka_yayoi/items/33c2c60a4ce2c5d37eee)

# モデルやモデルバージョンに注釈をつける

注釈をつけることで、モデルやモデルバージョンに関する情報を提供することができます。例えば、問題の概要や使用した方法論やアルゴリズムに関する情報を含めたいと考えるかもしれません。

## UIを用いてモデルやモデルバージョンに注釈を付ける

DatabricksのUIは、モデルとモデルバージョンに注釈をつけるための方法をいくつか提供しています。説明やコメントを用いてテキスト情報を追加し、[検索可能なキーバリューのタグ](#モデルを検索する)を追加することができます。説明文とタグはモデルとモデルバージョンで使用できます。コメントはモデルバージョンでのみ使用できます。

- 説明文はモデルに関する情報を提供することを意図しています。
- コメントは、モデルバージョン上のアクティビティに関する継続中の議論を維持するための手段を提供します。
- タグを用いることで、特定のモデルを様に検索できるようにするモデルのメタデータをカスタマイズできます。

### モデルやモデルバージョンの説明文を追加、更新する

1. [登録モデルページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E7%99%BB%E9%8C%B2%E3%83%A2%E3%83%87%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8)、[モデルバージョンページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E3%83%A2%E3%83%87%E3%83%AB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)で、**Description**の隣の**Edit**をクリックします。編集ウィンドウが表示されます。
1. 編集ウィンドウで説明文を入力、編集します。
1. 変更を保存するには**Save**、ウィンドウを閉じるには**Cancel**をクリックします。

    モデルバージョンの説明文を入力すると、[登録モデルページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E7%99%BB%E9%8C%B2%E3%83%A2%E3%83%87%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8)のテーブルの**Description**カラムに説明文が表示されます。カラムには最大32文字あるいは1行のテキストの短い方が表示されます。

### モデルバージョンにコメントする

1. [モデルバージョンページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E3%83%A2%E3%83%87%E3%83%AB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)をスクロールダウンし、**Activities**の隣の下向き矢印をクリックします。
1. 編集ウィンドウにコメントを入力し、**Add Comment**をクリックします。

### モデルバージョンにタグをつける

1. [登録モデルページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E7%99%BB%E9%8C%B2%E3%83%A2%E3%83%87%E3%83%AB%E3%83%9A%E3%83%BC%E3%82%B8)、[モデルバージョンページ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995#%E3%83%A2%E3%83%87%E3%83%AB%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)で、展開されていない場合には![](https://docs.databricks.com/_images/tags2.png)をクリックします。タグのテーブルが表示されます。
![](https://docs.databricks.com/_images/tags-open.png)
1. **Name**と**Value**フィールドをクリックし、タグのキーとばビューを入力します。
1. **Add**をクリックします。
![](https://docs.databricks.com/_images/tag-add.png)

### モデルやモデルバージョンのタグを編集、削除する

既存のタグを編集、削除するには、**Actions**カラムのアイコンをクリックします。
![](https://docs.databricks.com/_images/tag-edit-or-delete.png)

## APIを用いてモデルバージョンに注釈を付ける

モデルバージョンの説明文を更新するには、MLflow Client APIの`update_model_version()`メソッドを使います。

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

登録モデルやモデルバージョンのタグを設定、更新するには、MLflow Client APIの[set\_registered\_model\_tag\(\)](https://www.mlflow.org/docs/latest/python_api/mlflow.tracking.html#mlflow.tracking.MlflowClient.set_registered_model_tag)か[set\_model\_version\_tag\(\)](https://www.mlflow.org/docs/latest/python_api/mlflow.tracking.html#mlflow.tracking.MlflowClient.set_model_version_tag)を使います。

```py:Python
client = MlflowClient()
client.set_registered_model_tag()(
  name="<model-name>",
  key="<key-value>",
  tag="<tag-value>"
)
```

```py:Python
client = MlflowClient()
client.set_model_version_tag()(
  name="<model-name>",
  version=<model-version>,
  key="<key-value>",
  tag="<tag-value>"
)
```

# モデル名を変更する(APIのみ)

登録モデルの名称を変更するには、MLflow Client APIの`rename_registered_model()`メソッドを使います。

```py:Python
client=MlflowClient()
client.rename_registered_model("<model-name>", "<new-model-name>")
```

:::note info
**注意**
バージョンを持たない、あるいはすべてのバージョンがNone、Archivedステージにある場合にのみ、登録モデルの名称を変更することができます。
:::

# モデルを検索する

すべての登録モデルはMLflowモデルレジストリに存在します。UIかAPIを用いてモデルを検索することができます。

:::note info
**注意**
モデルを検索する際には、少なくとも[読み取り権限](https://qiita.com/taka_yayoi/items/2dd6711b7b254505e4a3#mlflow%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9)を持っているモデルのみが返却されます。
:::

## UIによるモデルの検索

すべての登録モデルを表示するには、サイドバーの![](https://docs.databricks.com/_images/models-icon.png)**Models**をクリックします。

特定のモデルを検索するには、検索ボックスにテキストを入力します。モデル名やモデル名の一部を入力することができます。
![](https://docs.databricks.com/_images/registered-models-search.png)
また、タグで検索することができます。`tags.<key>=<value>`という書式でタグを入力します。複数のタグで検索するには`AND`オペレーターを使用します。
![](https://docs.databricks.com/_images/search-with-tags.png)

以下の様に、[MLflow search syntax](https://www.mlflow.org/docs/latest/search-runs.html#search-runs-syntax)を用いてモデル名とタグを検索することができます。
![](https://docs.databricks.com/_images/model-search-name-and-tag.png)

## APIによるモデルの検索

すべての登録モデルの一覧を取得するには、MLflow Client APIの`list_registered_models()`メソッドを使います。

```py:Python
from pprint import pprint

client = MlflowClient()
for rm in client.list_registered_models():
  pprint(dict(rm), indent=4)
```

アウトプット

```
{   'creation_timestamp': 1582671933216,
    'description': None,
    'last_updated_timestamp': 1582671960712,
    'latest_versions': [<ModelVersion: creation_timestamp=1582671933246, current_stage='Production', description='A random forest model containing 100 decision trees trained in scikit-learn', last_updated_timestamp=1582671960712, name='sk-learn-random-forest-reg-model', run_id='ae2cc01346de45f79a44a320aab1797b', source='./mlruns/0/ae2cc01346de45f79a44a320aab1797b/artifacts/sklearn-model', status='READY', status_message=None, user_id=None, version=1>,
    <ModelVersion: creation_timestamp=1582671960628, current_stage='None', description=None, last_updated_timestamp=1582671960628, name='sk-learn-random-forest-reg-model', run_id='d994f18d09c64c148e62a785052e6723', source='./mlruns/0/d994f18d09c64c148e62a785052e6723/artifacts/sklearn-model', status='READY', status_message=None, user_id=None, version=2>],
    'name': 'sk-learn-random-forest-reg-model'}
```

また、MLflow Client APIの`search_model_versions()`メソッドを用いることで、特定のモデル名とバージョン詳細の一覧を検索することができます。

```py:Python
from pprint import pprint

client=MlflowClient()
[pprint(mv) for mv in client.search_model_versions("name='<model-name>'")]
```

アウトプット

```
{   'creation_timestamp': 1582671933246,
    'current_stage': 'Production',
    'description': 'A random forest model containing 100 decision trees '
                   'trained in scikit-learn',
    'last_updated_timestamp': 1582671960712,
    'name': 'sk-learn-random-forest-reg-model',
    'run_id': 'ae2cc01346de45f79a44a320aab1797b',
    'source': './mlruns/0/ae2cc01346de45f79a44a320aab1797b/artifacts/sklearn-model',
    'status': 'READY',
    'status_message': None,
    'user_id': None,
    'version': 1 }

{   'creation_timestamp': 1582671960628,
    'current_stage': 'None',
    'description': None,
    'last_updated_timestamp': 1582671960628,
    'name': 'sk-learn-random-forest-reg-model',
    'run_id': 'd994f18d09c64c148e62a785052e6723',
    'source': './mlruns/0/d994f18d09c64c148e62a785052e6723/artifacts/sklearn-model',
    'status': 'READY',
    'status_message': None,
    'user_id': None,
    'version': 2 }
```

モデルに[タグが設定](#apiを用いてモデルバージョンに注釈を付ける)されている場合、MLflow Client APIの[search\_registered\_models\(\)](https://www.mlflow.org/docs/latest/python_api/mlflow.tracking.html#mlflow.tracking.MlflowClient.search_registered_models)メソッドを用いて、タグによる検索を行うこともできます。

```py:Python
print(f"Find registered models with a specific tag value")
for m in client.search_registered_models(f"tags.`<key-value>`='<tag-value>'"):
  pprint(dict(m), indent=4)
```

# モデルやモデルバージョンを削除する

UIやAPIを用いてモデルを削除することができます。

## UIを用いてモデルバージョンやモデルを削除する

:::note alert
**警告！**
このアクションを取り消すことはできません。モデルバージョンをレジストリから削除するのではなく、Archivedステージに移行することができます。モデルを削除する際には、モデルレジストリによって格納されているすべてのモデルアーティファクトと、登録モデルに関連づけられているすべてのメタデータが削除されます。
:::

:::note
**注意**
NoneあるいはArchivedステージにあるモデルバージョンとモデルのみを削除することができます。登録モデルにStaging、Productionステージのモデルバージョンが含まれている場合には、モデルを削除する前にNoneかArchivedに移行する必要があります。
:::

モデルバージョンを削除するには:

1. サイドバーの![](https://docs.databricks.com/_images/models-icon.png)**Models**をクリックします。
1. モデル名をクリックします。
1. モデルバージョンをクリックします。
1. 画面右上の![](https://docs.databricks.com/_images/three-button-icon.png)をクリックし、ドロップダウンメニューから**Delete**を選択します。

モデルを削除するには:

1. サイドバーの![](https://docs.databricks.com/_images/models-icon.png)**Models**をクリックします。
1. モデル名をクリックします。
1. 画面右上の![](https://docs.databricks.com/_images/three-button-icon.png)をクリックし、ドロップダウンメニューから**Delete**を選択します。

## APIを用いてモデルバージョンやモデルを削除する

:::note alert
**警告！**
このアクションを取り消すことはできません。モデルバージョンをレジストリから削除するのではなく、Archivedステージに移行することができます。モデルを削除する際には、モデルレジストリによって格納されているすべてのモデルアーティファクトと、登録モデルに関連づけられているすべてのメタデータが削除されます。
:::

:::note
**注意**
NoneあるいはArchivedステージにあるモデルバージョンとモデルのみを削除することができます。登録モデルにStaging、Productionステージのモデルバージョンが含まれている場合には、モデルを削除する前にNoneかArchivedに移行する必要があります。
:::

### モデルバージョンを削除する

モデルバージョンを削除するには、MLflow Client APIの`delete_model_version()`メソッドを使います。

```py:Python
# 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()`メソッドを使います。

```py:Python
client = MlflowClient()
client.delete_registered_model(name="<model-name>")
```

# ワークスペース間でモデルを共有する

Databricksでは、複数ワークスペースでのモデル共有をサポートしています。例えば、お使いのワークスペースでモデルを開発・記録し、中央管理されているモデルレジストリに登録することができます。これは、複数のチームがモデルにアクセスする際に有用です。複数のワークスペースを作成し、これらの環境横断でモデルを利用、管理することができます。

- [Databricksワークスペース間における機械学習モデルの共有](https://qiita.com/taka_yayoi/items/ddddbf9637fe03607b4f)

# ワークスペース間でMLflowオブジェクトをコピーする

お使いのDatabricksワークスペース間でMLflowオブジェクトをインポート、エクスポートするために、ワークスペース間でMLflowエクスペリメント、モデル、ランを移行するためのコミュニティ主導のオープンソースプロジェクトである[MLflow Export\-Import](https://github.com/mlflow/mlflow-export-import#why-use-mlflow-export-import)を活用することができます。

このツールを使うことで、以下のことが可能となります。

- 同一あるいは異なるトラッキングサーバーにいる他のデータサイエンティストとの共有、コラボレーション。例えば、他のユーザーからのエクスペリメントを、あなたのワークスペースにコピーすることができます。
- 開発ワークスペースからプロダクションワークスペースの様に、別のワークスペースへのモデルのコピー。
- お使いのローカルトラッキングサーバーからMLflowエクスペリメントやランを、Databricksワークスペースにコピー。
- ミッションクリティカルなエクスペリメントやモデルを別のDatabricksワークスペースにバックアップ。

# サンプル

このサンプルでは、機械学習アプリケーションを構築するためにどのようにモデルレジストリを使うのかを説明しています。

- [MLflow Model Registry example](https://docs.databricks.com/mlflow/model-registry-example.html)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)