エンドポイントを提供する基盤モデルを作成する

この記事では、基礎モデルを提供するモデルサービング エンドポイントを作成する方法を学習します。

Databricksモデルサービングは次の基盤モデルをサポートします。

  • 基盤APIsによって利用できる最先端のオープン モデル。 これらのモデルは、最適化された推論をサポートする厳選された基盤モデル アーキテクチャです。 Llama-2-70B-chat、BGE-Large、 Mistral -7B などの基本モデルは、支払いごとの支払い価格ですぐに使用できます。 本番運用ワークロードは、ベース モデルまたは微調整モデルを使用して、プロビジョニング スループットを使用してパフォーマンスを保証しながらデプロイできます。

  • 外部モデル。 これらは、Databricks の外部でホストされるモデルです。 外部モデルにサービスを提供するエンドポイントは一元的に管理でき、顧客はレート制限とアクセス制御を確立できます。 例には、OpenAI の GPT-4、Anthropic の Claude などの基盤モデルが含まれます。

モデルサービングには、モデルサービング エンドポイント作成用の次のオプションが用意されています。

  • サービング UI

  • REST API

  • MLflow デプロイメント SDK

従来の機械学習または Python モデルにサービスを提供するエンドポイントの作成については、 「カスタム モデルサービング エンドポイントの作成」を参照してください。

要件

  • サポートされているリージョンの Databricks ワークスペース。

  • MLflow Deployments SDK を使用してエンドポイントを作成するには、MLflow Deployment クライアントをインストールする必要があります。 インストールするには、次を実行します。

import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")

エンドポイントを提供する基盤モデルを作成する

以下では、Databricks 外部モデルを使用して利用できる基盤モデルを提供するエンドポイントを作成する方法について説明します。 インフラAPIsを使用して利用可能になったモデルの微調整されたバリアントを提供するエンドポイントについては、 「 REST API を使用してプロビジョニングされたスループット エンドポイントを作成する 」を参照してください。

  1. [ 名前 ] フィールドに、エンドポイントの名前を入力します。

  2. [ Served entities ] セクションで、次の操作を行います

    1. [ エンティティ ] フィールドをクリックして、[ 提供されるエンティティの選択 ] フォームを開きます。

    2. [外部モデル] を選択します。

    3. 使用するモデル プロバイダーを選択します。

    4. 確認」をクリックします。

    5. 使用する外部モデルの名前を指定します。 フォームは、選択内容に基づいて動的に更新されます。 利用可能な外部モデルを参照してください。

    6. タスクの種類を選択します。 利用可能なタスクは、チャット、完了、埋め込みです。

    7. 選択したモデル プロバイダーにアクセスするための構成の詳細を指定します。 これは通常、エンドポイントがこのモデルにアクセスするために使用する個人のアクセス ノートを参照するシークレットです。

  3. 「作成」をクリックします。[ Serving endpoints ] ページが表示され、[ Serving endpoint state ] が [Not Ready] と表示されます。

モデルサービングエンドポイントを作成する

重要

基盤モデルにサービスを提供するサービス エンドポイントを作成するための REST API パラメーターは、パブリック プレビュー段階にあります。

次の例では、OpenAI が提供する text-embedding-ada-002 モデルの最初のバージョンを提供するエンドポイントを作成します。

POST /api/2.0/serving-endpoints を参照してください。 エンドポイント構成の問題。

{
  "name": "openai_endpoint",
  "config":{
    "served_entities": [
      {
        "name": "openai_embeddings",
        "external_model":{
          "name": "text-embedding-ada-002",
          "provider": "openai",
          "task": "llm/v1/embeddings",
          "openai_config":{
            "openai_api_key": "{{secrets/my_scope/my_openai_api_key}}"
          }
        }
      }
    ]
  },
  "rate_limits": [
    {
      "calls": 100,
      "key": "user",
      "renewal_period": "minute"
    }
  ],
  "tags": [
    {
      "key": "team",
      "value": "gen-ai"
    }
  ]
}

次に、応答の例を示します。

