Обработка изображений с помощью развертываний пакетной модели
ОБЛАСТЬ ПРИМЕНЕНИЯ:Расширение машинного обучения 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
Регистрация модели
Развертывания моделей могут развертывать только зарегистрированные модели, поэтому его необходимо зарегистрировать. Этот шаг можно пропустить, если модель, на который вы пытаетесь развернуть, уже зарегистрирована.
Скачивание копии модели:
Зарегистрируйте модель:
Создание скрипта оценки
Нам нужно создать скрипт оценки, который может считывать образы, предоставляемые пакетным развертыванием, и возвращать оценки модели. Используйте приведенный ниже сценарий.
- Указывает функцию
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. См . пример сценария оценки с высокой пропускной способностью, который использует его.
Примечание.
Если вы пытаетесь развернуть созданную модель (которая создает файлы), прочитайте, как создать скрипт оценки, как описано в развертывании моделей, создающих несколько файлов.
Создание развертывания
Создается один скрипт оценки, пришло время создать пакетное развертывание. Выполните следующие действия, чтобы создать его:
Убедитесь, что вы создали вычислительный кластер, где можно создать развертывание. В этом примере мы будем использовать вычислительный кластер с именем
gpu-cluster
. Хотя это не обязательно, мы используем графические процессоры для ускорения обработки.Нам нужно указать, в какой среде мы будем запускать развертывание. В нашем случае наша модель выполняется в
TensorFlow
. Машинное обучение Azure уже имеет среду с установленным необходимым программным обеспечением, поэтому мы можем повторно использовать эту среду. Мы просто добавим пару зависимостей вconda.yml
файл.Теперь давайте создадим развертывание.
Чтобы создать развертывание в созданной конечной точке, создайте
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
Хотя можно вызвать определенное развертывание внутри конечной точки, обычно требуется вызвать саму конечную точку и разрешить конечной точке решить, какое развертывание следует использовать. Такое развертывание называется развертыванием по умолчанию. Это дает возможность изменять развертывание по умолчанию и, следовательно, изменять модель, обслуживающую развертывание, без изменения контракта с пользователем, вызывающим конечную точку. Чтобы обновить развертывание по умолчанию, используйте следующую инструкцию:
- Интерфейс командной строки службы "Машинное обучение Azure"
- Пакет SDK службы "Машинное обучение Azure" для Python
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
На этом этапе наша конечная точка пакетной службы готова к использованию.
Тестирование развертывания
Для тестирования конечной точки мы будем использовать пример из 1000 образов из исходного набора данных ImageNet. Конечные точки пакетной службы могут обрабатывать только данные, расположенные в облаке и доступные из рабочей области Машинное обучение Azure. В этом примере мы отправим его в хранилище данных Машинное обучение Azure. В частности, мы создадим ресурс данных, который можно использовать для вызова конечной точки для оценки. Однако обратите внимание, что конечные точки пакетной службы принимают данные, которые можно разместить в нескольких типах расположений.
Давайте скачайте связанные примеры данных:
Теперь создадим ресурс данных из только что скачанных данных
Создание определения ресурса данных в
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
Теперь, когда данные передаются и готовы к использованию, давайте вызовем конечную точку:
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:imagenet-sample-unlabeled@latest --query name -o tsv)
Примечание.
jq
Программа не может быть установлена во всех установках. Вы можете получить инструкции по этой ссылке.Совет
Обратите внимание, что мы не указываем имя развертывания в операции вызова. Это связано с тем, что конечная точка автоматически направляет задание в развертывание по умолчанию. Так как наша конечная точка имеет только одно развертывание, то это одно из них по умолчанию. Для конкретного развертывания можно указать аргумент или параметр
deployment_name
.Пакетное задание запускается сразу после возврата команды. Вы можете отслеживать состояние задания, пока оно не завершится:
После завершения развертывания можно скачать прогнозы:
Выходные прогнозы будут выглядеть следующим образом. Обратите внимание, что прогнозы были объединены с метками для удобства читателя. Дополнительные сведения о том, как достичь этого, см. в связанной записной книжке.
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).
Предупреждение
Некоторые модели имеют нелинейную связь с размером входных данных с точки зрения потребления памяти. Пакет снова (как показано в этом примере) или уменьшите размер пакетов, созданных развертыванием пакетной службы, чтобы избежать исключений из памяти.
Создание скрипта оценки:
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
.
- Обратите внимание, что этот скрипт создает набор данных tensor из мини-пакета, отправленного развертыванием пакета. Этот набор данных предварительно обрабатывается для получения ожидаемых тензоров для модели с помощью
Теперь давайте создадим развертывание.
Чтобы создать развертывание в созданной конечной точке, создайте
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
Это новое развертывание можно использовать с примерами данных, показанными ранее. Помните, что для вызова этого развертывания следует указать имя развертывания в методе вызова или задать его в качестве имени по умолчанию.
Рекомендации по обработке изображений моделей 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 в пакетных развертываниях.