AIモデル生成エンドポイントを作成する

プレビュー

Mosaic AI Model Serving は パブリック プレビュー 段階にあり、 us-east1us-central1でサポートされています。

この記事では、生成AI モデルをデプロイして提供するモデルサービングエンドポイントを作成する方法について説明します。

Mosaic AI Model Serving は次のモデルをサポートしています。

  • 外部モデル。 これらは、Databricks の外部でホストされる生成モデルです。 外部モデルを提供するエンドポイントは集中管理でき、顧客はエンドポイントに対してレート制限とアクセス制御を確立できます。 AI例としては、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 外部モデルを使用して利用可能になる生成AIモデルをサービングするエンドポイントを作成する方法について説明します。

  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 を参照してください。 ステップ バイ ステップ ガイドについては、「 チュートリアル: OpenAI モデルに対してクエリを実行するための外部モデル エンドポイントを作成する」を参照してください。

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


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",
}

モデルサービングエンドポイントの更新

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

新しい設定の準備が整うまで、古い設定は予測トラフィックを提供し続けます。 更新が進行中の間は、別の更新を行うことはできません。 サービング UI では、エンドポイントの詳細ページの右上にある [更新のキャンセル] を選択することで、進行中の設定の更新をキャンセルできます。 この機能は、サービング UI でのみ使用できます。

エンドポイント構成に 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,
        }
    ],
}