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

ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение машинного обучения Azure CLI версии 2 (current)Python SDK azure-ai-ml версии 2 (current)

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

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

Примечание.

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

Сведения об этом примере

В этом примере показано, как развернуть модель MLflow в конечной точке пакетной службы для выполнения пакетных прогнозов. В этом примере используется модель MLflow на основе набора данных болезни сердца UCI. База данных содержит 76 атрибутов, но мы используем подмножество из 14 из них. Модель пытается предсказать наличие сердечно-сосудистых заболеваний у пациента. Целочисленное значение от 0 (нет присутствия) до 1 (присутствие).

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

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

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

Файлы для этого примера находятся в следующих файлах:

cd endpoints/batch/deploy-models/heart-classifier-mlflow

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

Вы можете следовать этому примеру в следующих записных книжках. В клонированного репозитория откройте записную книжку: mlflow-for-batch-tabular.ipynb.

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

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

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

  • Рабочая область Машинного обучения Azure. Если у вас нет одного, выполните действия, описанные в статье "Управление Машинное обучение Azure рабочими областями", чтобы создать ее.

  • Убедитесь, что в рабочей области есть следующие разрешения:

    • Создание конечных точек и развертываний пакетной службы или управление ими: используйте роль владельца, участника или настраиваемую роль, которая позволяет Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.

    • Создайте развертывания ARM в группе ресурсов рабочей области: используйте роль владельца, участника или настраиваемую роль, которая позволяет Microsoft.Resources/deployments/write в группе ресурсов, в которой развернута рабочая область.

  • Для работы с Машинное обучение Azure необходимо установить следующее программное обеспечение:

    Azure CLI и mlрасширение для Машинное обучение Azure.

    az extension add -n ml
    

    Примечание.

    Развертывания компонентов конвейера для конечных точек пакетной службы появились в версии 2.7 ml расширения для Azure CLI. Используется az extension update --name ml для получения последней версии.

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

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

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

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

Шаги

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

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

    MODEL_NAME='heart-classifier-mlflow'
    az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
    
  2. Прежде чем двигаться вперед, необходимо убедиться, что пакетные развертывания, которые мы собираемся создать, могут выполняться в некоторых инфраструктурах (вычислениях). Пакетные развертывания могут выполняться на любом Машинное обучение Azure вычислительных ресурсах, которые уже существуют в рабочей области. Это означает, что несколько пакетных развертываний могут совместно использовать одну и ту же инфраструктуру вычислений. В этом примере мы будем работать над Машинное обучение Azure вычислительным cpu-clusterкластером. Давайте убедимся, что вычислительные ресурсы существуют в рабочей области или создадим его в противном случае.

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

    az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
    
  3. Теперь пришло время создать конечную точку пакетной службы и развертывание. Начнем с конечной точки. Для конечных точек требуется только имя и описание. Имя конечной точки будет в конечном итоге в URI, связанном с вашей конечной точкой. Из-за этого имена конечных точек пакетной службы должны быть уникальными в пределах региона Azure. Например, в ней может быть только одна конечная точка пакетной службы с именем mybatchendpointwestus2.

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

    ENDPOINT_NAME="heart-classifier"
    
  4. Создание конечной точки:

    Чтобы создать новую конечную точку YAML , создайте конфигурацию следующим образом:

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: heart-classifier-batch
    description: A heart condition classifier for batch inference
    auth_mode: aad_token
    

    Затем создайте конечную точку со следующей командой:

    az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
    
  5. Теперь давайте создадим развертывание. Модели MLflow не требуют указания среды или скрипта оценки при создании развертываний, созданных для вас. Однако их можно указать, если вы хотите настроить способ вывода развертывания.

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

    deployment-simple/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: heart-classifier-batch
    name: classifier-xgboost-mlflow
    description: A heart condition classifier based on XGBoost
    type: model
    model: azureml:heart-classifier-mlflow@latest
    compute: azureml:batch-cluster
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 2
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    

    Затем создайте развертывание с помощью следующей команды:

    az ml batch-deployment create --file deployment-simple/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    

    Внимание

    Настройте timeout в развертывании в зависимости от того, сколько времени требуется для выполнения вывода модели в одном пакете. Чем больше размер пакета, тем больше это значение должно быть. Remeber, mini_batch_size указывающий количество файлов в пакете, а не количество выборок. При работе с табличными данными каждый файл может содержать несколько строк, что увеличит время, необходимое для обработки каждого файла пакетной конечной точки. Используйте высокие значения в этих случаях, чтобы избежать ошибок времени ожидания.

  6. Хотя вы можете вызвать определенное развертывание внутри конечной точки, обычно требуется вызвать саму конечную точку и разрешить конечной точке решить, какое развертывание следует использовать. Такое развертывание называется развертыванием по умолчанию. Это дает возможность изменять развертывание по умолчанию и, следовательно, изменять модель, обслуживающую развертывание, без изменения контракта с пользователем, вызывающим конечную точку. Чтобы обновить развертывание по умолчанию, используйте следующую инструкцию:

    DEPLOYMENT_NAME="classifier-xgboost-mlflow"
    az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
    
  7. На этом этапе наша конечная точка пакетной службы готова к использованию.

