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


Развертывание моделей MLflow в подключенных конечных точках

ОБЛАСТЬ ПРИМЕНЕНИЯ: расширение Azure CLI ml версии 2 (текущее)

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

Для развертывания без кода Машинное обучение Azure:

  • Динамически устанавливает пакеты Python, перечисленные в файле conda.yaml. В результате система устанавливает зависимости во время выполнения контейнера.
  • Предоставляет базовый образ MLflow или курированную среду, содержащую следующие элементы:

Prerequisites

  • Python 3.10 или более поздней версии.

  • Подписка Azure. Если у вас нет подписки на Azure, создайте бесплатную учетную запись перед началом.

  • Учетная запись пользователя, которая имеет по крайней мере одну из следующих ролей управления доступом на основе ролей Azure (Azure RBAC):

    • Роль владельца рабочей области Машинного обучения Azure
    • Роль участника для рабочей области Машинного обучения Azure
    • Пользовательская роль с Microsoft.MachineLearningServices/workspaces/onlineEndpoints/* разрешениями

    Дополнительные сведения см. в статье "Управление доступом к рабочим областям Azure машинного обучения".

  • Доступ к Машинному обучению Azure:

    Установите Azure CLI и ml расширение в Azure CLI. Инструкции по установке см. в разделе "Установка и настройка интерфейса командной строки( версия 2)".

О примерe

В примере этой статьи показано, как развернуть модель MLflow в сетевой конечной точке для выполнения прогнозов. В примере используется модель MLflow, основанная на наборе данных диабета. Этот набор данных содержит 10 базовых переменных: возраст, секс, индекс массы тела, среднее кровяное давление и шесть измерений крови, полученных от 442 пациентов с диабетом. Он также содержит ответ на интерес, количественное измерение прогрессирования заболеваний в течение одного года после даты базовых данных.

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

Сведения в этой статье основаны на примерах кода из репозитория azureml-examples . Если клонировать репозиторий, вы можете выполнять команды в этой статье локально, не копируя или вставляя файлы YAML и другие файлы. Используйте следующие команды, чтобы клонировать репозиторий и перейти в папку для языка программирования:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Следуйте инструкциям в Jupyter Notebook

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

Подключение к рабочей области

Подключитесь к рабочей области Машинного обучения Azure:

az account set --subscription <subscription-ID>
az configure --defaults workspace=<workspace-name> group=<resource-group-name> location=<location>

Регистрация модели.

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

MODEL_NAME='sklearn-diabetes'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "endpoints/online/ncd/sklearn-diabetes/model"

Что если вы зарегистрировали свою модель в ходе выполнения запуска?

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

Чтобы зарегистрировать модель, необходимо знать расположение хранилища:

  • Если вы используете функцию MLflow autolog , путь к модели зависит от типа модели и платформы. Проверьте выходные данные задания, чтобы определить имя папки модели. Эта папка содержит файл с именем MLModel.
  • Если вы используете метод log_model для ручной регистрации моделей, передайте в него путь к модели как аргумент. Например, если вы используете mlflow.sklearn.log_model(my_model, "classifier") для регистрации модели, — это путь, classifier в котором хранится модель.

С помощью интерфейса командной строки машинного обучения Azure версии 2 можно создать модель из выходных данных задания обучения. Следующий код использует материалы задания с идентификатором $RUN_ID для регистрации модели с именем $MODEL_NAME. $MODEL_PATH — это путь, который задание использует для хранения модели.

az ml model create --name $MODEL_NAME --path azureml://jobs/$RUN_ID/outputs/artifacts/$MODEL_PATH

Развертывание модели MLflow в сетевой конечной точке

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

    Подсказка

    В этом примере для простоты используется проверка подлинности на основе ключей. Для рабочих развертываний корпорация Майкрософт рекомендует проверку подлинности на основе токенов Microsoft Entra (aad_token), которая обеспечивает повышенную безопасность с помощью управления доступом на основе удостоверений. Дополнительные сведения см. в разделе "Проверка подлинности клиентов для сетевых конечных точек".

    Задайте имя конечной точки, выполнив следующую команду. Сначала замените YOUR_ENDPOINT_NAME уникальным именем.

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Чтобы настроить конечную точку, создайте файл YAML с именем create-endpoint.yaml , содержащий следующие строки:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineEndpoint.schema.json
    name: my-endpoint
    auth_mode: key
    
  2. Создание конечной точки:

    az ml online-endpoint create --name $ENDPOINT_NAME -f endpoints/online/ncd/create-endpoint.yaml
    
  3. Настройте развертывание. Развертывание — это набор ресурсов, необходимых для размещения модели, выполняющей фактическое выполнение выводов.

    Создайте файл YAML с именем sklearn-deployment.yaml , который содержит следующие строки:

    $schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
    name: sklearn-deployment
    endpoint_name: my-endpoint
    model:
      name: mir-sample-sklearn-ncd-model
      version: 2
      path: sklearn-diabetes/model
      type: mlflow_model
    instance_type: Standard_DS3_v2
    instance_count: 1
    

    Note

    Автоматическое создание scoring_script и environment поддерживается только для варианта модели PyFunc. Сведения об использовании другого варианта модели см. в статье "Настройка развертываний модели MLflow".

  4. Создайте развертывание:

    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
    az ml online-deployment create --name sklearn-deployment --endpoint $ENDPOINT_NAME -f endpoints/online/ncd/sklearn-deployment.yaml --all-traffic
    
  5. Назначьте весь трафик на развёртывание. На данный момент в конечной точке есть одно развертывание, но ни один трафик не направлен на него.

    Этот шаг не требуется в Azure CLI, если во время создания используется --all-traffic флаг. Если необходимо изменить трафик, используйте az ml online-endpoint update --traffic команду. Дополнительные сведения об обновлении трафика см. в разделе "Постепенное обновление трафика".

  6. Обновите конфигурацию конечной точки:

    Этот шаг не требуется в Azure CLI, если во время создания используется --all-traffic флаг. Если необходимо изменить трафик, используйте az ml online-endpoint update --traffic команду. Дополнительные сведения об обновлении трафика см. в разделе "Постепенное обновление трафика".

Вызов конечной точки

Когда развертывание будет готово, можно использовать его для обслуживания запросов. Одним из способов тестирования развертывания является использование встроенной функции вызова в клиенте развертывания. В репозитории sample-request-sklearn.json примеров файл содержит следующий код JSON. Его можно использовать в качестве примера файла запроса для развертывания.

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

Note

Этот файл использует ключ input_data вместо inputs, который используется службой MLflow. Машинное обучение Azure требует другого формата ввода для автоматического создания контрактов Swagger для конечных точек. Для получения дополнительной информации об ожидаемых форматах входных данных см. Развертывание на встроенном сервере MLflow и развертывание на сервере для инференса в Azure Machine Learning.

Отправьте запрос в конечную точку:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

Ответ должен быть похож на следующий текст:

[ 
  11633.100167144921,
  8522.117402884991
]

Important

Для MLflow no-code-deployment тестирование с помощью локальных конечных точек в настоящее время не поддерживается.

Настройка развертываний модели MLflow

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

Настройте развертывание модели MLflow, если:

  • Модель не имеет вкуса PyFunc.
  • Необходимо настроить способ запуска модели. Например, необходимо использовать mlflow.<flavor>.load_model() для выбора определённого варианта при загрузке модели.
  • Вам потребуется предварительная обработка или постобработка в процессе оценки, так как модель не выполняет эту обработку.
  • Выходные данные модели не могут быть хорошо представлены в табличных данных. Например, выходные данные — это тензор, представляющий изображение.

Important

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

Развертывание пользовательского скрипта оценки

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

Определение папки модели

Определите папку, содержащую модель MLflow, выполнив следующие действия:

  1. Перейдите к Студия машинного обучения Azure.

  2. Перейдите в раздел "Модели".

  3. Выберите модель, которую вы хотите развернуть, и перейдите на вкладку "Артефакты ".

  4. Запишите отображаемую папку. При регистрации модели укажите эту папку.

    Снимок экрана: папка, содержащая артефакты модели.

Создайте сценарий оценки

В следующем скрипте оценки score.py приведен пример выполнения вывода с моделью MLflow. Этот скрипт можно адаптировать к вашим потребностям или изменить любую из его частей, чтобы отразить ваш сценарий. Обратите внимание, что имя папки, которое вы ранее определили, modelвключается в функцию init() .

import logging
import os
import json
import mlflow
from io import StringIO
from mlflow.pyfunc.scoring_server import infer_and_parse_json_input, predictions_to_json


def init():
    global model
    global input_schema
    # "model" is the path of the mlflow artifacts when the model was registered. For automl
    # models, this is generally "mlflow-model".
    model_path = os.path.join(os.getenv("AZUREML_MODEL_DIR"), "model")
    model = mlflow.pyfunc.load_model(model_path)
    input_schema = model.metadata.get_input_schema()


def run(raw_data):
    json_data = json.loads(raw_data)
    if "input_data" not in json_data.keys():
        raise Exception("Request must contain a top level key named 'input_data'")

    serving_input = json.dumps(json_data["input_data"])
    data = infer_and_parse_json_input(serving_input, input_schema)
    predictions = model.predict(data)

    result = StringIO()
    predictions_to_json(predictions, result)
    return result.getvalue()

Создание среды

Следующим шагом является создание среды, в которой можно запустить скрипт оценки. Поскольку модель является моделью MLflow, требования conda также указываются в пакете модели. Дополнительные сведения о файлах, включенных в модель MLflow, см. в формате MLmodel. Вы создаете среду с помощью зависимостей conda из файла. Однако необходимо также включить пакеты azureml-inference-server-http и azureml-ai-monitoring, которые требуются для онлайн-развертываний в Azure Machine Learning.

Вы можете создать файл определения conda с именем conda.yaml, содержащий следующие строки:

channels:
- conda-forge
dependencies:
- python=3.12
- pip
- pip:
  - mlflow
  - scikit-learn==1.7.0
  - cloudpickle==3.1.1
  - psutil==7.0.0
  - pandas==2.3.0
  - azureml-inference-server-http
name: mlflow-env

Note

Раздел dependencies этого файла conda включает в себя azureml-inference-server-http и azureml-ai-monitoring пакеты.

Используйте этот файл зависимостей conda для создания среды:

Вы создаете встроенную среду в конфигурации развертывания.

Создайте развертывание

В папке endpoints/online/ncd создайте файл конфигурации развертывания, deployment.ymlсодержащий следующие строки:

$schema: https://azuremlschemas.azureedge.net/latest/managedOnlineDeployment.schema.json
name: sklearn-diabetes-custom
endpoint_name: my-endpoint
model: azureml:sklearn-diabetes@latest
environment: 
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu22.04
    conda_file: sklearn-diabetes/environment/conda.yaml
code_configuration:
    code: sklearn-diabetes/src
    scoring_script: score.py
instance_type: Standard_F2s_v2
instance_count: 1

Создайте развертывание:

az ml online-deployment create -f endpoints/online/ncd/deployment.yml

Обслуживание запросов

Когда развертывание завершится, оно готово к выполнению запросов. Один из способов тестирования развертывания — использовать invoke метод с примером файла запроса, например следующим файлом: sample-request-sklearn.json

{"input_data": {
    "columns": [
      "age",
      "sex",
      "bmi",
      "bp",
      "s1",
      "s2",
      "s3",
      "s4",
      "s5",
      "s6"
    ],
    "data": [
      [ 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0 ],
      [ 10.0,2.0,9.0,8.0,7.0,6.0,5.0,4.0,3.0,2.0]
    ],
    "index": [0,1]
  }}

Отправьте запрос в конечную точку:

az ml online-endpoint invoke --name $ENDPOINT_NAME --request-file endpoints/online/ncd/sample-request-sklearn.json

Ответ должен быть похож на следующий текст:

{
    "predictions": [ 
    1095.2797413413252,
    1134.585328803727
    ]
}

Note

Ответ содержит predictions ключ при использовании MLflow 2.x или более поздней версии.

Очистка ресурсов

Если конечная точка больше не нужна, удалите связанные с ней ресурсы:

az ml online-endpoint delete --name $ENDPOINT_NAME --yes