DatabricksにおけるMLflow 3.0のサポート - デプロイメントジョブ編

こちらをウォークスルーします。

https://docs.databricks.com/aws/ja/mlflow/deployment-job

こちらのマニュアルに沿ってサンプルノートブックを動かします。

https://docs.databricks.com/aws/ja/mlflow/mlflow-3-install

:::note info
**注意**
執筆時点では[ベータ版](https://docs.databricks.com/aws/ja/release-notes/release-types)です。
:::

# MLflow 3.0

こちらにもまとめていますが、エクスペリメントページにおける**モデル**タブの追加、**Logged Model**エンティティの追加、モデルレジストリUIの改善などが含まれています。特に大きな変更点は、情報アーキテクチャが見直されたことだと思います。これまでは、MLflow**ラン**(トレーニングの実行単位)にモデルやアーティファクト、メトリクス、パラメータなどが紐づけられていました。生成AIのように一つのモデルに繰り返し評価が行われる場合や、ディープラーニングのように複数のモデルチェックポイントができる場合には、この情報アーキテクチャでは困難さが生じていたため、今回の変更で**モデル**に複数のメトリクス、アーティファクトが紐づけられるようになっています。

https://qiita.com/taka_yayoi/items/8ebc58c04f7889438eb1

# 有効化

ワークスペースの**プレビュー**メニューにアクセスし、**MLflow 3**を有効化します。

![Screenshot 2025-04-09 at 21.15.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/54771c50-54cf-40c5-9ada-215335bb440a.png)

# デプロイメントジョブとは？

https://docs.databricks.com/aws/ja/mlflow/deployment-job#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%83%A1%E3%83%B3%E3%83%88%E3%82%B8%E3%83%A7%E3%83%96%E3%81%A8%E3%81%AF

> デプロイジョブを使用すると、新しいモデルバージョンが作成されるたびに評価、承認、デプロイなどのタスクを自動化し、Unity Catalog モデルや Databricks ジョブとシームレスに統合できます。これらのジョブにより、モデルデプロイパイプラインの設定が簡素化され、ヒューマンインザループの承認が組み込まれ、各モデルバージョンの進行状況と履歴コンテキストを明確に可視化できる管理されたワークフローが提供されます。

こちらの機能、懐かしいです。モデル管理がUnity Catalogに統合される前のワークスペースモデルレジストリで提供されていた承認フローの代替です。ワークスペースモデルレジストリでは、モデルのステージ分けができ、StagingからProductionに移行する際に承認者による承認を挟むことができました。Unity Catalogのモデル管理ではこの機能がオミットされていたので、悲しんでいたところです。

https://docs.databricks.com/aws/ja/machine-learning/manage-model-lifecycle/workspace-model-registry

早速動かします。

# ノートブックの準備

こちらを実行してモデルを作成しておきます。

https://qiita.com/taka_yayoi/items/8e66db25d99b4de5c85b

[こちら](https://docs.databricks.com/aws/ja/mlflow/deployment-job#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4-%E3%82%B8%E3%83%A7%E3%83%96-%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88-%E3%83%8E%E3%83%BC%E3%83%88%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E4%BE%8B)にある4つのノートブック(評価ノートブック、承認ノートブック、デプロイノートブック、デプロイジョブ作成ノートブック)をワークスペースにインポートします。

## デプロイジョブ作成ノートブック

`create-deployment-job`は環境に合わせた変更が必要です。

このノートブックを実行すると、MLflow 3.0 デプロイメントジョブとしてテンプレート化された Databricks ジョブが作成されます。このジョブには、評価、承認チェック、およびデプロイメントの3つのタスクがあります。評価タスクはデータセット上でモデルを評価し、承認チェックタスクは UC タグと UC モデル UI の承認ボタンを使用してモデルがデプロイメントのために承認されているかどうかを確認し、デプロイメントタスクはモデルをサービングエンドポイントにデプロイします。

1. デプロイメントジョブのテンプレートノートブックの例を Databricks ワークスペースにコピーします ([AWS](https://docs.databricks.com/aws/mlflow/deployment-job#example-template-notebooks) | [Azure](https://learn.microsoft.com/azure/databricks/mlflow/deployment-job#example-template-notebooks) | [GCP](https://docs.databricks.com/gcp/mlflow/deployment-job#example-template-notebooks))。
2. UC モデルを作成するか、既存のものを使用します。例については、MLflow 3 の例を参照してください ([AWS](https://docs.databricks.com/aws/mlflow/mlflow-3-install#example-notebooks) | [Azure](https://learn.microsoft.com/azure/databricks/mlflow/mlflow-3-install#example-notebooks) | [GCP](https://docs.databricks.com/gcp/mlflow/mlflow-3-install#example-notebooks))。
3. ノートブックを実行する前に、次のセルの TODO/値を更新します。
4. ノートブックを実行した後、作成されたジョブは UC モデルに接続されません。ドキュメントに示されているように、UC モデル UI でジョブを UC モデルに接続する必要があります ([AWS](https://docs.databricks.com/aws/mlflow/deployment-job#connect) | [Azure](https://learn.microsoft.com/azure/databricks/mlflow/deployment-job#connect) | [GCP](https://docs.databricks.com/gcp/mlflow/deployment-job#connect))。

```py
# TODO: 必要に応じてこれらの値を更新してください
model_name = "takaakiyayoi_catalog.mlflow.ml_model" # 既に作成されたUCモデルの名前
job_name = "example_deployment_job" # デプロイメントジョブの希望する名前

# TODO: 各タスクのノートブックを作成し、以下の無効なパスを置き換えてノートブックパスを入力してください。
# これらのパスは、Databricksワークスペース内の例のデプロイメントジョブテンプレートノートブックからテンプレート化されたノートブックを配置した場所に対応する必要があります。
evaluation_notebook_path = "/Workspace/Users/takaaki.yayoi@databricks.com/20250409_mlflow3.0/evaluation"
approval_notebook_path = "/Workspace/Users/takaaki.yayoi@databricks.com/20250409_mlflow3.0/approval"
deployment_notebook_path = "/Workspace/Users/takaaki.yayoi@databricks.com/20250409_mlflow3.0/deployment"
```

```py
# 必要な構成を持つジョブを作成して、デプロイメントジョブとしてモデルに接続します
from databricks.sdk import WorkspaceClient
from databricks.sdk.service import jobs

w = WorkspaceClient()
job_settings = jobs.JobSettings(
    name=job_name,
    tasks=[
        jobs.Task(
            task_key="Evaluation",
            notebook_task=jobs.NotebookTask(notebook_path=evaluation_notebook_path),
            max_retries=0,
        ),
        jobs.Task(
            task_key="Approval_Check",
            notebook_task=jobs.NotebookTask(
                notebook_path=approval_notebook_path,
                base_parameters={"approval_tag_name": "{{task.name}}"}
            ),
            depends_on=[jobs.TaskDependency(task_key="Evaluation")],
            max_retries=0,
        ),
        jobs.Task(
            task_key="Deployment",
            notebook_task=jobs.NotebookTask(notebook_path=deployment_notebook_path),
            depends_on=[jobs.TaskDependency(task_key="Approval_Check")],
            max_retries=0,
        ),
    ],
    parameters=[
        jobs.JobParameter(name="model_name", default=model_name),
        jobs.JobParameter(name="model_version", default=""),
    ],
    queue=jobs.QueueSettings(enabled=True),
    max_concurrent_runs=1,
)

created_job = w.jobs.create(**job_settings.__dict__)
print("ジョブ名 " + job_name + " を使用して、UCモデル " + model_name + " にデプロイメントジョブを接続します。UCモデルUIで確認してください。")
print("\n参考のため、ジョブIDは: " + str(created_job.job_id))
print("\nドキュメント: \nAWS: https://docs.databricks.com/aws/mlflow/deployment-job#connect \nAzure: https://learn.microsoft.com/azure/databricks/mlflow/deployment-job#connect \nGCP: https://docs.databricks.com/gcp/mlflow/deployment-job#connect")
```

実行するとジョブが作成されます。

```py
ジョブ名 example_deployment_job を使用して、UCモデル takaakiyayoi_catalog.mlflow.ml_model にデプロイメントジョブを接続します。UCモデルUIで確認してください。

参考のため、ジョブIDは: 663294281963588

ドキュメント: 
AWS: https://docs.databricks.com/aws/mlflow/deployment-job#connect 
Azure: https://learn.microsoft.com/azure/databricks/mlflow/deployment-job#connect 
GCP: https://docs.databricks.com/gcp/mlflow/deployment-job#connect
```
![Screenshot 2025-04-10 at 11.17.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ca8efd02-a4d7-42dd-b061-c6dc2b302983.png)

# デプロイメントジョブの設定

カタログエクスプローラーでモデルバージョンにアクセスし、**デプロイメントジョブの接続**をクリックします。

![Screenshot 2025-04-10 at 11.06.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/68decf58-73f7-4efb-acb8-c359c0c786e1.png)

上で作成したジョブを選択して、変更を保存します。

![Screenshot 2025-04-10 at 11.17.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/4488b9df-4a73-400f-a49f-05eb0c1a221d.png)
![Screenshot 2025-04-10 at 11.17.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9c4dfe86-f85b-4341-b888-e60f84b70d14.png)

これで、デプロイメントジョブが設定されました。

# デプロイメントジョブの実行

手動で起動してみます。**デプロイメントジョブを開始**をクリックします。

![Screenshot 2025-04-10 at 11.18.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/522d3935-e336-45ea-9428-7eefd2e66960.png)

ジョブが起動します。

![Screenshot 2025-04-10 at 11.19.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e33bc9f0-19f1-4b2c-bb6e-833e26071d1b.png)
![Screenshot 2025-04-10 at 11.20.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/ddcfdb21-a107-426a-9bec-4250f5c888f8.png)

しばらくすると、承認が必要である旨のメッセージが表示されます。

![Screenshot 2025-04-10 at 11.22.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/511b3b86-0f2e-4166-9c07-ad6b8b425444.png)

今回はデモなので、自分で承認します。実際のシナリオでは適切なユーザーがメトリクスを確認して承認する形になります。

ジョブが継続され、左の**アクティビティログ**には誰が承認したのかが記録されます。
![Screenshot 2025-04-10 at 11.23.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/257348f6-5f58-467f-92d9-2f8b8a9a5c54.png)

これで、デプロイメントジョブが成功しました。

![Screenshot 2025-04-10 at 11.25.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/774803c7-e1c9-4f62-837d-08f687fd25f5.png)

モデルバージョンには、タグ**Approval_Check: Approved**が追加されています。

![Screenshot 2025-04-10 at 11.25.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/08b4b73e-3e83-4ba9-9a2a-2cfa1ec1514f.png)
![Screenshot 2025-04-10 at 11.26.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/b2d31f5e-3544-4455-996e-82b3f52d1706.png)

モデルサービングエンドポイントにもデプロイされました。

![Screenshot 2025-04-10 at 11.33.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7647f106-2b60-4748-8dc8-fb7dbf718387.png)

そして、このデプロイメントジョブは、新たなモデルバージョンが追加されると自動でトリガーされ、再び承認フローが走ります。

![Screenshot 2025-04-10 at 11.43.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/c258c105-a6eb-4934-8bad-a0451da8a4ba.png)
![Screenshot 2025-04-10 at 11.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5b70bbcb-d2f4-4d70-9f87-1dbae4926c46.png)


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

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