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

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

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

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

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

  • Он работает с изображениями размером 244x244 (тензорами (224, 224, 3)).
  • Для этого требуется масштабирование входных данных до диапазона [0,1].

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

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/imagenet-classifier

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

Вы можете следовать этому примеру в Jupyter Notebook. В клонированного репозитория откройте записную книжку: imagenet-classifier-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>

Классификация изображений с помощью пакетных развертываний

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

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

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

Определите имя конечной точки:

ENDPOINT_NAME="imagenet-classifier-batch"

Следующий ФАЙЛ YAML определяет конечную точку пакетной службы:

endpoint.yml

$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
name: imagenet-classifier-batch
description: A batch endpoint for performing image classification using a TFHub model ImageNet model.
auth_mode: aad_token

Выполните следующий код, чтобы создать конечную точку.

az ml batch-endpoint create --file endpoint.yml  --name $ENDPOINT_NAME

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

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

  1. Скачивание копии модели:

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip
    unzip model.zip -d .
    
  2. Зарегистрируйте модель:

    MODEL_NAME='imagenet-classifier'
    az ml model create --name $MODEL_NAME --path "model"
    

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

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

  • Указывает функцию init , загружающую модель с помощью keras модуля tensorflow.
  • Указывает функцию, выполняемую run для каждого мини-пакета, которую предоставляет пакетное развертывание.
  • Функция run считывает одно изображение файла за раз
  • Метод run изменяет размер изображений до ожидаемых размеров модели.
  • Метод run перемасштабирует изображения до домена диапазона [0,1] , который ожидает модель.
  • Он возвращает классы и вероятности, связанные с прогнозами.

code/score-by-file/batch_driver.py

import os
import numpy as np
import pandas as pd
import tensorflow as tf
from os.path import basename
from PIL import Image
from tensorflow.keras.models import load_model


def init():
    global model
    global input_width
    global input_height

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")

    # load the model
    model = load_model(model_path)
    input_width = 244
    input_height = 244


def run(mini_batch):
    results = []

    for image in mini_batch:
        data = Image.open(image).resize(
            (input_width, input_height)
        )  # Read and resize the image
        data = np.array(data) / 255.0  # Normalize
        data_batch = tf.expand_dims(
            data, axis=0
        )  # create a batch of size (1, 244, 244, 3)

        # perform inference
        pred = model.predict(data_batch)

        # Compute probabilities, classes and labels
        pred_prob = tf.math.reduce_max(tf.math.softmax(pred, axis=-1)).numpy()
        pred_class = tf.math.argmax(pred, axis=-1).numpy()

        results.append([basename(image), pred_class[0], pred_prob])

    return pd.DataFrame(results)

Совет

Хотя образы предоставляются в мини-пакетах развертывания, этот скрипт оценки обрабатывает один образ за раз. Это распространенный шаблон, так как пытается загрузить весь пакет и отправить его в модель одновременно может привести к высокой нагрузке на пакетный исполнитель (экземпляры OOM). Однако существуют некоторые случаи, когда это обеспечивает высокую пропускную способность в задаче оценки. Это случай для экземпляров пакетных развертываний на оборудовании GPU, где мы хотим добиться высокого использования GPU. См . пример сценария оценки с высокой пропускной способностью, который использует его.

Примечание.

