エンドポイントを提供するモデルに複数のモデルを提供する
この記事では、複数のモデルにサービスを提供するようにモデル サービス エンドポイントをプログラムで構成し、それらの間でトラフィックを分割する方法について説明します。
1 つのエンドポイントから複数のモデルを提供することで、異なるモデル間でトラフィックを分割してパフォーマンスを比較し、A/B テストを容易にできます。 また、異なるバージョンのモデルを同時に提供することもできます。これにより、運用環境で現在のバージョンを維持しながら、新しいバージョンの実験が容易になります。
モザイク AI モデル サービス エンドポイントでは、次のいずれかのモデルの種類を提供できます。 1 つのエンドポイントで異なるモデルの種類を提供することはできません。 たとえば、同じエンドポイントでカスタム モデルと外部モデルを提供することはできません。
- カスタム モデル
- Foundation Model API を通じて使用可能になった生成 AI モデル プロビジョニングされたスループット
- 外部モデル
要件
エンドポイントの作成を提供するモデルについては、 Requirements を参照してください。
モデル サービング エンドポイントのアクセス制御オプション、およびエンドポイント管理のベスト プラクティスのガイダンスについて理解するには、「エンドポイント ACL の提供」を参照してください。
エンドポイントを作成し、初期トラフィック分割を設定する
Databricks Mosaic AI serving API または Databricks Mosaic AI serving UI を使用してエンドポイントを提供するモデルを作成する場合は、そのエンドポイントで提供するモデルの初期トラフィック分割を設定することもできます。 次のセクションでは、エンドポイントで提供される複数のカスタム モデルまたは生成 AI モデルに対してトラフィック分割を設定する例を示します。
エンドポイントに複数のカスタム モデルを提供する
次の REST API の例では、Unity カタログに 2 つのカスタム モデルを含む単一のエンドポイントを作成し、それらのモデル間で分割されたエンドポイント トラフィックを設定します。 提供されるエンティティ current
、 model-A
のバージョン 1 をホストし、エンドポイント トラフィックの 90% を取得します。もう 1 つのサービスエンティティである challenger
は、 model-B
のバージョン 1 をホストし、エンドポイント トラフィックの 10% を取得します。
POST /api/2.0/serving-endpoints
{
"name":"multi-model"
"config":
{
"served_entities":
[
{
"name":"current",
"entity_name":"catalog.schema.model-A",
"entity_version":"1",
"workload_size":"Small",
"scale_to_zero_enabled":true
},
{
"name":"challenger",
"entity_name":"catalog.schema.model-B",
"entity_version":"1",
"workload_size":"Small",
"scale_to_zero_enabled":true
}
],
"traffic_config":
{
"routes":
[
{
"served_model_name":"current",
"traffic_percentage":"90"
},
{
"served_model_name":"challenger",
"traffic_percentage":"10"
}
]
}
}
}
プロビジョニングされたスループット エンドポイントに複数のモデルを提供する
次の REST API の例では、2 つのモデルを使用して単一の Foundation Model API プロビジョニング済みスループット エンドポイントを作成し、それらのモデル間でエンドポイント トラフィックを分割します。 multi-pt-model
という名前のエンドポイントは、エンドポイント トラフィックの 60% を取得するmistral_7b_instruct_v0_1-2
のバージョン 2 をホストし、エンドポイント トラフィックの 40% を取得するバージョン 3 のmixtral_8x7b_instruct_v0_1-3
もホストします。
POST /api/2.0/serving-endpoints
{
"name":"multi-pt-model"
"config":
{
"served_entities":
[
{
"name":"mistral_7b_instruct_v0_1-2",
"entity_name":"system.ai.mistral_7b_instruct_v0_1",
"entity_version":"2",
"min_provisioned_throughput":0,
"max_provisioned_throughput":1940
},
{
"name":"mixtral_8x7b_instruct_v0_1-3",
"entity_name":"system.ai.mixtral_8x7b_instruct_v0_1",
"entity_version":"3",
"min_provisioned_throughput":0,
"max_provisioned_throughput":1240
}
],
"traffic_config":
{
"routes":
[
{
"served_model_name":"mistral_7b_instruct_v0_1-2",
"traffic_percentage":"60"
},
{
"served_model_name":"mixtral_8x7b_instruct_v0_1-3",
"traffic_percentage":"40"
}
]
}
}
}
エンドポイントに複数の外部モデルを提供する
サービス エンドポイントで複数の 外部モデル すべてが同じタスクの種類を持ち、各モデルに一意の name
がある限り、構成することもできます。 同じ Serving エンドポイントで外部モデルと非外部モデルの両方を使うことはできません。
次の例では、トラフィックの 50% を OpenAI によって提供される gpt-4
にルーティングし、残りの 50% を Anthropic によって提供される claude-3-opus-20240229
にルーティングするサービス エンドポイントを作成します。
import mlflow.deployments
client = mlflow.deployments.get_deploy_client("databricks")
client.create_endpoint(
name="mix-chat-endpoint",
config={
"served_entities": [
{
"name": "served_model_name_1",
"external_model": {
"name": "gpt-4",
"provider": "openai",
"task": "llm/v1/chat",
"openai_config": {
"openai_api_key": "{{secrets/my_openai_secret_scope/openai_api_key}}"
}
}
},
{
"name": "served_model_name_2",
"external_model": {
"name": "claude-3-opus-20240229",
"provider": "anthropic",
"task": "llm/v1/chat",
"anthropic_config": {
"anthropic_api_key": "{{secrets/my_anthropic_secret_scope/anthropic_api_key}}"
}
}
}
],
"traffic_config": {
"routes": [
{"served_model_name": "served_model_name_1", "traffic_percentage": 50},
{"served_model_name": "served_model_name_2", "traffic_percentage": 50}
]
},
}
)
提供されたモデル間のトラフィック分割を更新する
提供されたモデル間のトラフィック分割を更新することもできます。 次の REST API の例では、サービス提供されたモデル ( current
) をエンドポイント トラフィックの 50% に設定し、もう 1 つのモデル ( challenger
) を設定して、残りの 50% のトラフィックを取得します。
[構成の編集] ボタンを使用して、Databricks Mosaic AI UI の [提供] タブからこの更新を行うこともできます。
PUT /api/2.0/serving-endpoints/{name}/config
{
"served_entities":
[
{
"name":"current",
"entity_name":"catalog.schema.model-A",
"entity_version":"1",
"workload_size":"Small",
"scale_to_zero_enabled":true
},
{
"name":"challenger",
"entity_name":"catalog.schema.model-B",
"entity_version":"1",
"workload_size":"Small",
"scale_to_zero_enabled":true
}
],
"traffic_config":
{
"routes":
[
{
"served_model_name":"current",
"traffic_percentage":"50"
},
{
"served_model_name":"challenger",
"traffic_percentage":"50"
}
]
}
}
エンドポイントの背後にある個別のモデルにクエリを実行する
シナリオによっては、エンドポイントの背後にある個々のモデルに対してクエリを実行することが必要になる場合があります。
これを行うには、以下を次を使用します。
POST /serving-endpoints/{endpoint-name}/served-models/{served-model-name}/invocations
ここでは、提供された特定のモデルに対してクエリが実行されます。 要求の形式は、エンドポイントに対するクエリと同じです。 提供された個別のモデルにクエリを実行している間、トラフィック設定は無視されます。
multi-model
エンドポイントのコンテキストの例では、すべての要求が /serving-endpoints/multi-model/served-models/challenger/invocations
に送信されると、提供されたモデル challenger
によって、すべての要求が提供されます。