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

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

Служба моделей предоставляет следующие параметры для создания конечной точки:

  • Интерфейс предоставления услуг
  • REST API
  • Пакет SDK для развертываний MLflow

Сведения о создании конечных точек, обслуживающих модели ИИ, см. в разделе "Создание базовых моделей" для конечных точек.

Требования

  • Рабочая область должна находиться в поддерживаемом регионе.
  • Если вы используете пользовательские библиотеки или библиотеки с частного зеркального сервера вместе с моделью, см. Использование пользовательских библиотек Python с Model Serving перед созданием конечной точки модели.
  • Для создания конечных точек с помощью пакета SDK для развертываний MLflow необходимо установить клиент развертывания MLflow. Чтобы установить его, выполните следующую команду:
import mlflow.deployments

client = mlflow.deployments.get_deploy_client("databricks")

Удостоверение и доступ

Чтобы создать или обновить конечную точку обслуживания модели, и инициатор запроса, и пользователь, записанный как создатель этой конечной точки, должны:

  • Станьте участником рабочего пространства.
  • Сохраните право workspace-access.

Идентичность создателя

Когда вы создаёте эндпоинт, Databricks фиксирует удостоверяющую личность, выполнившую вызов, как creator этого эндпоинта. Этот идентификатор, как правило сервисный субъект, используется для доступа к ресурсам Unity Catalog от имени эндпоинта и не может быть изменён после создания.

Если у указанного создателя нет необходимых разрешений Unity Catalog или он был удален из рабочей области, необходимо удалить эндпоинт и заново создать его от имени субъект-службы, у которой есть необходимые разрешения и которая является текущим участником рабочей области.

Изменения конфигурации и обновления обслуживаемых объектов приводят к повторной оценке членства зарегистрированного создателя в рабочей области и его прав доступа. Обновления завершаются ошибкой PERMISSION_DENIED, если пользователь, указанный как создатель, больше не является участником рабочей области, даже если инициатор запроса имеет необходимые разрешения.

Предоставление обслуживаемой сущности

Указанный создатель должен иметь следующие разрешения для каждого обслуживаемого объекта. Если при создании или обновлении конечной точки отсутствуют проверяемые разрешения, запрос завершается ошибкой PERMISSION_DENIED. Разрешения, необходимые во время выполнения запроса, заранее не проверяются — отсутствие необходимых разрешений приводит к ошибкам во время выполнения, когда конечная точка начинает обрабатывать трафик.

Тип ресурса Обязательный грант После проверки
Модель каталога Unity USE CATALOG в каталоге, USE SCHEMA в схеме, EXECUTE в модели Создание или обновление конечной точки

Замечание

Если модель в Unity Catalog объявляет транзитивные зависимости от функций, пользователю, указанному как создатель, также требуется EXECUTE для этих вышестоящих функций.

Управление доступом к конечной точке

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

Создание конечной точки

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

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

  1. Нажмите Сервис на боковой панели, чтобы отобразить интерфейс сервиса.

  2. Нажмите кнопку "Создать конечную точку обслуживания".

    Панель развертывания модели в интерфейсе Databricks

