モデル サービス エンドポイントの高速デプロイ

このページでは、 エンドポイントを提供するモデル で高速デプロイを使用する方法について説明します。 高速デプロイではデプロイ時間が短縮され、モデルサービス環境はモデルトレーニング環境と同じ状態に保たれます。

Note

高速展開は、以前はサーバーレス最適化デプロイと呼されていました。

高速デプロイとは何ですか?

エクスプレス デプロイでは、モデル登録時に、サーバーレス ノートブック環境でモデル アーティファクトをパッケージ化し、ステージングします。 これにより、エンドポイントのデプロイが高速化され、トレーニング環境とサービス環境の一貫性が維持されます。

非高速デプロイでは、モデル成果物と環境はデプロイ時にコンテナーにパッケージ化されるため、サービス環境がモデルトレーニング中に使用されたものと一致しない可能性があります。

標準デプロイと高速デプロイ

次の表は、標準のデプロイと高速デプロイを比較しています。

特徴 標準の展開 高速展開
環境を構築するとき コンテナー イメージはデプロイ時にビルドされます。 成果物と環境は、モデルを登録するときにパッケージ化されます。
トレーニングとサービス環境 サービス環境がトレーニング環境と一致しない可能性があります。 サービス環境は、登録したノートブック環境と同じです。
デプロイ速度 より遅い。 デプロイはコンテナーイメージのビルドを待っています。 より速く デプロイでは、コンテナー イメージのビルドがスキップされます。
登録速度 Standard。 パッケージ化には、モデルや環境の規模に応じて、数秒から1分程度余分にかかります。
デプロイ イベント ログ コンテナー イメージ作成イベントを表示します。 コンテナー イメージ作成イベントは表示されません。

高速デプロイでは、1 回限りのパッケージ化作業をモデル登録に移動します。これは、モデルと環境のサイズに応じて、 register_model 呼び出しに秒を 1 分単位で追加します。 引き換えに、 デプロイは大幅に高速化されます。コンテナー イメージのビルドが完全にスキップされます。 このビルドは、デプロイエラー (依存関係の解決、イメージ ビルド エラー) の一般的な原因でもあります。そのため、スキップすると、問題のクラス全体が削除されます。 Express モデルのデプロイ イベント ログには、コンテナー ビルド イベントは含まれていません。

Requirements

Express デプロイ エンドポイントには、モデル サービス エンドポイントと同じ要件があります。 要件を参照してください。

さらに:

  • モデルはカスタム モデルである必要があります
  • モデルをログに記録し、バージョン 3 以降を使用してサーバーレス ノートブックに登録する必要があります
  • モデルは mlflow>=3.12databricks-sdk>=0.102.0 にログ記録され、登録されている必要があります。
  • モデルは Unity カタログに登録する必要があります。 コンピューティングの提供は、モデルが登録されたコンピューティングと一致する必要があります。 通常のサーバーレス ノートブックから登録して CPU で提供するか、 サーバーレス GPU コンピューティングから GPU で提供することができます。
  • モデルの最大環境サイズは 200 GB です

Note

高速デプロイを使用して GPU コンピューティングでカスタム LLM を提供するには、「 カスタム モデル サービスを使用してカスタム LLM を提供する」を参照してください。

GPU にリランカーをデプロイする

このチュートリアルでは、ドキュメントがクエリにどの程度応答するかをスコア付けするクロスエンコーダー リランカーである BAAI/bge-reranker-baseをデプロイします。 環境を設定し、ログを記録して Express パッケージングにモデルを登録し、エンドポイントをデプロイして、そのエンドポイントにクエリを送信します。

GPU デプロイは、 torch や CUDA など、依存関係のバージョンの競合が原因で失敗することがよくあります。 高速デプロイでは、次の 2 つの方法でこれを解決します。

  • 各サーバーレス GPU 環境バージョンにあらかじめインストールされている公開済みの固定ライブラリセットは、サービング時にもノートブック内とまったく同じ状態で存在します。つまり、同じ環境バージョンで、ライブラリのバージョンも同じです。 これらのライブラリは再パッケージ化されません。
  • ノートブック セッションにインストールする追加の依存関係 (たとえば、 %pip install) は、登録時にパッケージ化され、サービス中に復元されます。

