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


Настройка выходных данных в пакетных развертываниях

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

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

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

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

Об этом примере

В этом примере показано, как развернуть модель для выполнения пакетного вывода и настроить способ записи прогнозов в выходные данные. Модель основана на наборе данных болезни сердца 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/custom-outputs-parquet

Следуйте инструкциям в записной книжке Jupyter

Существует записная книжка Jupyter, которую можно использовать для выполнения этого примера. В клонированного репозитория откройте записную книжку с именем custom-output-batch.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>

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

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

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

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

MODEL_NAME='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"

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

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

  1. Считывает входные данные в виде CSV-файлов.
  2. Выполняет функцию модели predict MLflow по входным данным.
  3. Добавляет прогнозы pandas.DataFrame наряду с входными данными.
  4. Записывает данные в файл с именем входного файла, но в parquet формате.

код/batch_driver.py

import os
import pickle
import glob
import pandas as pd
from pathlib import Path
from typing import List


def init():
    global model
    global output_path

    # 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:
    output_path = os.environ["AZUREML_BI_OUTPUT_PATH"]
    model_path = os.environ["AZUREML_MODEL_DIR"]
    model_file = glob.glob(f"{model_path}/*/*.pkl")[-1]

    with open(model_file, "rb") as file:
        model = pickle.load(file)


def run(mini_batch: List[str]):
    for file_path in mini_batch:
        data = pd.read_csv(file_path)
        pred = model.predict(data)

        data["prediction"] = pred

        output_file_name = Path(file_path).stem
        output_file_path = os.path.join(output_path, output_file_name + ".parquet")
        data.to_parquet(output_file_path)

    return mini_batch

Примечания:

  • Обратите внимание, как переменная AZUREML_BI_OUTPUT_PATH среды используется для получения доступа к выходному пути задания развертывания.
  • Функция init() заполняет глобальную переменную output_path , которая может использоваться позже для определения места записи.
  • Метод run возвращает список обработанных файлов. Для возврата list объекта или pandas.DataFrame объекта требуется run функция.

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

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

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

Теперь вы создадите пакетную конечную точку с именем heart-classifier-batch , в которой развернута модель.

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

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

    ENDPOINT_NAME="heart-classifier-custom"
    
  2. Настройте конечную точку пакетной службы.

    Следующий ФАЙЛ 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
    
  3. Создание конечной точки:

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

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

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

  1. Сначала создайте среду, в которой можно выполнить скрипт оценки:

    Для Машинное обучение Azure CLI не требуется дополнительный шаг. Определение среды включается в файл развертывания.

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  2. Создайте развертывание. Обратите внимание, что output_action теперь задано значение SUMMARY_ONLY.

    Примечание.

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

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

    $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 and Scikit-Learn pipelines that append predictions on parquet files.
    type: model
    model: azureml:heart-classifier-sklpipe@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: summary_only
      retry_settings:
        max_retries: 3
        timeout: 300
      error_threshold: -1
      logging_level: info
    

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

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

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

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

  1. Вызов конечной точки с данными из учетной записи хранения:

    JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data --query name -o tsv)
    

    Примечание.

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

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

    az ml job show -n $JOB_NAME --web
    

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

Задание создает именованные выходные данные, вызываемые score при размещении всех созданных файлов. Так как вы написали в каталог непосредственно, один файл на каждый входной файл, то вы можете ожидать, что и одно и то же количество файлов. В этом примере присвойте выходным файлам то же имя, что и входные данные, но у них есть расширение parquet.

Примечание.

Обратите внимание, что файл predictions.csv также включен в выходную папку. Этот файл содержит сводку обработанных файлов.

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

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

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

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

import pandas as pd
import glob

output_files = glob.glob("named-outputs/score/*.parquet")
score = pd.concat((pd.read_parquet(f) for f in output_files))
score

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

возраст sex ... thal прогноз
63 1 ... fixed 0
67 1 ... Обычная 1
67 1 ... обратимый 0
37 1 ... Обычная 0

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

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

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