向服务终结点的模型提供多个模型

本文介绍如何以编程方式配置提供终结点的模型,以便为多个模型提供服务,以及它们之间的流量拆分。

通过单个终结点提供多个模型,可以拆分不同模型之间的流量,以比较其性能并简化 A/B 测试。 还可以同时为模型的不同版本提供服务,这使得试验新版本更容易,同时使当前版本保持生产状态。

可以在马赛克 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 服务模型提供服务。