Если вы пытаетесь развернуть созданную модель (которая создает файлы), прочитайте, как создать скрипт оценки, как описано в развертывании моделей, создающих несколько файлов.

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

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

  1. Убедитесь, что вы создали вычислительный кластер, где можно создать развертывание. В этом примере мы будем использовать вычислительный кластер с именем gpu-cluster. Хотя это не обязательно, мы используем графические процессоры для ускорения обработки.

  2. Нам нужно указать, в какой среде мы будем запускать развертывание. В нашем случае наша модель выполняется в TensorFlow. Машинное обучение Azure уже имеет среду с установленным необходимым программным обеспечением, поэтому мы можем повторно использовать эту среду. Мы просто добавим пару зависимостей в conda.yml файл.

    Определение среды будет включено в файл развертывания.

    compute: azureml:gpu-cluster
    environment:
      name: tensorflow212-cuda11-gpu
      image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
    
  3. Теперь давайте создадим развертывание.

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

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: imagenet-classifier-batch
    name: imagenet-classifier-resnetv2
    description: A ResNetV2 model architecture for performing ImageNet classification in batch
    type: model
    model: azureml:imagenet-classifier@latest
    compute: azureml:gpu-cluster
    environment:
      name: tensorflow212-cuda11-gpu
      image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code/score-by-file
      scoring_script: batch_driver.py
    resources:
      instance_count: 2
    settings:
      max_concurrency_per_instance: 1
      mini_batch_size: 5
      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-by-file.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  4. Хотя можно вызвать определенное развертывание внутри конечной точки, обычно требуется вызвать саму конечную точку и разрешить конечной точке решить, какое развертывание следует использовать. Такое развертывание называется развертыванием по умолчанию. Это дает возможность изменять развертывание по умолчанию и, следовательно, изменять модель, обслуживающую развертывание, без изменения контракта с пользователем, вызывающим конечную точку. Чтобы обновить развертывание по умолчанию, используйте следующую инструкцию:

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

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

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

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

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/imagenet-1000.zip
    unzip imagenet-1000.zip -d data
    
  2. Теперь создадим ресурс данных из только что скачанных данных

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

    imagenet-sample-unlabeled.yml

    $schema: https://azuremlschemas.azureedge.net/latest/data.schema.json
    name: imagenet-sample-unlabeled
    description: A sample of 1000 images from the original ImageNet dataset. Download content from https://azuremlexampledata.blob.core.windows.net/data/imagenet-1000.zip.
    type: uri_folder
    path: data
    

    Затем создайте ресурс данных:

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

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

    Примечание.

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

    Совет

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

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

    az ml job show -n $JOB_NAME --web
    
  5. После завершения развертывания можно скачать прогнозы:

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

    az ml job download --name $JOB_NAME --output-name score --download-path ./
    
  6. Выходные прогнозы будут выглядеть следующим образом. Обратите внимание, что прогнозы были объединены с метками для удобства читателя. Дополнительные сведения о том, как достичь этого, см. в связанной записной книжке.

    import pandas as pd
    score = pd.read_csv("named-outputs/score/predictions.csv", header=None,  names=['file', 'class', 'probabilities'], sep=' ')
    score['label'] = score['class'].apply(lambda pred: imagenet_labels[pred])
    score
    
    файл class вероятность label
    n02088094_Afghan_hound. JPEG 161 0.994745 Афганский гончий
    n02088238_basset 162 0.999397 Бассет
    n02088364_beagle. JPEG 165 0.366914 bluetick
    n02088466_bloodhound. JPEG 164 0.926464 Ищейка
    ... ... ... ...

Развертывания высокой пропускной способности

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