Для моделей в каталоге Unity (рекомендуется) или устаревшем реестре моделей рабочих областей:

  1. В поле "Имя" укажите имя конечной точки.

    • Имена конечных точек не могут использовать databricks- префикс. Этот префикс зарезервирован для предварительно настроенных конечных точек Databricks.
  2. В разделе "Обслуживаемые сущности "

    1. Щелкните поле сущности , чтобы открыть форму выбора обслуживаемой сущности .
    2. Выберите "Мои модели " Каталог Unity " или " Мои модели- Реестр моделей" в зависимости от того, где зарегистрирована ваша модель. Форма обновляется динамически в зависимости от вашего выбора.
    3. Выберите модель и версию модели, которые вы хотите использовать для обслуживания.
    4. Выберите процент трафика для маршрутизации в обслуживаемую модель.
    5. Выберите используемый размер вычислительных ресурсов. Вы можете использовать вычислительные ресурсы ЦП или GPU для рабочих нагрузок. См. Тип вычислений, чтобы узнать о доступных типах рабочих нагрузок, включая варианты CPU_MEDIUM и CPU_LARGE для моделей, которым требуется больше памяти, чем стандартный тип CPU. Примеры кода GPU см. в разделе "Типы рабочих нагрузок GPU".
    6. В разделе Горизонтальное масштабированиевыберите размер вычислительного ресурса, который соответствует количеству запросов, которые данная обслуживаемая модель может обрабатывать одновременно. Это число должно быть примерно равно времени выполнения модели QPS x. Сведения о параметрах вычислений, определенных клиентом, см. в разделе об ограничениях обслуживания модели.
      1. Доступные размеры: небольшие для 0-4 запросов, средних 8-16 запросов и больших для 16-64 запросов.
    7. Укажите, следует ли масштабировать конечную точку до нуля, если она не используется. Масштабирование до нуля не рекомендуется для рабочих конечных точек, так как емкость не гарантируется при масштабировании до нуля. Когда конечная точка масштабируется до нуля, возникает дополнительная задержка, также называемая холодным запуском, когда конечная точка снова увеличивает масштаб для обслуживания запросов.
    8. В разделе "Расширенная конфигурация" можно:
      • Переименуйте обслуживаемую сущность, чтобы настроить способ его отображения в конечной точке.
      • Добавьте переменные среды для подключения к ресурсам из конечной точки или регистрируйте DataFrame сопоставления признаков в таблицу вывода инференции конечной точки. Для ведения журнала DataFrame функции поиска требуется MLflow 2.14.0 или более поздняя версия.
    9. (Необязательно) Чтобы добавить дополнительные обслуживаемые сущности в конечную точку, нажмите кнопку "Добавить обслуживаемую сущность " и повторите описанные выше действия по настройке. Можно обслуживать несколько моделей или версий моделей из одной конечной точки и управлять разделением трафика между ними. Дополнительные сведения см. в разделе "Обслуживание нескольких моделей ".
  3. В разделе оптимизации маршрутов можно включить оптимизацию маршрутов для конечной точки. Оптимизация маршрутов рекомендуется для конечных точек с высокими требованиями к QPS и пропускной способности. См. статью "Оптимизация маршрутов" для конечных точек обслуживания.

  4. В разделе шлюза искусственного интеллекта можно выбрать функции управления для включения в конечной точке. См. сведения об управлении ИИ с помощью шлюза ИИ Unity.

  5. Нажмите кнопку Создать. Появится страница конечных точек обслуживания, на которой состояние конечной точки обслуживания отображается как "Не готово".

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

REST API

Конечные точки можно создать с помощью REST API. Сведения о параметрах конфигурации конечной точки см. в POST /api/2.0/service-endpoints.

В следующем примере создается конечная точка, которая служит третьей версией модели my-ads-model, зарегистрированной в реестре моделей каталога Unity. Чтобы указать модель из каталога Unity, укажите полное имя модели, включая родительский каталог и схему, например catalog.schema.example-model. В этом примере используется настраиваемый параллелизм с использованием min_provisioned_concurrency и max_provisioned_concurrency. Значения параллелизма должны быть кратными 4.


POST /api/2.0/serving-endpoints

{
  "name": "uc-model-endpoint",
  "config":
  {
    "served_entities": [
      {
        "name": "ads-entity",
        "entity_name": "catalog.schema.my-ads-model",
        "entity_version": "3",
        "min_provisioned_concurrency": 4,
        "max_provisioned_concurrency": 12,
        "scale_to_zero_enabled": false
      }
    ]
  }
}

Далее представлен пример ответа. Состояние конечной точки config_update — это NOT_UPDATING, и обслуживаемая модель READY находится в состоянии READY.

{
  "name": "uc-model-endpoint",
  "creator": "user@email.com",
  "creation_timestamp": 1700089637000,
  "last_updated_timestamp": 1700089760000,
  "state": {
    "ready": "READY",
    "config_update": "NOT_UPDATING"
  },
  "config": {
    "served_entities": [
      {
        "name": "ads-entity",
        "entity_name": "catalog.schema.my-ads-model",
        "entity_version": "3",
        "min_provisioned_concurrency": 4,
        "max_provisioned_concurrency": 12,
        "scale_to_zero_enabled": false,
        "workload_type": "CPU",
        "state": {
          "deployment": "DEPLOYMENT_READY",
          "deployment_state_message": ""
        },
        "creator": "user@email.com",
        "creation_timestamp": 1700089760000
      }
    ],
    "config_version": 1
  },
  "tags": [
    {
      "key": "team",
      "value": "data science"
    }
  ],
  "id": "e3bd3e471d6045d6b75f384279e4b6ab",
  "permission_level": "CAN_MANAGE",
  "route_optimized": false
}

