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

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

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

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

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

Совет

Рабочие области без доступа к общедоступной сети. Перед развертыванием моделей MLflow в сетевых конечных точках без подключения к исходящим данным необходимо упаковать модели (предварительная версия). Используя упаковку моделей, можно избежать необходимости подключения к Интернету, Машинное обучение Azure в противном случае потребуется динамически установить необходимые пакеты Python для моделей MLflow.

Пример

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

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

Сведения в этой статье основаны на примерах кода, имеющихся в репозитории azureml-examples. Чтобы выполнить команды локально без необходимости копирования и вставки YAML и других файлов, клонируйте репозиторий и измените каталоги cliна , если вы используете Azure CLI. Если вы используете пакет SDK Машинное обучение Azure для Python, измените каталоги sdk/python/endpoints/online/mlflowна .

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

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

Чтобы использовать пакет SDK для Python для Машинное обучение Azure, откройте модель Развертывания MLflow в записной книжке веб-конечных точек в клонированного репозитория.

Необходимые компоненты

Перед выполнением действий, описанных в этой статье, убедитесь, что выполнены следующие необходимые условия:

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

  • Управление доступом на основе ролей Azure (Azure RBAC) используется для предоставления доступа к операциям в Машинном обучении Azure. Чтобы выполнить действия, описанные в этой статье, учетная запись пользователя должна быть назначена роль владельца или участника для рабочей области Машинное обучение Azure или настраиваемой ролиMicrosoft.MachineLearningServices/workspaces/onlineEndpoints/*. Дополнительные сведения о ролях см. в статье "Управление доступом к рабочей области Машинное обучение Azure".

  • У вас должна быть модель MLflow, зарегистрированная в рабочей области. В этой статье регистрируется модель, обученная для набора данных диабета в рабочей области.

  • Кроме того, необходимо:


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

Сначала подключитесь к рабочей области Машинное обучение Azure, в которой вы будете работать.

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> 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 для создания модели из выходных данных задания обучения. В следующем примере именованная $MODEL_NAME модель регистрируется с помощью артефактов задания с идентификатором $RUN_ID. Путем, где хранится модель, является $MODEL_PATH.

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

Примечание.

Путь $MODEL_PATH — это расположение, где модель хранилась при выполнении.

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

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

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

    export ENDPOINT_NAME="<YOUR_ENDPOINT_NAME>"
    

    Настройка конечной точки:

    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. Настройте развертывание. Развертывание представляет собой набор ресурсов, необходимых для размещения модели, которая выполняет процесс вывода.

    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
    

    Примечание.

    Автоматическое 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
    

    Если у конечной точки нет подключения к исходящего трафика, используйте упаковку модели (предварительную версию), включив флаг --with-package:

    az ml online-deployment create --with-package --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. Дополнительные сведения об обновлении трафика см. в статье о постепенном обновлении трафика.

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

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

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]
  }}

Примечание.

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

Отправьте запрос в конечную точку следующим образом:

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

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

[ 
  11633.100167144921,
  8522.117402884991
]

Внимание

Для развертывания MLflow без кода тестирование через локальные конечные точки в настоящее время не поддерживается.

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

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

Обычно вам нужно настроить развертывание модели MLflow, когда:

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

Внимание

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

Шаги

Чтобы развернуть модель MLflow с помощью пользовательского скрипта оценки:

  1. Определите папку, в которой находится модель MLflow.

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

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

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

    d. Запишите отображаемую папку. Эта папка была указана при регистрации модели.

    Снимок экрана: папка, в которой размещены артефакты модели.

  2. Создайте скрипт оценки. Обратите внимание, как имя model папки, которое вы ранее определили, входит в функцию init() .

    Совет

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

    score.py

    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 2.0. Указанный сценарий оценки будет работать с MLflow 1.X и MLflow 2.X. Однако следует рекомендовать, что ожидаемые форматы входных и выходных данных в этих версиях могут отличаться. Проверьте определение среды, используемое для обеспечения использования ожидаемой версии MLflow. Обратите внимание, что MLflow 2.0 поддерживается только в Python 3.8+.

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

    Файл определения conda выглядит следующим образом:

    conda.yml

    channels:
    - conda-forge
    dependencies:
    - python=3.9
    - pip
    - pip:
      - mlflow
      - scikit-learn==1.2.2
      - cloudpickle==2.2.1
      - psutil==5.9.4
      - pandas==2.0.0
      - azureml-inference-server-http
    name: mlflow-env
    

    Примечание.

    Пакет azureml-inference-server-http был добавлен в исходный файл зависимостей conda.

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

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

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

    Создайте файл конфигурации развертывания 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.yml
    code_configuration:
      code: sklearn-diabetes/src
      scoring_script: score.py
    instance_type: Standard_F2s_v2
    instance_count: 1
    

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

    az ml online-deployment create -f deployment.yml
    
  5. После завершения развертывания он будет готов к выполнению запросов. Одним из способов тестирования развертывания является использование примера файла запроса вместе с методом 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": [ 
        11633.100167144921,
        8522.117402884991
      ]
    }
    

    Предупреждение

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

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

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

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