Fornecer vários modelos a um ponto de extremidade de serviço de modelo

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

Atender a vários modelos de um único endpoint permite dividir o tráfego entre diferentes modelos para comparar seu desempenho e facilitar o teste 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 fornecer qualquer um dos seguintes tipos de modelo em um endpoint do Mosaic AI Model Serving. Você não pode atender a 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 do ponto de extremidade de serviço de modelo.

Para entender as opções de controle de acesso para pontos de extremidade de serviço de modelo e diretrizes de melhores práticas para o gerenciamento de ponto de extremidade, consulte ACLs de pontos de extremidade de serviço.

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 atender 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 generativa atendidos em um endpoint.

Fornecer vários modelos personalizados a um endpoint

O exemplo de API REST a seguir cria um único endpoint com dois modelos personalizados no Catálogo do Unity e define a divisão de tráfego de endpoint entre esses modelos. A entidade atendida, current, hospeda a versão 1 e model-A obtém 90% do tráfego do endpoint, enquanto a outra entidade atendida, challenger, hospeda a versão 1 e model-B obtém 10% do tráfego do 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"
            }
         ]
      }
   }
}

Fornecer vários modelos para um endpoint de taxa de transferência provisionada

O exemplo de API REST a seguir cria um único terminal de taxa de transferência provisionado de APIs do Foundation Model com dois modelos e define a divisão de tráfego de terminal entre esses modelos. O endpoint chamado multi-pt-model, hospeda a versão 2 que mistral_7b_instruct_v0_1-2 obtém 60% do tráfego do endpoint e também hospeda a versão 3 mixtral_8x7b_instruct_v0_1-3 , que obtém 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"
            }
         ]
      }
   }
}

Fornecer vários modelos externos para um ponto de extremidade

Você 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. Não é permitido misturar modelos externos e internos no mesmo ponto de extremidade de serviço.

O exemplo a seguir cria um endpoint de veiculação que roteia 50% do tráfego para o gpt-4 fornecido pela OpenAI e os 50% restantes para o 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}
            ]
        },
    }
)

Atualizar a divisão de tráfego entre modelos fornecidos

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

Você também pode fazer essa atualização na guia Serviço na interface do usuário do Databricks Mosaic AI UI 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.

Você pode fazer isso usando:

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

Aqui, o modelo fornecido específico é consultado. O formato de 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 exemplo de ponto de extremidade 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 servido por challenger.