{
  "name": "openai_endpoint",
  "creator": "user@email.com",
  "creation_timestamp": 1699617587000,
  "last_updated_timestamp": 1699617587000,
  "state": {
    "ready": "READY"
  },
  "config": {
    "served_entities": [
      {
        "name": "openai_embeddings",
        "external_model": {
          "provider": "openai",
          "name": "text-embedding-ada-002",
          "task": "llm/v1/embeddings",
          "openai_config": {
            "openai_api_key": "{{secrets/my_scope/my_openai_api_key}}"
          }
        },
        "state": {
          "deployment": "DEPLOYMENT_READY",
          "deployment_state_message": ""
        },
        "creator": "user@email.com",
        "creation_timestamp": 1699617587000
      }
  ],
    "traffic_config": {
      "routes": [
        {
          "served_model_name": "openai_embeddings",
          "traffic_percentage": 100
        }
      ]
    },
    "config_version": 1
  },
  "tags": [
    {
      "key": "team",
      "value": "gen-ai"
    }
  ],
  "id": "69962db6b9db47c4a8a222d2ac79d7f8",
  "permission_level": "CAN_MANAGE",
  "route_optimized": false
}

次に、OpenAI text-embedding-ada-002を使用した埋め込みのエンドポイントを作成します。

基盤モデル エンドポイントの場合、使用するモデル プロバイダーの API キーを提供する必要があります。 リクエストとレスポンスのスキーマの詳細については、REST API のPOST /api/2.0/serving-endpointsを参照してください。

構成のexternal_modelセクションのtaskフィールドで指定されているように、完了およびチャット タスク用のエンドポイントを作成することもできます。 各タスクでサポートされているモデルとプロバイダーについては、「Databricks モデルサービングの外部モデル」を参照してください。


from mlflow.deployments import get_deploy_client

client = get_deploy_client("databricks")
endpoint = client.create_endpoint(
    name="chat",
    config={
        "served_entities": [
            {
                "name": "completions",
                "external_model": {
                    "name": "gpt-4",
                    "provider": "openai",
                    "task": "llm/v1/chat",
                    "openai_config": {
                        "openai_api_key": "{{secrets/scope/key}}",
                    },
                },
            }
        ],
    },
)
assert endpoint == {
    "name": "chat",
    "creator": "alice@company.com",
    "creation_timestamp": 0,
    "last_updated_timestamp": 0,
    "state": {...},
    "config": {...},
    "tags": [...],
    "id": "88fd3f75a0d24b0380ddc40484d7a31b",
}

プラットフォームモデルエンドポイントを更新する

モデル エンドポイントを有効にした後、必要に応じてコンピュート構成を設定できます。 この構成は、モデルに追加のリソースが必要な場合に特に役立ちます。 ワークロードのサイズとコンピュート構成は、モデルを提供するためにどのリソースが割り当てられるかにおいて重要な役割を果たします。

新しい設定の準備が整うまで、古い設定は予測トラフィックを提供し続けます。 更新が進行中の間は、別の更新を行うことはできません。

エンドポイント構成に external_model が存在する場合、提供されるエンティティリストには 1 つのserved_entityオブジェクトしか含められません。 external_modelを持つ既存のエンドポイントは、external_modelがなくなるように更新できません。エンドポイントが external_modelなしで作成された場合、エンドポイントを更新して external_modelを追加することはできません。

基盤モデルのエンドポイントを更新するには、REST API 更新構成ドキュメントでリクエストとレスポンスのスキーマの詳細を参照してください。

{
  "name": "openai_endpoint",
  "served_entities":[
    {
      "name": "openai_chat",
      "external_model":{
        "name": "gpt-4",
        "provider": "openai",
        "task": "llm/v1/chat",
        "openai_config":{
          "openai_api_key": "{{secrets/my_scope/my_openai_api_key}}"
        }
      }
    }
  ]
}

基盤モデルのエンドポイントを更新するには、REST API 更新構成ドキュメントでリクエストとレスポンスのスキーマの詳細を参照してください。

from mlflow.deployments import get_deploy_client

client = get_deploy_client("databricks")
endpoint = client.update_endpoint(
    endpoint="chat",
    config={
        "served_entities": [
            {
                "name": "chats",
                "external_model": {
                    "name": "gpt-4",
                    "provider": "openai",
                    "task": "llm/v1/chat",
                    "openai_config": {
                        "openai_api_key": "{{secrets/scope/key}}",
                    },
                },
            }
        ],
    },
)
assert endpoint == {
    "name": "chats",
    "creator": "alice@company.com",
    "creation_timestamp": 0,
    "last_updated_timestamp": 0,
    "state": {...},
    "config": {...},
    "tags": [...],
    "id": "88fd3f75a0d24b0380ddc40484d7a31b",
  }

rate_limits = client.update_endpoint(
    endpoint="chat",
    config={
        "rate_limits": [
            {
                "key": "user",
                "renewal_period": "minute",
                "calls": 10,
            }
        ],
    },
)
assert rate_limits == {
    "rate_limits": [
        {
            "key": "user",
            "renewal_period": "minute",
            "calls": 10,
        }
    ],
}