Partilhar via


Servir vários modelos para um modelo que serve o ponto de extremidade

Este artigo descreve como configurar programaticamente um ponto de extremidade de serviço de modelo para servir vários modelos e a divisão de tráfego entre eles.

O atendimento a vários modelos a partir de um único ponto de extremidade permite dividir o tráfego entre modelos diferentes para comparar seu desempenho e facilitar os testes A/B. Você também pode servir diferentes versões de um modelo ao mesmo tempo, o que facilita a experimentação de novas versões, mantendo a versão atual em produção.

Você pode servir qualquer um dos seguintes tipos de modelo em um ponto de extremidade Mosaic AI Model Serving . Não é possível atender diferentes tipos de modelo em um único ponto de extremidade. Por exemplo, você não pode servir um modelo personalizado e um modelo externo no mesmo ponto de extremidade.

Requisitos

Consulte os Requisitos para a criação de pontos finais de serviço de modelo.

Para entender as opções de controle de acesso para o modelo que serve pontos de extremidade e as diretrizes de práticas recomendadas para gerenciamento de endpoints, consulte Servindo ACLs de endpoint.

Criar um ponto de extremidade e definir a divisão de tráfego inicial

Ao criar pontos de extremidade de serviço de modelo usando a API de serviço do Databricks Mosaic AI ou a interface do usuário de serviço do Databricks Mosaic AI, você também pode definir a divisão de tráfego inicial para os modelos que deseja servir nesse ponto de extremidade. As seções a seguir fornecem exemplos de como definir a divisão de tráfego para vários modelos personalizados ou modelos de IA generativos servidos em um ponto de extremidade.

Servir vários modelos personalizados para um ponto de extremidade

O exemplo de API REST a seguir cria um único ponto de extremidade com dois modelos personalizados no Unity Catalog e define o tráfego de ponto de extremidade dividido entre esses modelos. A entidade servida, current, hospeda a versão 1 de model-A e obtém 90% do tráfego de ponto final, enquanto a outra entidade servida, challenger, hospeda a versão 1 de model-B e obtém 10% do tráfego de ponto final.

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

Servir vários modelos para um ponto de extremidade de taxa de transferência provisionado

O exemplo de API REST a seguir cria um único ponto de extremidade de taxa de transferência provisionado de APIs de Modelo de Base com dois modelos e define o tráfego de ponto de extremidade dividido entre esses modelos. O ponto de extremidade chamado multi-pt-model, hospeda a versão 2 do mistral_7b_instruct_v0_1-2 qual obtém 60% do tráfego do ponto de extremidade e também hospeda a versão 3 do mixtral_8x7b_instruct_v0_1-3 qual obtém 40% do tráfego do ponto final.


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

Servir vários modelos externos a um endpoint

Você também pode configurar vários modelos externos em um ponto de extremidade de serviço, desde que todos tenham o mesmo tipo de tarefa e cada modelo tenha um arquivo name. Não é possível ter modelos externos e modelos não externos no mesmo ponto de extremidade de serviço.

O exemplo a seguir cria um ponto de extremidade de serviço que roteia 50% do tráfego para gpt-4 fornecido pelo OpenAI e os 50% restantes para claude-3-opus-20240229 o fornecido pelo Anthropic.

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}
            ]
        },
    }
)

Atualize a divisão de tráfego entre os modelos servidos

Você também pode atualizar a divisão de tráfego entre os modelos servidos. O exemplo de API REST a seguir define o modelo servido, current, para obter 50% do tráfego de ponto de extremidade e o outro modelo, challenger, para obter os 50% restantes do tráfego.

Você também pode fazer essa atualização na guia Servindo na interface do usuário do Databricks Mosaic AI usando o botão Editar configuração .

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

Consultar modelos individuais por trás de um ponto de extremidade

Em alguns cenários, talvez você queira consultar modelos individuais por trás do ponto de extremidade.

Pode fazê-lo utilizando:

POST /serving-endpoints/{endpoint-name}/served-models/{served-model-name}/invocations

Aqui é consultado o modelo específico de serviço. O formato da solicitação é o mesmo que consultar o ponto de extremidade. Ao consultar o modelo de serviço individual, as configurações de tráfego são ignoradas.

No contexto do multi-model exemplo de ponto de extremidade, se todas as solicitações forem enviadas para /serving-endpoints/multi-model/served-models/challenger/invocations, todas as solicitações serão atendidas challenger pelo modelo servido.