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


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

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

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

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

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

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

REST API

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

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

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

{
  "name": "unity-model-endpoint",
  "creator": "customer@example.com",
  "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": "customer@example.com",
        "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": "alice@company.com",
    "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

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

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

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

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

Кроме того, можно удалить конечную точку обслуживания программным способом с помощью 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 на конечной точке обслуживания. Дополнительные сведения о уровнях разрешений см. в разделе "Обслуживание списков управления доступом конечных точек".

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

databricks permissions get servingendpoints <endpoint-id>

Grant пользователя jsmith@example.com разрешение CAN QUERY на конечной точке обслуживания.

databricks permissions update servingendpoints <endpoint-id> --json '{
  "access_control_list": [
    {
      "user_name": "jsmith@example.com",
      "permission_level": "CAN_QUERY"
    }
  ]
}'

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

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

Внимание

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

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

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

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

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

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

Заметка

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

Get конечную точку обслуживания модели schema

Внимание

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

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

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

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

schema, возвращенный 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"

подробности ответа Schema

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

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

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

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


{
  "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"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}