向服务终结点的模型提供多个模型
本文介绍如何以编程方式配置提供终结点的模型,以便为多个模型提供服务,以及它们之间的流量拆分。
通过单个终结点提供多个模型,可以拆分不同模型之间的流量,以比较其性能并简化 A/B 测试。 还可以同时为模型的不同版本提供服务,这使得试验新版本更容易,同时使当前版本保持生产状态。
可以在马赛克 AI 模型服务终结点上为以下任何模型类型提供服务。 不能在单个终结点中为不同的模型类型提供服务。 例如,不能在同一终结点中提供自定义模型和外部模型。
- 自定义模式
- 通过基础模型 API 预配吞吐量提供的生成 AI 模型
- 外部模型
要求
若要了解模型服务终结点的访问控制选项以及终结点管理的最佳做法指南,请参阅服务终结点 ACL。
创建终结点并设置初始流量拆分
使用 Databricks 马赛克 AI 服务 API 或 Databricks 马赛克 AI 服务 UI 创建模型服务终结点时,还可以为要在该终结点上提供服务的模型设置初始流量拆分。 以下部分提供了为终结点上提供的多个自定义模型或生成 AI 模型设置流量拆分的示例。
向终结点提供多个自定义模型
以下 REST API 示例在 Unity 目录中创建具有两个自定义模型的单个终结点,并设置在这些模型之间拆分的终结点流量。 服务实体、 current
主机版本 1 model-A
和获取终结点流量的 90%,另一个服务实体 challenger
、主机版本 1 和 model-B
获取终结点流量的 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 示例创建一个基础模型 API 预配吞吐量终结点,其中包含两个模型,并设置在这些模型之间拆分的终结点流量。 名为 multi-pt-model
“终结点”的主机版本 2 mistral_7b_instruct_v0_1-2
,其中获取终结点流量的 60%,同时托管版本 3,其中 40 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
。 在同一服务终结点中不能同时具有外部模型和非外部模型。
以下示例创建一个服务终结点,该终结点将 50% 的流量路由到 gpt-4
OpenAI 提供的流量,并将其余 50% 路由给 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% 的终结点流量和其他模型, 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
服务模型提供服务。