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


Развертывание моделей MLflow в пакетных развертываниях в Машинное обучение Azure

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

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

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

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

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

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

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

  • Следующие разрешения в рабочей области Машинное обучение Azure:

    • Для создания конечных точек и развертываний пакетной службы или управления ими используйте роль владельца, участника или настраиваемую роль, назначаемую Microsoft.MachineLearningServices/workspaces/batchEndpoints/* разрешениями.
    • Для создания развертываний Azure Resource Manager в группе ресурсов рабочей области: используйте владельца, участника или настраиваемую роль, Microsoft.Resources/deployments/write назначаемую разрешением в группе ресурсов, в которой развернута рабочая область.
  • Интерфейс командной строки Машинное обучение Azure или пакет SDK Машинное обучение Azure для Python:

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

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

Развертывание модели MLflow

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

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

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

Примечание.

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

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

MODEL_NAME='heart-classifier-mlflow'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"

Создание вычислительного кластера

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

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

Создание вычислительного кластера

az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5

Создание пакетной конечной точки

Чтобы создать конечную точку, вам потребуется имя и описание. Имя конечной точки отображается в URI, связанном с конечной точкой, поэтому оно должно быть уникальным в регионе Azure. Например, в регионе WestUS2 может быть только одна конечная точка пакетной службы с именем mybatchendpoint .

  1. Поместите имя конечной точки в переменную для простой ссылки позже:

    Выполните следующую команду:

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

    1. Чтобы создать новую конечную точку 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
      
    2. Создайте конечную точку с помощью следующей команды:

      az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
      

Создание пакетного развертывания

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

  1. Чтобы создать развертывание в созданной конечной точке, создайте 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
    
  2. Создайте развертывание с помощью следующей команды:

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

Внимание

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

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

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

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

DEPLOYMENT_NAME="classifier-xgboost-mlflow"
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME

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

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

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

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

    1. Создайте определение ресурса данных в 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
      
    2. Создайте ресурс данных:

      az ml data create -f heart-dataset-unlabeled.yml
      
  2. После отправки данных вызовите конечную точку.

    Совет

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

    Выполните следующую команду:

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

    Примечание.

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

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

    Выполните следующую команду:

    az ml job show -n $JOB_NAME --web
    

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

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

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

  • Одна строка на каждую точку данных, отправляемую в модель. Для табличных данных файл 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. Существует четыре разных входных файла: heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv и heart-unlabeled-3.csv.

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

Машинное обучение поддерживает развертывание моделей MLflow в пакетных конечных точках без указания скрипта оценки. Этот подход — удобный способ развертывания моделей, требующих обработки больших объемов данных, аналогичных пакетной обработке. Машинное обучение использует сведения в спецификации модели 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 input file: '/mnt/batch/tasks/.../a-given-file.csv'. Исключение: недопустимый литерал для int() с базовым 10: "value".

Совет

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

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

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

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

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

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

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

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

Внимание

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

Использование скрипта оценки

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

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

    1. На портале Машинное обучение Azure перейдите к моделям.

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

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

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

  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 в разделе "Модели>выберите модель" из списка>артефактов. В корневой 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
    

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

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

После завершения упражнения удалите ресурсы, которые больше не требуются.

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

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

Эта команда не удаляет задания пакетной оценки.