Пакет SDK для развертываний MLflow

MLflow Deployments предоставляет API для создания, обновления и удаления. API для этих задач принимают те же параметры, что и REST API для обслуживания конечных точек. Сведения о параметрах конфигурации конечной точки см. в POST /api/2.0/service-endpoints.

В следующем примере создается конечная точка, которая служит третьей версией модели my-ads-model, зарегистрированной в реестре моделей каталога Unity. Необходимо указать полное имя модели, включая родительский каталог и схему, например, catalog.schema.example-model. В этом примере используется настраиваемый параллелизм с использованием min_provisioned_concurrency и max_provisioned_concurrency. Значения параллелизма должны быть кратными 4.

import mlflow
from mlflow.deployments import get_deploy_client

mlflow.set_registry_uri("databricks-uc")
client = get_deploy_client("databricks")

endpoint = client.create_endpoint(
    name="unity-catalog-model-endpoint",
    config={
        "served_entities": [
            {
                "name": "ads-entity",
                "entity_name": "catalog.schema.my-ads-model",
                "entity_version": "3",
                "min_provisioned_concurrency": 4,
                "max_provisioned_concurrency": 12,
                "scale_to_zero_enabled": False
            }
        ]
    }
)

Клиент рабочего пространства

В следующем примере показано, как создать конечную точку с помощью пакета SDK клиента рабочей области Databricks.

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.serving import EndpointCoreConfigInput, ServedEntityInput

w = WorkspaceClient()

w.serving_endpoints.create(
    name="uc-model-endpoint",
    config=EndpointCoreConfigInput(
        served_entities=[
            ServedEntityInput(
                name="ads-entity",
                entity_name="catalog.schema.my-ads-model",
                entity_version="3",
                workload_size="Small",
                scale_to_zero_enabled=False
            )
        ]
    )
)

Кроме того, вы можете сделать следующее:

  • Включить таблицы вывода для автоматического записи входящих запросов и исходящих ответов на конечные точки обслуживания модели.
  • Если у вас на конечной точке включены таблицы вывода, вы можете записать ваш DataFrame с подстановкой признаков в таблицу вывода.

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

Типы рабочих нагрузок GPU

Развертывание GPU совместимо со следующими версиями пакетов:

  • PyTorch 1.13.0 - 2.0.1
  • TensorFlow 2.5.0 - 2.13.0
  • MLflow 2.4.0 и выше

В следующих примерах показано, как создавать конечные точки GPU с помощью различных методов.

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

Чтобы настроить конечную точку для рабочих нагрузок GPU с пользовательским интерфейсом обслуживания , выберите нужный тип GPU в раскрывающемся списке "Тип вычислений " при создании конечной точки. Выполните те же действия, как создать конечную точку, но выберите тип рабочей нагрузки GPU вместо ЦП.

REST API

Чтобы развернуть модели с помощью GPU, включите workload_type поле в конфигурацию конечной точки.

POST /api/2.0/serving-endpoints

{
  "name": "gpu-model-endpoint",
  "config": {
    "served_entities": [{
      "entity_name": "catalog.schema.my-gpu-model",
      "entity_version": "1",
      "workload_type": "GPU_SMALL",
      "workload_size": "Small",
      "scale_to_zero_enabled": false
    }]
  }
}

Пакет SDK для развертываний MLflow

В следующем примере показано, как создать конечную точку GPU с помощью пакета SDK для развертываний MLflow.

import mlflow
from mlflow.deployments import get_deploy_client

mlflow.set_registry_uri("databricks-uc")
client = get_deploy_client("databricks")

endpoint = client.create_endpoint(
    name="gpu-model-endpoint",
    config={
        "served_entities": [{
            "entity_name": "catalog.schema.my-gpu-model",
            "entity_version": "1",
            "workload_type": "GPU_SMALL",
            "workload_size": "Small",
            "scale_to_zero_enabled": False
        }]
    }
)

Клиент рабочего пространства

В следующем примере показано, как создать конечную точку GPU с помощью пакета SDK клиента рабочей области Databricks.

from databricks.sdk import WorkspaceClient
from databricks.sdk.service.serving import EndpointCoreConfigInput, ServedEntityInput

w = WorkspaceClient()

w.serving_endpoints.create(
    name="gpu-model-endpoint",
    config=EndpointCoreConfigInput(
        served_entities=[
            ServedEntityInput(
                entity_name="catalog.schema.my-gpu-model",
                entity_version="1",
                workload_type="GPU_SMALL",
                workload_size="Small",
                scale_to_zero_enabled=False
            )
        ]
    )
)