Тестирование развертывания

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

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

    a. Создание определения ресурса данных в YAML:

    heart-dataset-unlabeled.yml

    $schema: https://azuremlschemas.azureedge.net/latest/data.schema.json
    name: heart-dataset-unlabeled
    description: An unlabeled dataset for heart classification.
    type: uri_folder
    path: data
    

    b. Создайте ресурс данных:

    az ml data create -f heart-dataset-unlabeled.yml
    
  2. Теперь, когда данные передаются и готовы к использованию, давайте вызовем конечную точку:

    JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:heart-dataset-unlabeled@latest --query name -o tsv)
    

    Примечание.

    jq Программа не может быть установлена во всех установках. Инструкции по установке можно получить по этой ссылке.

    Совет

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

  3. Пакетное задание запускается сразу после возврата команды. Вы можете отслеживать состояние задания, пока оно не завершится:

    az ml job show -n $JOB_NAME --web
    

Анализ выходных данных

Выходные прогнозы создаются в predictions.csv файле, как указано в конфигурации развертывания. Задание создает именованные выходные данные, вызываемые score местом размещения этого файла. Для каждого пакетного задания создается только один файл.

Файл структурирован следующим образом:

  • На каждую точку данных, отправленную в модель, существует одна строка. Для табличных данных это означает, что файл (predictions.csv) содержит одну строку для каждой строки, присутствующих в каждом из обработанных файлов. Для других типов данных (например, изображений, аудио, текста) для каждого обработанного файла существует одна строка.

  • Следующие столбцы находятся в файле (в порядке):

    • row (необязательно), соответствующий индекс строки в входном файле данных. Это применяется только в том случае, если входные данные являются табличными. Прогнозы возвращаются в том же порядке, что они отображаются в входном файле, чтобы вы могли полагаться на номер строки для сопоставления соответствующего прогноза.
    • prediction, прогноз, связанный с входными данными. Это значение возвращается как есть, оно было предоставлено функцией модели predict(). .
    • file_name— имя файла, из которого считывались данные. В табличных данных используйте это поле, чтобы узнать, какой прогноз принадлежит входным данным.

Результаты задания можно скачать с помощью имени задания:

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

az ml job download --name $JOB_NAME --output-name score --download-path ./

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

import pandas as pd

