Przetwarzanie obrazów przy użyciu wdrożeń modelu wsadowego
DOTYCZY: Rozszerzenie interfejsu wiersza polecenia platformy Azure w wersji 2 (current)Zestaw PYTHON SDK azure-ai-ml v2 (bieżąca)
Wdrożenia modelu wsadowego umożliwiają przetwarzanie danych tabelarycznych, ale także innych typów plików, takich jak obrazy. Te wdrożenia są obsługiwane zarówno w modelu MLflow, jak i niestandardowym. Z tego artykułu dowiesz się, jak wdrożyć model klasyfikujący obrazy zgodnie z taksonomią ImageNet.
Wymagania wstępne
Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto. Wypróbuj bezpłatną lub płatną wersję usługi Azure Machine Learning.
Obszar roboczy usługi Azure Machine Learning. Aby utworzyć obszar roboczy, zobacz Zarządzanie obszarami roboczymi usługi Azure Machine Learning.
Upewnij się, że masz następujące uprawnienia w obszarze roboczym usługi Machine Learning:
- Tworzenie punktów końcowych i wdrożeń wsadowych lub zarządzanie nimi: użyj roli właściciela, współautora lub niestandardowej, która zezwala na
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
usługę . - Tworzenie wdrożeń usługi Azure Resource Manager w grupie zasobów obszaru roboczego: użyj roli Właściciel, Współautor lub Niestandardowy, która umożliwia
Microsoft.Resources/deployments/write
korzystanie z grupy zasobów, w której wdrożono obszar roboczy.
- Tworzenie punktów końcowych i wdrożeń wsadowych lub zarządzanie nimi: użyj roli właściciela, współautora lub niestandardowej, która zezwala na
Zainstaluj następujące oprogramowanie do pracy z usługą Machine Learning:
Uruchom następujące polecenie, aby zainstalować interfejs wiersza polecenia platformy Azure i
ml
rozszerzenie usługi Azure Machine Learning:az extension add -n ml
Wdrożenia składników potoku dla punktów końcowych usługi Batch są wprowadzane w wersji 2.7
ml
rozszerzenia dla interfejsu wiersza polecenia platformy Azure. Użyj polecenia ,az extension update --name ml
aby pobrać najnowszą wersję.
Nawiązywanie połączenia z obszarem roboczym
Obszar roboczy to zasób najwyższego poziomu dla usługi Machine Learning. Zapewnia scentralizowane miejsce do pracy ze wszystkimi artefaktami tworzonymi podczas korzystania z usługi Machine Learning. W tej sekcji nawiąż połączenie z obszarem roboczym, w którym wykonujesz zadania wdrażania.
W poniższym poleceniu wprowadź wartości identyfikatora subskrypcji, obszaru roboczego, lokalizacji i grupy zasobów:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Informacje o tym przykładzie
W tym artykule użyto modelu utworzonego przy użyciu biblioteki TensorFlow wraz z architekturą RestNet. Aby uzyskać więcej informacji, zobacz Mapowania tożsamości w głębokich sieciach reszt. Możesz pobrać przykład tego modelu. Model ma następujące ograniczenia:
- Działa z obrazami o rozmiarze 244x244 (tensorami
(224, 224, 3)
). - Wymaga ona skalowania danych wejściowych do zakresu
[0,1]
.
Informacje przedstawione w tym artykule są oparte na przykładach kodu zawartych w repozytorium azureml-examples . Aby uruchomić polecenia lokalnie bez konieczności kopiowania/wklejania kodu YAML i innych plików, sklonuj repozytorium. Zmień katalogi na cli/endpoints/batch/deploy-models/imagenet-classifier , jeśli używasz interfejsu wiersza polecenia platformy Azure lub zestawu SDK/python/endpoints/batch/deploy-models/imagenet-classifier , jeśli używasz zestawu SDK dla języka Python.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/imagenet-classifier
Postępuj zgodnie z instrukcjami w notesach Jupyter Notebook
Możesz skorzystać z tego przykładu w notesie Jupyter Notebook. W sklonowanym repozytorium otwórz notes: imagenet-classifier-batch.ipynb.
Klasyfikacja obrazów z wdrożeniami wsadowymi
W tym przykładzie dowiesz się, jak wdrożyć model uczenia głębokiego, który może klasyfikować dany obraz zgodnie z taksonomią usługi ImageNet.
Tworzenie punktu końcowego
Utwórz punkt końcowy hostujący model:
Określ nazwę punktu końcowego.
ENDPOINT_NAME="imagenet-classifier-batch"
Utwórz następujący plik YAML, aby zdefiniować punkt końcowy partii o nazwie 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
Aby utworzyć punkt końcowy, uruchom następujący kod:
az ml batch-endpoint create --file endpoint.yml --name $ENDPOINT_NAME
Rejestrowanie modelu
Wdrożenia modelu mogą wdrażać tylko zarejestrowane modele. Musisz zarejestrować model. Ten krok można pominąć, jeśli model, który próbujesz wdrożyć, jest już zarejestrowany.
Pobierz kopię modelu.
wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip unzip model.zip -d .
Zarejestrowanie modelu.
MODEL_NAME='imagenet-classifier' az ml model create --name $MODEL_NAME --path "model"
Tworzenie skryptu oceniania
Utwórz skrypt oceniania, który może odczytywać obrazy dostarczane przez wdrożenie wsadowe i zwracać wyniki modelu.
- Metoda
init
ładuje model przy użyciu modułukeras
w plikutensorflow
. - Metoda
run
jest uruchamiana dla każdej minisadowej, która zapewnia wdrożenie wsadowe. - Metoda
run
odczytuje jeden obraz pliku naraz. - Metoda
run
zmienia rozmiar obrazów na oczekiwane rozmiary modelu. - Metoda
run
ponownie skaluje obrazy do domeny zakresu[0,1]
, czyli tego, czego oczekuje model. - Skrypt zwraca klasy i prawdopodobieństwa skojarzone z przewidywaniami.
Ten kod jest plikiem 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)
Napiwek
Mimo że obrazy są dostarczane w minisadach przez wdrożenie, ten skrypt oceniania przetwarza jeden obraz naraz. Jest to typowy wzorzec, ponieważ próba załadowania całej partii i wysłanie jej do modelu jednocześnie może spowodować wysokie wykorzystanie pamięci w funkcji wykonawczej partii (wyjątki OOM).
Istnieją pewne przypadki, w których umożliwia to wysoką przepływność w zadaniu oceniania. Jest to przypadek wdrożeń wsadowych na sprzęcie procesora GPU, w którym chcesz osiągnąć wysokie wykorzystanie procesora GPU. Aby zapoznać się ze skryptem oceniania, który korzysta z tego podejścia, zobacz Wdrożenia o wysokiej przepływności.
Uwaga
Jeśli chcesz wdrożyć model generowania, który generuje pliki, dowiedz się, jak utworzyć skrypt oceniania: Dostosowywanie danych wyjściowych we wdrożeniach wsadowych.
Tworzenie wdrożenia
Po utworzeniu skryptu oceniania utwórz dla niego wdrożenie wsadowe. Postępuj zgodnie z następującą procedurą:
Upewnij się, że masz utworzony klaster obliczeniowy, w którym można utworzyć wdrożenie. W tym przykładzie użyj klastra obliczeniowego o nazwie
gpu-cluster
. Chociaż nie jest to wymagane, użycie procesorów GPU przyspiesza przetwarzanie.Wskaż środowisko do uruchomienia wdrożenia. W tym przykładzie model działa w systemie
TensorFlow
. Usługa Azure Machine Learning ma już środowisko z zainstalowanym wymaganym oprogramowaniem, dzięki czemu można ponownie użyć tego środowiska. Musisz dodać kilka zależności w pliku conda.yml .Definicja środowiska jest zawarta w pliku wdrożenia.
compute: azureml:gpu-cluster environment: name: tensorflow212-cuda11-gpu image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
Utwórz wdrożenie.
Aby utworzyć nowe wdrożenie w ramach utworzonego punktu końcowego, utwórz konfigurację podobną
YAML
do poniższego przykładu. Aby uzyskać inne właściwości, zobacz schemat YAML pełnego punktu końcowego wsadowego.$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
Utwórz wdrożenie za pomocą następującego polecenia:
az ml batch-deployment create --file deployment-by-file.yml --endpoint-name $ENDPOINT_NAME --set-default
Chociaż można wywołać określone wdrożenie wewnątrz punktu końcowego, zazwyczaj chcesz wywołać sam punkt końcowy i pozwolić punktowi końcowemu zdecydować, które wdrożenie ma być używane. Takie wdrożenie jest nazywane wdrożeniem domyślnym.
Takie podejście umożliwia zmianę domyślnego wdrożenia i zmianę modelu obsługującego wdrożenie bez zmiany umowy z użytkownikiem wywołującym punkt końcowy. Użyj następującego kodu, aby zaktualizować wdrożenie domyślne:
- Interfejs wiersza polecenia usługi Azure Machine Learning
- Zestaw SDK usługi Azure Machine Learning dla języka Python
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Punkt końcowy partii jest gotowy do użycia.
Testowanie wdrożenia
Do testowania punktu końcowego użyj próbki 1000 obrazów z oryginalnego zestawu danych ImageNet. Punkty końcowe usługi Batch mogą przetwarzać tylko dane znajdujące się w chmurze i dostępne z obszaru roboczego usługi Azure Machine Learning. Przekaż go do magazynu danych usługi Azure Machine Learning. Utwórz zasób danych, który może służyć do wywoływania punktu końcowego na potrzeby oceniania.
Uwaga
Punkty końcowe usługi Batch akceptują dane, które można umieścić w wielu typach lokalizacji.
Pobierz skojarzone przykładowe dane.
wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/imagenet-1000.zip unzip imagenet-1000.zip -d data
Uwaga
Jeśli nie zainstalowano
wget
go lokalnie, zainstaluj go lub użyj przeglądarki, aby pobrać plik .zip .Utwórz zasób danych na podstawie pobranych danych.
Utwórz definicję zasobu danych w
YAML
pliku o nazwie 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
Utwórz zasób danych.
az ml data create -f imagenet-sample-unlabeled.yml
Gdy dane zostaną przekazane i będą gotowe do użycia, wywołaj punkt końcowy.
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:imagenet-sample-unlabeled@latest --query name -o tsv)
Uwaga
Jeśli narzędzie
jq
nie jest zainstalowane, zobacz Pobieranie pliku jq.
Napiwek
Nie wskazujesz nazwy wdrożenia w operacji wywołania. Dzieje się tak, ponieważ punkt końcowy automatycznie kieruje zadanie do wdrożenia domyślnego. Ponieważ punkt końcowy ma tylko jedno wdrożenie, jest to ustawienie domyślne. Konkretne wdrożenie można określić, wskazując argument/parametr deployment_name
.
Zadanie wsadowe jest uruchamiane natychmiast po powrocie polecenia. Stan zadania można monitorować do momentu jego zakończenia.
az ml job show -n $JOB_NAME --web
Po zakończeniu wdrażania pobierz przewidywania.
Aby pobrać przewidywania, użyj następującego polecenia:
az ml job download --name $JOB_NAME --output-name score --download-path ./
Przewidywania wyglądają podobnie do następujących danych wyjściowych. Przewidywania są łączone z etykietami dla wygody czytelnika. Aby dowiedzieć się więcej o sposobie osiągnięcia tego efektu, zobacz skojarzony notes.
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
plik class Prawdopodobieństwa label n02088094_Afghan_hound. JPEG 161 0.994745 Chart afgański n02088238_basset 162 0.999397 Basset n02088364_beagle. JPEG 165 0.366914 bluetick n02088466_bloodhound. JPEG 164 0.926464 ogar ... ... ... ...
Wdrożenia o wysokiej przepływności
Jak wspomniano wcześniej, wdrożenie przetwarza jeden obraz raz, nawet gdy wdrożenie wsadowe udostępnia partię. W większości przypadków takie podejście jest najlepsze. Upraszcza uruchamianie modeli i pozwala uniknąć ewentualnych problemów z brakiem pamięci. Jednak w niektórych innych przypadkach możesz chcieć usycić jak najwięcej bazowego sprzętu. Taka sytuacja dotyczy na przykład procesorów GPU.
W takich przypadkach możesz wnioskować w całej partii danych. Takie podejście oznacza ładowanie całego zestawu obrazów do pamięci i wysyłanie ich bezpośrednio do modelu. W poniższym przykładzie użyto TensorFlow
metody odczytywania partii obrazów i oceniania ich wszystkich jednocześnie. Używa również TensorFlow
operacji do przetwarzania wstępnego danych. Cały potok odbywa się na tym samym urządzeniu, które jest używane (procesor CPU/PROCESOR GPU).
Ostrzeżenie
Niektóre modele mają nieliniową relację z rozmiarem danych wejściowych pod względem zużycia pamięci. Aby uniknąć wyjątków poza pamięcią, ponownie wsaduj (zgodnie z tym przykładem) lub zmniejsz rozmiar partii utworzonych przez wdrożenie wsadowe.
Utwórz kod skryptu oceniania/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"] )
- Ten skrypt tworzy zestaw danych tensor z mini-partii wysyłanej przez wdrożenie wsadowe. Ten zestaw danych jest wstępnie przetworzony w celu uzyskania oczekiwanych tensorów dla modelu przy użyciu
map
operacji z funkcjądecode_img
. - Zestaw danych jest ponownie wsadowy (16), aby wysłać dane do modelu. Użyj tego parametru, aby kontrolować ilość informacji, które można załadować do pamięci i wysyłać do modelu jednocześnie. Jeśli działa na procesorze GPU, należy dokładnie dostosować ten parametr, aby osiągnąć maksymalne użycie procesora GPU tuż przed uzyskaniem wyjątku OOM.
- Po obliczeniu przewidywań tensor jest konwertowany na
numpy.ndarray
wartość .
- Ten skrypt tworzy zestaw danych tensor z mini-partii wysyłanej przez wdrożenie wsadowe. Ten zestaw danych jest wstępnie przetworzony w celu uzyskania oczekiwanych tensorów dla modelu przy użyciu
Utwórz wdrożenie.
- Aby utworzyć nowe wdrożenie w ramach utworzonego punktu końcowego, utwórz konfigurację podobną
YAML
do poniższego przykładu. Aby uzyskać inne właściwości, zobacz schemat YAML pełnego punktu końcowego wsadowego.
$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
- Utwórz wdrożenie za pomocą następującego polecenia:
az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
- Aby utworzyć nowe wdrożenie w ramach utworzonego punktu końcowego, utwórz konfigurację podobną
Możesz użyć tego nowego wdrożenia z przykładowymi danymi pokazanymi wcześniej. Pamiętaj, że aby wywołać to wdrożenie, wskaż nazwę wdrożenia w metodzie wywołania lub ustaw ją jako domyślną.
Zagadnienia dotyczące przetwarzania obrazów modeli MLflow
Modele MLflow w punktach końcowych usługi Batch obsługują odczytywanie obrazów jako danych wejściowych. Ponieważ wdrożenia platformy MLflow nie wymagają skryptu oceniania, podczas korzystania z nich należy wziąć pod uwagę następujące kwestie:
- Obsługiwane pliki obrazów to: .png, .jpg, .jpeg, .tiff, .bmp i .gif.
- Modele MLflow powinny oczekiwać otrzymania
np.ndarray
jako danych wejściowych pasujących do wymiarów obrazu wejściowego. Aby obsługiwać wiele rozmiarów obrazów w każdej partii, funkcja wykonawcza wsadowa wywołuje model MLflow raz na plik obrazu. - Modele MLflow są zdecydowanie zachęcane do dołączania podpisu. Jeśli tak, musi to być typ
TensorSpec
. Dane wejściowe są zmieniane, aby dopasować kształt tensora, jeśli jest dostępny. Jeśli podpis nie jest dostępny, wnioskowane są tensory typunp.uint8
. - W przypadku modeli zawierających podpis i oczekuje się, że będą obsługiwać zmienny rozmiar obrazów, dołącz podpis, który może go zagwarantować. Na przykład poniższy przykład podpisu umożliwia partie 3 obrazów kanałowych.
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)
Przykład roboczy można znaleźć w pliku imagenet-classifier-mlflow.ipynb notesu Jupyter Notebook. Aby uzyskać więcej informacji na temat używania modeli MLflow we wdrożeniach wsadowych, zobacz Używanie modeli MLflow we wdrożeniach wsadowych.