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


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

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

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

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

  • Подписка 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>

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

В этой статье используется модель, созданная с помощью 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.

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

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

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

Создайте конечную точку, на которую размещена модель:

  1. Укажите имя конечной точки.

    ENDPOINT_NAME="imagenet-classifier-batch"
    
  2. Создайте следующий ФАЙЛ 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] , который ожидает модель.
  • Скрипт возвращает классы и вероятности, связанные с прогнозами.

Этот код представляет собой файл кода/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. Хотя и не требуется, использование GPU ускоряет обработку.

  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
    

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

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

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

Примечание.

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

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

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/imagenet-1000.zip
    unzip imagenet-1000.zip -d data
    

    Примечание.

    Если вы не wget установили локально, установите его или используйте браузер, чтобы получить файл .zip .

  2. Создайте ресурс данных из скачанных данных.

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

      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 не установлена, см. раздел "Скачать jq".


Совет

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

  1. Пакетное задание запускается сразу после возврата команды. Состояние задания можно отслеживать до завершения.

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

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

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

    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. Создайте код скрипта оценки, оценку по пакету или 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. Создайте развертывание.

    1. Чтобы создать развертывание в созданной конечной точке, создайте 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
    
    1. Создайте развертывание с помощью следующей команды:
    az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. Это новое развертывание можно использовать с примерами данных, показанными ранее. Помните, что чтобы вызвать это развертывание, укажите имя развертывания в методе вызова или задайте его в качестве имени по умолчанию.

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

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

  • Поддерживаемые файлы изображений: .png, .jpg, .jpeg, .tiff, .bmp и .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 в пакетных развертываниях.

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