score = pd.read_csv(
    "named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)

Выходные данные выглядят следующим образом:

строка прогноз файл
0 0 heart-unlabeled-0.csv
1 1 heart-unlabeled-0.csv
2 0 heart-unlabeled-0.csv
... ... ...
307 0 heart-unlabeled-3.csv

Совет

Обратите внимание, что в этом примере входные данные были табличными данными в CSV формате и были 4 различных входных файла (heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv и heart-unlabeled-3.csv).

Рекомендации при развертывании в пакетном выводе

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

Распределение работы для рабочих ролей

Пакетные конечные точки распределяют работу на уровне файла как для структурированных, так и неструктурированных данных. В результате для этой функции поддерживаются только URI-файлы и папки URI. Каждый рабочий процесс одновременно обрабатывает пакеты из Mini batch size файлов. Для табличных данных конечные точки пакетной службы не учитывают количество строк внутри каждого файла при распределении работы.

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

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

Пакетные развертывания вызывают predict функцию модели MLflow один раз на файл. Для CSV-файлов, содержащих несколько строк, это может привести к нехватке памяти в базовом вычислении и может увеличить время, необходимое для модели для оценки одного файла (специально для дорогостоящих моделей, таких как большие языковые модели). Если в журналах возникает несколько исключений вне памяти или записей времени ожидания, рекомендуется разделить данные в небольших файлах с меньшим количеством строк или реализовать пакетную обработку на уровне строки внутри сценария модели или оценки.

Поддержка типов файлов

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

Расширение файла Тип, возвращаемый в качестве входных данных модели Требование к подписи
.csv, , .parquet.pqt pd.DataFrame ColSpec. Если ничего не указано, типизация столбцов не применяется.
.png, , .jpg.tiff.jpeg.bmp,.gif np.ndarray TensorSpec. Входные данные изменены в соответствии с формой тензоров, если они доступны. Если подпись недоступна, выводятся тензоры типа np.uint8. Дополнительные рекомендации см. в статье "Рекомендации по обработке образов моделей MLflow".

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

Обратите внимание, что любой неподдерживаемый файл, который может присутствовать в входных данных, приведет к сбою задания. Вы увидите запись об ошибке следующим образом: "ERROR:azureml:Error processing input file: "/mnt/batch/tasks/.../a-given-file.avro". Тип файла avro не поддерживается."

Принудительное применение подписи для моделей MLflow

Типы данных ввода применяются заданиями пакетного развертывания при чтении данных с помощью доступной подписи модели MLflow. Это означает, что входные данные должны соответствовать типам, указанным в сигнатуре модели. Если данные не могут быть проанализированы должным образом, задание завершится ошибкой с сообщением об ошибке, аналогичным следующему: "ERROR:azureml:Error processing file: "/mnt/batch/tasks/.../a-given-file.csv". Исключение: недопустимый литерал для int() с базовым 10: value.

Совет

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

Сигнатуру модели можно проверить, открыв MLmodel файл, связанный с моделью MLflow. Дополнительные сведения о том, как подписи работают в MLflow, см. в разделе "Подписи" в MLflow.

Поддержка вкуса

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

Настройка развертываний моделей MLflow с помощью скрипта оценки

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

Обычно этот рабочий процесс выбирается при следующем:

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

Внимание

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

Шаги

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

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

    a. Перейдите на портал Машинное обучение Azure.

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

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

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

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

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

    deployment-custom/code/batch_driver.py

    # Copyright (c) Microsoft. All rights reserved.
    # Licensed under the MIT license.
    
    import os
    import glob
    import mlflow
    import pandas as pd
    import logging
    
    
    def init():
        global model
        global model_input_types
        global model_output_names
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        # It is the path to the model folder
        # Please provide your model's folder name if there's one
        model_path = glob.glob(os.environ["AZUREML_MODEL_DIR"] + "/*/")[0]
    
        # Load the model, it's input types and output names
        model = mlflow.pyfunc.load(model_path)
        if model.metadata and model.metadata.signature:
            if model.metadata.signature.inputs:
                model_input_types = dict(
                    zip(
                        model.metadata.signature.inputs.input_names(),
                        model.metadata.signature.inputs.pandas_types(),
                    )
                )
            if model.metadata.signature.outputs:
                if model.metadata.signature.outputs.has_input_names():
                    model_output_names = model.metadata.signature.outputs.input_names()
                elif len(model.metadata.signature.outputs.input_names()) == 1:
                    model_output_names = ["prediction"]
        else:
            logging.warning(
                "Model doesn't contain a signature. Input data types won't be enforced."
            )
    
    
    def run(mini_batch):
        print(f"run method start: {__file__}, run({len(mini_batch)} files)")
    
        data = pd.concat(
            map(
                lambda fp: pd.read_csv(fp).assign(filename=os.path.basename(fp)), mini_batch
            )
        )
    
        if model_input_types:
            data = data.astype(model_input_types)
    
        # Predict over the input data, minus the column filename which is not part of the model.
        pred = model.predict(data.drop("filename", axis=1))
    
        if pred is not pd.DataFrame:
            if not model_output_names:
                model_output_names = ["pred_col" + str(i) for i in range(pred.shape[1])]
            pred = pd.DataFrame(pred, columns=model_output_names)
    
        return pd.concat([data, pred], axis=1)
    
  3. Создадим среду, в которой можно выполнить скрипт оценки. Так как наша модель является MLflow, требования conda также указаны в пакете модели (дополнительные сведения о моделях MLflow и файлах, включенных в него, см . в формате MLmodel). Затем мы создадим среду с помощью зависимостей conda из файла. Однако необходимо также включить пакетazureml-core, необходимый для пакетных развертываний.

    Совет

    Если модель уже зарегистрирована в реестре моделей, вы можете скачать или скопировать conda.yml файл, связанный с моделью, перейдя в раздел Студия машинного обучения Azure> Model > Select your model from the list > Artifacts. Откройте корневую папку в навигации и выберите указанный conda.yml файл. Щелкните "Скачать" или скопируйте его содержимое.

    Внимание

    В этом примере используется среда conda, указанная в /heart-classifier-mlflow/environment/conda.yaml. Этот файл был создан путем объединения исходного файла зависимостей conda MLflow и добавления пакета azureml-core. Файл из модели нельзя использовать conda.yml напрямую.

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

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  4. Настройка развертывания:

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

    deployment-custom/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: heart-classifier-batch
    name: classifier-xgboost-custom
    description: A heart condition classifier based on XGBoost
    type: model
    model: azureml:heart-classifier-mlflow@latest
    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    compute: azureml:batch-cluster
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 2
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    
  5. Теперь создадим развертывание:

    az ml batch-deployment create --file deployment-custom/deployment.yml --endpoint-name $ENDPOINT_NAME
    
  6. На этом этапе наша конечная точка пакетной службы готова к использованию.

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

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

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

Следующие шаги