つまり、ノートブックで実行されるモデルは、デプロイして提供する際にもそのまま動作します。

手順 1: サーバーレス GPU ノートブックを設定する

A10 GPU を使用して サーバーレス GPU コンピューティング 上にノートブックを作成し、 環境バージョン 5 の AI 環境を選択します。 AI 環境には、PyTorch と一般的な機械学習ライブラリ (torchtransformersなど) が含まれています。 正確にピン留めされたバージョンについては、 サーバーレス GPU 環境バージョン 5 (プレビュー) を参照してください。

高速展開に必要なパッケージをインストールします。

# Express deployment requires recent MLflow and Databricks SDK versions.
%pip install "mlflow>=3.12" "databricks-sdk>=0.102.0"
# Install the libraries your model needs. transformers is preinstalled in the
# v5 AI environment; install it explicitly because this model depends on it.
%pip install transformers
%restart_python

サーバーレス環境を介して依存関係を宣言することもできますが、ノートブックへのインストールは最も簡単なパスです。 ノートブック環境がサービング環境と一致するように、環境で固定されたバージョンに合わせて開発してください。

このモデルは GPU で提供されるため、サーバーレス GPU ランタイムからログに記録して登録する必要があります。 誤ってサーバーレス CPU コンピューティングからログに記録した場合、モデルは CPU 依存関係と共にパッケージ化され、GPU サービス エンドポイントの起動に失敗します。 ノートブックが GPU ランタイムで実行されていない場合にすぐエラーになるよう、次のチェックを追加してください。

import os

# This model is intended to be served on GPU, so we must log and register from a Serverless GPU runtime.
if not os.environ.get("DATABRICKS_ACCELERATOR"):
    raise RuntimeError(
        "This model MUST be logged+registered from a serverless GPU runtime, otherwise the correct dependencies will not be packaged for serving."
    )

Note

このチェックは、再ランカーが GPU で提供されるためにのみ必要です。 CPU モデルには必要ありません。

手順 2: MLflow を使用してモデルをログに記録する

リランカーを text-classification パイプラインとして読み込み、ネイティブの mlflow.transformers フレーバーでログに記録します。 ネイティブ フレーバーは、モデルの pip 依存関係を自動的にキャプチャし、GPU 上で実行します。 pip_requirementstask、またはエントリ ポイントを設定する必要はありません。

import mlflow
from transformers import pipeline

# BAAI/bge-reranker-base is a cross-encoder reranker: it scores how well a document answers a query.
pipe = pipeline("text-classification", model="BAAI/bge-reranker-base")

model_info = mlflow.transformers.log_model(
    transformers_model=pipe,
    name="bge_reranker",
    input_example={
        "text": "What is Databricks?",
        "text_pair": "Databricks is a data and AI company.",
    },
)

Important

registered_model_namelog_model引数にモデルを登録しないでください。 この引数は env_pack を受け付けないため、non-express モデルを登録します。 高速デプロイを有効にするには、register_modelを受け入れる env_pack (手順 3) で別の手順で登録します。

手順 3: 高速パッケージを使用してモデルを Unity カタログに登録する

モデルを Unity カタログに登録し、 env_pack パラメーターを設定して高速デプロイを有効にします。 これにより、登録時にノートブック セッションに追加したモデル成果物と依存関係がパッケージ化されるため、サービスを提供すると、環境バージョンのプレインストール 済みライブラリの上で再利用されます。

import mlflow
from mlflow.utils.env_pack import EnvPackConfig

mlflow.set_registry_uri("databricks-uc")

model_version = mlflow.register_model(
    model_uri=model_info.model_uri,
    name="main.default.bge_reranker",
    env_pack=EnvPackConfig(name="databricks_model_serving"),
)

env_pack="databricks_model_serving"の代わりに、文字列の短縮形EnvPackConfig(name="databricks_model_serving")を使用できます。 インターネットにアクセスしないワークスペースまたはカスタム ライブラリを使用するワークスペースの場合は、install_dependencies=Falseを設定します (env_pack パラメーターを参照)。

