Поделиться через


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

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

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

Получение состояния конечной точки модели

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

Проверьте состояние и сведения конечной точки программным способом с помощью REST API или пакета SDK для развертываний MLflow:

REST API

GET /api/2.0/serving-endpoints/{name}

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

В следующем примере ответа поле "READY" означает, state.ready что конечная точка готова к получению трафика. Поле state.update_stateNOT_UPDATING, и pending_config больше не возвращается, так как обновление успешно завершено.

{
  "name": "unity-model-endpoint",
  "creator": "[email protected]",
  "creation_timestamp": 1666829055000,
  "last_updated_timestamp": 1666829055000,
  "state": {
    "ready": "READY",
    "update_state": "NOT_UPDATING"
  },
  "config": {
    "served_entities": [
      {
        "name": "my-ads-model",
        "entity_name": "myCatalog.mySchema.my-ads-model",
        "entity_version": "1",
        "workload_size": "Small",
        "scale_to_zero_enabled": false,
        "state": {
          "deployment": "DEPLOYMENT_READY",
          "deployment_state_message": ""
        },
        "creator": "[email protected]",
        "creation_timestamp": 1666829055000
      }
    ],
    "traffic_config": {
      "routes": [
        {
          "served_model_name": "my-ads-model",
          "traffic_percentage": 100
        }
      ]
    },
    "config_version": 1
  },
  "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "permission_level": "CAN_MANAGE"
}

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

from mlflow.deployments import get_deploy_client

client = get_deploy_client("databricks")
endpoint = client.get_endpoint(endpoint="chat")
assert endpoint == {
    "name": "chat",
    "creator": "[email protected]",
    "creation_timestamp": 0,
    "last_updated_timestamp": 0,
    "state": {...},
    "config": {...},
    "tags": [...],
    "id": "88fd3f75a0d24b0380ddc40484d7a31b",
}

Остановка модельного сервисного конечного пункта

Вы можете временно остановить конечную точку обслуживания модели и запустить ее позже. Когда конечная точка остановлена, ресурсы, подготовленные для него, завершаются, и конечная точка не может обслуживать запросы, пока не будет запущена снова. Только конечные точки, обслуживающие пользовательские модели, не оптимизированы по маршрутам и не имеют обновлений в процессе, могут быть остановлены. Остановленные конечные точки не учитываются в квоте ресурса. Запросы, отправленные в остановленную конечную точку, возвращают ошибку 400.

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

  1. Щелкните конечную точку, которую вы хотите остановить.
  2. Нажмите кнопку " Остановить " в правом верхнем углу.

Кроме того, можно программно остановить конечную точку обслуживания с помощью REST API следующим образом:

POST /api/2.0/serving-endpoints/{name}/config:stop

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

  1. Щелкните конечную точку, которую вы хотите запустить.
  2. Нажмите кнопку " Пуск" в правом верхнем углу.

Кроме того, можно запустить остановленную конечную точку обслуживания программным способом с помощью REST API следующим образом:

POST /api/2.0/serving-endpoints/{name}/config:start

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

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

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

  1. Щелкните "Служить " на боковой панели.
  2. Щелкните конечную точку, которую нужно удалить.
  3. Щелкните меню кебаб в верхней части и выберите Удалить.

Кроме того, можно удалить конечную точку обслуживания программным способом с помощью REST API или пакета SDK для развертываний MLflow.

REST API

DELETE /api/2.0/serving-endpoints/{name}

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

from mlflow.deployments import get_deploy_client

client = get_deploy_client("databricks")
client.delete_endpoint(endpoint="chat")

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

Для отладки любых проблем с конечной точкой можно получить следующее:

  • Журналы сборки контейнера модельного сервера
  • Журналы сервера модели

Эти журналы также доступны из интерфейса Конечные точки на вкладке «Журналы».

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


GET /api/2.0/serving-endpoints/{name}/served-models/{served-model-name}/build-logs
{
  “config_version”: 1  // optional
}

Для журналов сервера модели для модели обслуживания можно использовать следующий запрос:


GET /api/2.0/serving-endpoints/{name}/served-models/{served-model-name}/logs

{
  “config_version”: 1  // optional
}

Управление разрешениями в конечной точке обслуживания модели

Для изменения разрешений необходимо иметь по крайней мере разрешение CAN MANAGE на конечной точке обслуживания. Для получения дополнительной информации об уровнях разрешений см. раздел Списки контроля доступа конечных точек.

Получите список разрешений в конечной точке обслуживания.

