Обслуживание нескольких моделей в конечной точке обслуживания модели

В этой статье описывается, как программно настроить конечную точку обслуживания модели для обслуживания нескольких моделей и разделения трафика между ними.

Обслуживание нескольких моделей из одной конечной точки позволяет разделить трафик между различными моделями для сравнения производительности и упрощения тестирования A/B. Вы также можете обслуживать разные версии модели одновременно, что упрощает экспериментирование с новыми версиями, сохраняя текущую версию в рабочей среде.

Вы можете обслуживать любой из следующих типов моделей в конечной точке обслуживания модели ИИ Мозаики. Вы не можете обслуживать разные типы моделей в одной конечной точке. Например, нельзя обслуживать пользовательскую модель и внешнюю модель в той же конечной точке.

Требования

См. сведения о требованиях для создания конечной точки обслуживания модели.

Сведения о параметрах управления доступом для конечных точек обслуживания моделей и рекомендации по управлению конечными точками см. в статье "Обслуживание списков управления конечными точками".

Создание конечной точки и настройка первоначального разделения трафика

При создании конечных точек обслуживания моделей с помощью API обслуживания Мозаики Databricks Или пользовательского интерфейса обслуживания Мозаичного ИИ Databricks можно также задать начальный трафик для моделей, которые вы хотите обслуживать в этой конечной точке. В следующих разделах приведены примеры настройки разделения трафика для нескольких пользовательских моделей или моделей создания ИИ, обслуживаемых в конечной точке.

Обслуживание нескольких пользовательских моделей в конечной точке

Следующий пример REST API создает одну конечную точку с двумя пользовательскими моделями в каталоге Unity и задает трафик конечной точки, разделенный между этими моделями. Обслуживаемая сущность, currentузлы версии 1 и получает 90% трафика конечной точки, а другая обслуживаемая сущность, challengerузлы версии 1 model-A 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 создается отдельная конечная точка пропускной способности, подготовленная моделью, с двумя моделями, и задает трафик конечной точки, разделенный между этими моделями. Конечная точка с именем multi-pt-model, узлы версии 2 из mistral_7b_instruct_v0_1-2 которых получает 60 % трафика конечной точки, а также размещает версию 3, из mixtral_8x7b_instruct_v0_1-3 которой получает 40 % трафика конечной точки.


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 предоставления 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}
            ]
        },
    }
)

Обновление разделения трафика между обслуживами моделями

Вы также можете обновить трафик, разделенный между обслуживаемой моделями. Следующий пример REST API задает обслуживаемую модель, currentчтобы получить 50% трафика конечной точки и другой модели, challengerчтобы получить оставшийся 50% трафика.

Вы также можете сделать это обновление на вкладке "Обслуживание" в пользовательском интерфейсе Databricks Mosaic AI с помощью кнопки "Изменить конфигурацию".

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 .