登録には databricks-sdk>=0.102.0が必要です。 以前のバージョンでは、大規模なモデル成果物をアップロードするときにタイムアウトする可能性があります。

手順 4: サービス エンドポイントを作成する

Azure Databricks SDK を使用して登録済みモデルをデプロイします。 このデプロイ手順は、カスタム モデルの場合と同じです。Express では登録手順 (手順 3) のみが異なります。

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.serving import (
    EndpointCoreConfigInput,
    ServedEntityInput,
    ServingModelWorkloadType,
)

ENDPOINT_NAME = "bge-reranker-endpoint"

w = WorkspaceClient()
w.serving_endpoints.create_and_wait(
    name=ENDPOINT_NAME,
    config=EndpointCoreConfigInput(
        name=ENDPOINT_NAME,
        served_entities=[
            ServedEntityInput(
                name="bge-reranker",
                entity_name=model_version.name,
                entity_version=model_version.version,
                workload_type=ServingModelWorkloadType.GPU_SMALL,
                workload_size="Small",
                scale_to_zero_enabled=False,
            )
        ],
    ),
)

create_and_wait は、エンドポイントの準備ができるまでブロックします。 GPU_SMALL は、このリランカーには十分です。 サービスは同じ環境バージョンを再利用し、ノートブックに追加した依存関係を復元するため、提供されたモデルは GPU の種類に関係なく、開発したのと同じライブラリ バージョンに対して実行されます。

エンドポイントのデプロイ中に、サービス UI でエンドポイントの [ イベント ] タブを開きます。 これは高速デプロイであるため、イベント ログにはコンテナー イメージ作成イベントは表示されません (標準のデプロイでは、 Container image creation initiated の後に Container image creation finished successfully が表示されます)。 エンドポイントが完了すると、その状態が [準備完了] と表示されます。

手順 5: エンドポイントのクエリを実行する

クロスエンコーダーはドキュメントに対してクエリをスコア付けするため、 text フィールドと text_pair フィールドを送信します。 Databricks SDK または curl を使用して プログラム でクエリを実行します。

Databricks SDK

w.serving_endpoints.query(
    name=ENDPOINT_NAME,
    dataframe_records=[
        {"text": "What is Databricks?", "text_pair": "Databricks is a data and AI company."},
    ],
)

curl

curl -X POST \
  -u "token:$DATABRICKS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"dataframe_records":[{"text":"What is Databricks?","text_pair":"Databricks is a data and AI company."}]}' \
  https://<workspace-url>/serving-endpoints/bge-reranker-endpoint/invocations

エンドポイントは、クエリとドキュメントのペアごとに関連性スコアを返します。スコアが高いほど、より良い一致が示されます。 これらのスコアを使用して、候補ドキュメントを再ランク付けします。

ノートブックの例

次のノートブックをインポートして、このチュートリアルをエンドツーエンドで実行します。

Express 再ランキング スターター ノートブック

ノートブックを入手

env_pack パラメーター

上記のクイック スタートでは、GPU モデルの高速デプロイを示します。 高速デプロイは、CPU モデルでも機能します。 どの場合も、 env_packregister_modelに渡すことで、高速展開を有効にします。

import mlflow
from mlflow.utils.env_pack import EnvPackConfig

mlflow.register_model(
    model_info.model_uri,
    model_name,
    env_pack=EnvPackConfig(name="databricks_model_serving"),
)

env_pack は、登録時にノートブック セッションに追加したモデル成果物と依存関係をパックしてステージングします。そのため、登録には env_packなしの呼び出しよりも時間がかかります。

EnvPackConfig は、 install_dependencies パラメーターを受け取ります (既定ではTrue )。 Trueすると、モデルの依存関係が現在の環境にインストールされ、環境が有効であることを確認します。

Note

インターネットにアクセスできないワークスペースや、モデルがカスタム ライブラリに依存している場合は、 install_dependenciesTrue場合、登録が失敗する可能性があります。 このような場合は、 install_dependenciesFalse に設定します。

"databricks_model_serving"の文字列EnvPackConfig(...)を短縮形として置き換えることができます。 これは、 EnvPackConfig(name="databricks_model_serving", install_dependencies=True)に相当します。