databricks permissions get servingendpoints <endpoint-id>

Предоставьте пользователю [email protected] разрешение CAN QUERY на конечной точке обслуживания.

databricks permissions update servingendpoints <endpoint-id> --json '{
  "access_control_list": [
    {
      "user_name": "[email protected]",
      "permission_level": "CAN_QUERY"
    }
  ]
}'

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

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

Внимание

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

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

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

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

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

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

Заметка

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

Получите схему сервисной конечной точки модели

Внимание

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

Схема запроса конечной точки обслуживания — это формальное описание конечной точки обслуживания с помощью стандартной спецификации OpenAPI в формате JSON. Он содержит сведения о конечной точке, включая путь к конечной точке, сведения о запросе конечной точки, например формате текста запроса и ответа, а также типе данных для каждого поля. Эта информация может быть полезной для сценариев воспроизведения или при необходимости информации о конечной точке, но вы не являетесь создателем исходной конечной точки или владельцем.

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

В следующих примерах показано, как программно получить схему конечной точки обслуживания модели с помощью REST API. Сведения о схемах конечных точек обслуживания функций см. в разделе "Что такое Служба компонентов Databricks?".

Схема, возвращаемая API, находится в формате объекта JSON, следующего за спецификацией OpenAPI.


ACCESS_TOKEN="<endpoint-token>"
ENDPOINT_NAME="<endpoint name>"

curl "https://example.databricks.com/api/2.0/serving-endpoints/$ENDPOINT_NAME/openapi" -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json"

Сведения о ответе схемы

Ответ — это спецификация OpenAPI в формате JSON, включая такие поля, как openapi, infoservers и paths. Так как ответ схемы является объектом JSON, его можно проанализировать с помощью общих языков программирования и создать клиентский код из спецификации с помощью сторонних средств. Вы также можете визуализировать спецификацию OpenAPI с помощью сторонних инструментов, таких как Редактор Swagger.

К основным полям ответа относятся:

  • В info.title поле отображается имя конечной точки обслуживания.
  • Поле servers всегда содержит один объект, обычно это поле, являющееся базовым URL-адресом конечной точки.
  • Объект paths в ответе содержит все поддерживаемые пути для конечной точки. Ключи в объекте — ЭТО URL-адрес пути. Каждый path может поддерживать несколько форматов входных данных. Эти входные данные перечислены в oneOf поле.

Ниже приведен пример ответа схемы конечной точки:

{
  "openapi": "3.1.0",
  "info": {
    "title": "example-endpoint",
    "version": "2"
  },
  "servers": [{ "url": "https://example.databricks.com/serving-endpoints/example-endpoint" }],
  "paths": {
    "/served-models/vanilla_simple_model-2/invocations": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "dataframe_split": {
                        "type": "object",
                        "properties": {
                          "columns": {
                            "description": "required fields: int_col",
                            "type": "array",
                            "items": {
                              "type": "string",
                              "enum": ["int_col", "float_col", "string_col"]
                            }
                          },
                          "data": {
                            "type": "array",
                            "items": {
                              "type": "array",
                              "prefixItems": [
                                {
                                  "type": "integer",
                                  "format": "int64"
                                },
                                {
                                  "type": "number",
                                  "format": "double"
                                },
                                {
                                  "type": "string"
                                }
                              ]
                            }
                          }
                        }
                      },
                      "params": {
                        "type": "object",
                        "properties": {
                          "sentiment": {
                            "type": "number",
                            "format": "double",
                            "default": "0.5"
                          }
                        }
                      }
                    },
                    "examples": [
                      {
                        "columns": ["int_col", "float_col", "string_col"],
                        "data": [
                          [3, 10.4, "abc"],
                          [2, 20.4, "xyz"]
                        ]
                      }
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "dataframe_records": {
                        "type": "array",
                        "items": {
                          "required": ["int_col", "float_col", "string_col"],
                          "type": "object",
                          "properties": {
                            "int_col": {
                              "type": "integer",
                              "format": "int64"
                            },
                            "float_col": {
                              "type": "number",
                              "format": "double"
                            },
                            "string_col": {
                              "type": "string"
                            },
                            "becx_col": {
                              "type": "object",
                              "format": "unknown"
                            }
                          }
                        }
                      },
                      "params": {
                        "type": "object",
                        "properties": {
                          "sentiment": {
                            "type": "number",
                            "format": "double",
                            "default": "0.5"
                          }
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "predictions": {
                      "type": "array",
                      "items": {
                        "type": "number",
                        "format": "double"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}