Доступные типы рабочих нагрузок GPU зависят от поставщика облачных вычислений, как описано в следующей таблице.

Тип рабочей нагрузки GPU Экземпляр GPU Память GPU
GPU_SMALL 1xT4 16 ГБ
GPU_LARGE 1xA100 80ГБ
GPU_LARGE_2 2xA100 160ГБ
GPU_LARGE_4 4xA100 320 ГБ

Для конечных точек GPU значение параллелизма определяет количество реплик, выделенных для обслуживания модели. Число реплик равно значению параллелизма, делённому на 4. Например, если установить значение min_provisioned_concurrency равным 12, будет создано 3 реплики.

Изменение конечной точки пользовательской модели

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

Замечание

Настройка и обновления обслуживаемых сущностей повторно проверяют зарегистрированное членство в рабочей области создателя конечной точки и гранты для каждой обслуживаемой сущности. Убедитесь, что оба условия по-прежнему выполняются, прежде чем отправлять обновление; см. Удостоверение личности и доступ.

Чтобы избежать сбоев обновления:

  • Используйте сервисный принципал с длительным сроком действия, принадлежащий вашей команде, в качестве создателя конечной точки.
  • Не используйте личную учетную запись пользователя, которая может быть деактивирована или удалена из рабочей области позже.
  • Пользователь, указанный как создатель, должен оставаться участником рабочей области на протяжении всего срока существования эндпоинта.

Замечание

Конфигурация конечной точки может не обновиться из-за сбоя. При сбоях существующая активная конфигурация остается эффективной, как если бы обновление не произошло.

Убедитесь, что обновление успешно применено, просмотрив состояние конечной точки.

Пока новая конфигурация не будет готова, старая конфигурация будет обслуживать трафик прогнозирования. Пока выполняется обновление, еще одно обновление невозможно сделать. Однако вы можете отменить обновление в ходе выполнения из пользовательского интерфейса обслуживания.

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

После включения конечной точки модели выберите Изменить конфигурацию, чтобы изменить параметры вычислений для вашей конечной точки.

Кнопка

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

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

REST API

Ниже приведен пример обновления конфигурации конечной точки с помощью REST API. См. PUT /api/2.0/serving-endpoints/{name}/config.


PUT /api/2.0/serving-endpoints/{name}/config

{
  "name": "unity-catalog-model-endpoint",
  "config":
  {
    "served_entities": [
      {
        "entity_name": "catalog.schema.my-ads-model",
        "entity_version": "5",
        "workload_size": "Small",
        "scale_to_zero_enabled": true
      }
    ],
    "traffic_config":
    {
      "routes": [
        {
          "served_model_name": "my-ads-model-5",
          "traffic_percentage": 100
        }
      ]
    }
  }
}

Пакет SDK для развертываний MLflow

Пакет SDK для развертываний MLflow использует те же параметры, что и REST API, см. в разделе PUT /api/2.0/service-endpoints/{name}/config для сведений о схеме запроса и ответа.

В следующем примере кода используется модель из реестра моделей каталога Unity:

import mlflow
from mlflow.deployments import get_deploy_client

mlflow.set_registry_uri("databricks-uc")
client = get_deploy_client("databricks")

endpoint = client.update_endpoint_config(
  endpoint=f"{endpointname}",
  config={
    "served_entities": [
        {
            "entity_name": f"{catalog}.{schema}.{model_name}",
            "entity_version": "1",
            "workload_size": "Small",
            "scale_to_zero_enabled": True
        }
    ],
    "traffic_config": {
        "routes": [
            {
                "served_model_name": f"{model_name}-1",
                "traffic_percentage": 100
            }
        ]
    }
  }
)

Оценка конечной точки модели

Чтобы оценить модель, отправьте запросы в конечную точку обслуживания модели.

Дополнительные ресурсы

Примеры записных книжек

Следующие записные книжки содержат различные зарегистрированные модели Databricks, которые можно использовать для начала работы с конечными точками обслуживания моделей. Дополнительные примеры см. в руководстве по . Развертывание и запрос пользовательской модели.

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

Обучение и регистрация модели scikit-learn для записной книжки обслуживания модели

Возьмите записную книжку

Обучение и регистрация модели HuggingFace для модели, обслуживающей записную книжку

Возьмите записную книжку