Модель млфлов, обслуживающая Azure Databricks

Важно!

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

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

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

Пока эта служба находится в режиме предварительной версии, для них рекомендуется использовать низкие пропускную способность и некритические приложения. Целевая пропускная способность — 20 QPS, а Целевая доступность — 99,5%, хотя ни одна из них не гарантируется. Кроме того, существует ограничение размера полезных данных в 16 МБ на запрос.

Каждая версия модели развертывается с помощью развертывания модели млфлов и выполняется в среде Conda, заданной зависимостями.

Примечание

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

Требования

  • Обслуживание моделей MLflow доступно для моделей MLflow на Python. Необходимо объявить все зависимости модели в среде conda.
  • Чтобы включить обслуживание моделей, необходимо иметь разрешение на создание кластера.

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

Обслуживание моделей доступно в Azure Databricks из реестра Model.

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

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

  1. Перейдите на вкладку « обслуживание ». Если для модели еще не включено обслуживание, появится кнопка Enable обслуживает .

    Кнопка включения обслуживания

  2. Щелкните включить обслуживание. На вкладке «Обслуживание» отображается состояние «ожидание». Через несколько минут состояние изменится на Готово.

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

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

На вкладке « обслуживание » можно отправить запрос обслуживаемой модели и просмотреть ответ.

Включение обслуживания

URI версий модели

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

<databricks-instance>/model/<registered-model-name>/<model-version>/invocations

Например, чтобы вызвать версию 1 модели, зарегистрированную как iris-classifier , используйте этот URI:

https://<databricks-instance>/model/iris-classifier/1/invocations

Версию модели также можно вызвать по ее этапам. Например, если версия 1 находится на рабочем этапе, ее также можно оценить с помощью этого URI:

https://<databricks-instance>/model/iris-classifier/Production/invocations

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

Управление обслуживаемыми версиями

Развертываются все активные (неархивированные) версии модели, и их можно запросить с помощью URI. Azure Databricks автоматически развертывает новые версии модели при их регистрации и автоматически удаляет старые версии при архивировании.

Примечание

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

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

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

Версии развернутой модели

Чтобы оценить развернутую модель, можно использовать пользовательский интерфейс или отправить запрос REST API в URI модели.

Оценка через пользовательский интерфейс

Это самый простой и быстрый способ проверки модели. Вы можете вставить входные данные модели в формате JSON и щелкнуть Отправить запрос. Если модель была зарегистрирована с помощью входного примера (как показано на рисунке выше), щелкните загрузить пример , чтобы загрузить входной пример.

Оценка с помощью запроса REST API

Запрос оценки можно отправить через REST API используя стандартную проверку подлинности. В приведенных ниже примерах демонстрируется проверка подлинности с помощью личного маркера доступа.

MODEL_VERSION_URI https://<databricks-instance>/model/iris-classifier/Production/invocations <databricks-instance> Вот несколько примеров того, как выполнить запрос к обслуживаемой модели (где — имя экземпляра модуляданных) и модуль данных REST API маркера DATABRICKS_API_TOKEN :

Bash

Фрагмент кода для запроса модели, принимающей входные данные кадра данных.

curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
  -H 'Content-Type: application/json' \
  -d '[
    {
      "sepal_length": 5.1,
      "sepal_width": 3.5,
      "petal_length": 1.4,
      "petal_width": 0.2
    }
  ]'

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

curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
   -H 'Content-Type: application/json' \
   -d '{"inputs": [[5.1, 3.5, 1.4, 0.2]]}'

Python

import numpy as np
import pandas as pd
import requests

def create_tf_serving_json(data):
  return {'inputs': {name: data[name].tolist() for name in data.keys()} if isinstance(data, dict) else data.tolist()}

def score_model(model_uri, databricks_token, data):
  headers = {
    "Authorization": f"Bearer {databricks_token}",
    "Content-Type": "application/json",
  }
  data_json = data.to_dict(orient='records') if isinstance(dataset, pd.DataFrame) else create_tf_serving_json(dataset)
  response = requests.request(method='POST', headers=headers, url=model_uri, json=data_json)
  if response.status_code != 200:
      raise Exception(f"Request failed with status {response.status_code}, {response.text}")
  return response.json()

# Scoring a model that accepts pandas DataFrames
data =  pd.DataFrame([{
  "sepal_length": 5.1,
  "sepal_width": 3.5,
  "petal_length": 1.4,
  "petal_width": 0.2
}])
score_model(MODEL_VERSION_URI, DATABRICKS_API_TOKEN, data)

# Scoring a model that accepts tensors
data = np.asarray([[5.1, 3.5, 1.4, 0.2]])
score_model(MODEL_VERSION_URI, DATABRICKS_API_TOKEN, data)

Powerbi

Вы можете оценить набор данных в Power BI Desktop, выполнив следующие действия.

  1. Откройте набор данных, который нужно оценить.

  2. Перейдите к разделу преобразование данных.

  3. Щелкните правой кнопкой мыши на левой панели и выберите создать новый запрос.

  4. Перейдите к просмотру > Расширенный редактор.

  5. Замените текст запроса приведенным ниже фрагментом кода после заполнения соответствующего DATABRICKS_API_TOKEN и MODEL_VERSION_URI .

    (dataset as table ) as table =>
    let
      call_predict = (dataset as table ) as list =>
      let
        apiToken = DATABRICKS_API_TOKEN,
        modelUri = MODEL_VERSION_URI,
        responseList = Json.Document(Web.Contents(modelUri,
          [
            Headers = [
              #"Content-Type" = "application/json",
              #"Authorization" = Text.Format("Bearer #{0}", {apiToken})
            ],
            Content = Json.FromValue(dataset)
          ]
        ))
      in
        responseList,
      predictionList = List.Combine(List.Transform(Table.Split(dataset, 256), (x) => call_predict(x))),
      predictionsTable = Table.FromList(predictionList, (x) => {x}, {"Prediction"}),
      datasetWithPrediction = Table.Join(
        Table.AddIndexColumn(predictionsTable, "index"), "index",
        Table.AddIndexColumn(dataset, "index"), "index")
    in
      datasetWithPrediction
    
  6. Присвойте запросу имя нужного имени модели.

  7. Откройте расширенный редактор запросов для набора данных и примените функцию модели.

Дополнительные сведения о форматах входных данных, принимаемых сервером (например, Pandas Split-ориентированный формат), см. в документации по млфлов.

Отслеживание обслуживаемых моделей

На странице «обслуживающая страница» отображаются индикаторы состояния для обслуживающего кластера, а также отдельные версии модели. Кроме того, для получения дополнительных сведений можно использовать следующую команду:

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

Состояние версии

События модели

Настройка кластера для обслуживания

Чтобы настроить обслуживающий кластер, используйте вкладку Параметры кластера на вкладке « обслуживание ».

Параметры кластера

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

Известные ошибки

ResolvePackageNotFound: pyspark=3.1.0

Эта ошибка может возникать, если модель зависит от pyspark и заносится в журнал с помощью Databricks Runtime 8. x. Если вы видите эту ошибку, укажите pyspark версию явным образом при записи в журнал модели с помощью conda_env параметра.