生成 AI モデル サービング エンドポイントを作成する
この記事では、生成 AI モデルをデプロイして提供するモデル サービング エンドポイントを作成する方法について説明します。
Mosaic AI Model Serving では、次のモデルがサポートされています。
外部モデル。 これらは、Databricks の外部でホストされる生成モデルです。 外部モデルを提供するエンドポイントは一元的に管理でき、顧客はレート制限とアクセス制御を確立できます。 たとえば、OpenAI の GPT-4 や Anthropic の Claude などの生成 AI モデルがあります。
Foundation Model API で利用できる最先端のオープン基盤モデル。 これらのモデルは、最適化された推論をサポートするキュレーションされた基盤モデル アーキテクチャです。 Meta-Llama-3.1-70B-Instruct、GTE-Large、Mistral-7B などの基本モデルは、 pay-per-token 価格ですぐに使用できます。 基本モデルまたは微調整されたモデルを使用する運用ワークロードは、プロビジョニングされたスループットを使用して、パフォーマンスを保証した状態でデプロイできます。
Model Serving には、モデル サービング エンドポイントの作成に関する次のオプションが用意されています。
- 提供 UI
- REST API
- MLflow デプロイ SDK
従来の ML または Python モデルを提供するエンドポイントの作成については、「カスタム モデル サービング エンドポイント の作成」を参照してください。
要件
- サポートされているリージョン内の Databricks ワークスペース。
- MLflow Deployments SDK を使用してエンドポイントを作成するには、MLflow Deployment クライアントをインストールする必要があります。 インストールするには、以下を実行します。
import mlflow.deployments
client = mlflow.deployments.get_deploy_client("databricks")
基盤モデルの提供エンドポイントを作成する
Foundation Model API のプロビジョニング スループットを使用して実現できる、微調整された基盤モデルのバリアントを提供するエンドポイントを作成できます。 「REST API を使用してプロビジョニング スループット エンドポイントを作成する」を参照してください。
Foundation Model API のトークン単位の支払いを使用して実現できる基盤モデルの場合、Databricks は、Databricks ワークスペースでサポートされているモデルにアクセスするための特定のエンドポイントを自動的に提供します。 それらにアクセスするには、ワークスペースの左側のサイドバーにある [サービス] タブを選びます。 Foundation Model API は、エンドポイント リスト ビューの上部にあります。
これらのエンドポイントのクエリについては、「 Query の生成 AI モデルを参照してください。
外部モデル サービング エンドポイントを作成する
次に、Databricks 外部モデルを使用して実現できる生成 AI モデルを提供するエンドポイントを作成する方法について説明します。
提供 UI
- [名前] フィールドに、エンドポイントの名前を指定します。
- [Served entities] (提供されるエンティティ) セクションで、次のようにします。
- [エンティティ] フィールドをクリックして、[Select served entity] (提供されるエンティティの選択) フォームを開きます。
- [External model] (外部モデル) を選択します。
- 使用するモデル プロバイダーを選択します。
- [確認] をクリックします
- 使用する外部モデルの名前を指定します。 フォームは、選択内容に基づいて動的に更新されます。 使用可能な外部モデルに関する記事を参照してください。
- タスク タイプを選択します。 使用可能なタスクは、チャット、入力候補、埋め込みです。
- 選択したモデル プロバイダーにアクセスするための構成の詳細を指定します。 これは通常、エンドポイントがこのモデルへのアクセスに使用する個人用アクセス トークンを参照するシークレットです。
- Create をクリックしてください。 [提供エンドポイントの状態] が Not Ready となっている [提供エンドポイント] ページが表示されます。
REST API
重要
外部モデルにサービスを提供する提供エンドポイントを作成する 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
}
MLflow デプロイ SDK
以下では、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",
}
モデル サービング エンドポイントを更新する
モデル エンドポイントを有効にすると、必要に応じてコンピューティング構成を設定できるようになります。 特にモデルのリソースを増やす必要が生じた場合に、この構成を有効活用できます。 モデルを提供するためのリソース割り当てには、ワークロードのサイズとコンピューティング構成が重要な役割を果たします。
新しい構成の準備ができるまでは、古い構成が予測トラフィックを提供し続けます。 更新が進行中の間は、別の更新を行うことはできません。 Serving UI では、エンドポイントの詳細ページの右上にある [更新のキャンセル] を選択することで、進行中である構成の更新をキャンセルできます。 この機能は、Serving UI でのみ使用できます。
エンドポイント構成に external_model
が存在する場合、提供されるエンティティ リストに含めることができる served_entity オブジェクトは 1 つのみです。 external_model
を含む既存のエンドポイントを更新して、external_model
を含まないようにすることはできません。 external_model
なしでエンドポイントを作成した場合、それを更新して external_model
を追加することはできません。
REST API
エンドポイントを更新するには、REST API update 構成に関するドキュメント 要求スキーマと応答スキーマの詳細を参照してください。
{
"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}}"
}
}
}
]
}
MLflow デプロイ SDK
エンドポイントを更新するには、REST API update 構成に関するドキュメント 要求スキーマと応答スキーマの詳細を参照してください。
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,
}
],
}