Servir vários modelos para um modelo servindo endpoint

Este artigo descreve como configurar programaticamente um modelo de atendimento endpoint para atender a vários modelos e a divisão do tráfego entre eles.

O fornecimento de vários modelos a partir de um único endpoint permite que o senhor divida o tráfego entre diferentes modelos 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 e mantém a versão atual em produção.

O senhor pode servir qualquer um dos seguintes tipos de modelo em um endpoint do Mosaic AI Model Serving. O senhor não pode atender a diferentes tipos de modelos em um único endpoint. Por exemplo, o senhor não pode servir um modelo personalizado e um modelo externo no mesmo endpoint.

Requisitos

Consulte os Requisitos para a criação do modelo endpoint.

Para entender as opções de controle de acesso para o endpoint modelo Servindo e as orientações de práticas recomendadas para o gerenciamento endpoint, consulte Servindo endpoint ACLs.

Crie um endpoint e defina a divisão de tráfego inicial

Ao criar o endpoint servindo modelo usando o Databricks Mosaic AI servindo API ou o Databricks Mosaic AI servindo UI, o senhor também pode definir a divisão de tráfego inicial para os modelos que deseja servir nesse endpoint. As seções a seguir fornecem exemplos de configuração da divisão de tráfego para vários modelos personalizados ou modelos generativos AI servidos em um endpoint.

Servir vários modelos personalizados em um endpoint

O seguinte exemplo REST API cria um único endpoint com dois modelos personalizados em Unity Catalog e define a divisão de tráfego endpoint entre esses modelos. A entidade servida, current, hospeda a versão 1 de model-A e recebe 90% do tráfego endpoint, enquanto a outra entidade servida, challenger, hospeda a versão 1 de model-B e recebe 10% do tráfego endpoint.

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 provisionamento Taxa de transferência endpoint

O exemplo a seguir REST API cria um único Foundation Model APIs provisionamento Taxa de transferência endpoint com dois modelos e define a divisão de tráfego endpoint entre esses modelos. O endpoint chamado multi-pt-model hospeda a versão 2 do mistral_7b_instruct_v0_1-2, que recebe 60% do tráfego do endpoint, e também hospeda a versão 3 do mixtral_8x7b_instruct_v0_1-3, que recebe 40% do tráfego do endpoint.

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 para um ponto de extremidade

O senhor também pode configurar vários modelos externos em um endpoint de serviço, desde que todos tenham o mesmo tipo de tarefa e cada modelo tenha um name exclusivo. O senhor não pode ter modelos externos e não externos no mesmo endpoint de serviço.

O exemplo a seguir cria um endpoint de atendimento que roteia 50% do tráfego para gpt-4 fornecido pela OpenAI e os 50% restantes para claude-3-opus-20240229 fornecido pela 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 atendidos. O exemplo de API REST a seguir define o modelo servido, current, para obter 50% do tráfego do endpoint e o outro modelo, challenger, para obter os 50% restantes do tráfego.

O senhor também pode fazer essa atualização no site Serving tab na interface do usuário Databricks Mosaic AI usando o botão Edit configuration (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 endpoint

Em alguns cenários, o senhor pode querer consultar modelos individuais por trás do endpoint.

Você pode fazer isso usando:

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

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

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