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


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

ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение машинного обучения 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. Дополнительные сведения см. в разделе "Сопоставления удостоверений" в глубоких остаточных сетях. Вы можете скачать https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip. Модель имеет следующие ограничения:

  • Он работает с изображениями размером 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 "${IMAGENET_SAMPLE_URI_BASE}/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 "${IMAGENET_SAMPLE_URI_BASE}/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
    
    файл класс вероятность этикетка
    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 в пакетных развертываниях.

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