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


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

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

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

Для развертывания без кода с Azure Machine Learning:

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

Prerequisites

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

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

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

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

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

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

О примерe

В этом примере показано, как развернуть модель MLflow в сетевой конечной точке для выполнения прогнозов. В примере используется модель MLflow, основанная на наборе данных диабета. Этот набор данных содержит 10 базовых переменных: возраст, пол, индекс массы тела, среднее кровяное давление и 6 измерений крови, полученных от 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. Используйте следующий код, чтобы настроить режим имени и проверки подлинности конечной точки, в которой требуется развернуть модель:

    Задайте имя конечной точки, выполнив следующую команду. Сначала замените 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()

Warning

Рекомендации MLflow 2.0. Пример скрипта оценки работает с MLflow 1.X и MLflow 2.X. Однако ожидаемые форматы входных и выходных данных в этих версиях могут отличаться. Проверьте определение среды, чтобы узнать, какую версию MLflow вы используете. MLflow 2.0 поддерживается только в Python 3.8 и более поздних версиях.

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

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

Вы можете создать файл определения 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.

Используйте этот файл зависимостей 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
    ]
}

Warning

Рекомендации по MLflow 2.0: в MLflow 1.X ответ не содержит ключа predictions.

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

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

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