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


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

ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение машинного обучения 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/* разрешениями.
    • Для создания развертываний 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>

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

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

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

    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