В этих случаях может потребоваться выполнить вывод по всему пакету данных. Это означает загрузку всего набора изображений в память и их отправку непосредственно в модель. В следующем примере используется TensorFlow для чтения пакета изображений и их оценки одновременно. Он также использует TensorFlow операции для предварительной обработки данных, поэтому весь конвейер будет выполняться на одном устройстве, используемом (ЦП/GPU).

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

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

  1. Создание скрипта оценки:

    code/score-by-batch/batch_driver.py

    import os
    import numpy as np
    import pandas as pd
    import tensorflow as tf
    from tensorflow.keras.models import load_model
    
    
    def init():
        global model
        global input_width
        global input_height
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
    
        # load the model
        model = load_model(model_path)
        input_width = 244
        input_height = 244
    
    
    def decode_img(file_path):
        file = tf.io.read_file(file_path)
        img = tf.io.decode_jpeg(file, channels=3)
        img = tf.image.resize(img, [input_width, input_height])
        return img / 255.0
    
    
    def run(mini_batch):
        images_ds = tf.data.Dataset.from_tensor_slices(mini_batch)
        images_ds = images_ds.map(decode_img).batch(64)
    
        # perform inference
        pred = model.predict(images_ds)
    
        # Compute probabilities, classes and labels
        pred_prob = tf.math.reduce_max(tf.math.softmax(pred, axis=-1)).numpy()
        pred_class = tf.math.argmax(pred, axis=-1).numpy()
    
        return pd.DataFrame(
            [mini_batch, pred_prob, pred_class], columns=["file", "probability", "class"]
        )
    

    Совет

    • Обратите внимание, что этот скрипт создает набор данных tensor из мини-пакета, отправленного развертыванием пакета. Этот набор данных предварительно обрабатывается для получения ожидаемых тензоров для модели с помощью map операции с функцией decode_img.
    • Набор данных снова пакетируется (16) отправляет данные в модель. Используйте этот параметр для управления объемом информации, которую можно загрузить в память и отправить в модель одновременно. При запуске на GPU необходимо тщательно настроить этот параметр, чтобы обеспечить максимальное использование GPU непосредственно перед получением исключения OOM.
    • После вычисления прогнозов тензоры преобразуются в numpy.ndarray.
  2. Теперь давайте создадим развертывание.

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

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    endpoint_name: imagenet-classifier-batch
    name: imagenet-classifier-resnetv2
    description: A ResNetV2 model architecture for performing ImageNet classification in batch
    type: model
    model: azureml:imagenet-classifier@latest
    compute: azureml:gpu-cluster
    environment:
      name: tensorflow212-cuda11-gpu
      image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
      conda_file: environment/conda.yaml
    code_configuration:
      code: code/score-by-batch
      scoring_script: batch_driver.py
    resources:
      instance_count: 2
    tags:
      device_acceleration: CUDA
      device_batching: 16
    settings:
      max_concurrency_per_instance: 1
      mini_batch_size: 5
      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-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. Это новое развертывание можно использовать с примерами данных, показанными ранее. Помните, что для вызова этого развертывания следует указать имя развертывания в методе вызова или задать его в качестве имени по умолчанию.

Рекомендации по обработке изображений моделей MLflow

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

  • Поддерживаемые файлы изображений включают: .png, .jpg, .jpeg, .bmp.tiffи .gif.
  • Модели MLflow должны ожидать получения np.ndarray в качестве входных данных, которые будут соответствовать измерениям входного изображения. Чтобы поддерживать несколько размеров изображений в каждом пакете, исполнитель пакетной службы вызовет модель MLflow один раз на каждый файл изображения.
  • Модели MLflow настоятельно рекомендуется включать сигнатуру, и если они делают это должно быть типа TensorSpec. Входные данные изменены в соответствии с фигурой тензора, если она доступна. Если подпись недоступна, выводятся тензоры типа np.uint8.
  • Для моделей, которые включают сигнатуру и, как ожидается, обрабатывают переменный размер изображений, а затем включите подпись, которая может гарантировать ее. Например, в следующем примере подписи будут разрешены пакеты из 3 каналов изображений.
import numpy as np
import mlflow
from mlflow.models.signature import ModelSignature
from mlflow.types.schema import Schema, TensorSpec

input_schema = Schema([
  TensorSpec(np.dtype(np.uint8), (-1, -1, -1, 3)),
])
signature = ModelSignature(inputs=input_schema)

(...)

mlflow.<flavor>.log_model(..., signature=signature)

Пример работы можно найти в jupyter notebook imagenet-classifier-mlflow.ipynb. Дополнительные сведения об использовании моделей MLflow в пакетных развертываниях см . в пакетных развертываниях с помощью моделей MLflow в пакетных развертываниях.

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