Avbildningsbearbetning med distributioner av batchmodeller
GÄLLER FÖR:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (aktuell)
Batch-modelldistributioner kan användas för bearbetning av tabelldata, men även andra filtyper som bilder. Dessa distributioner stöds i både MLflow och anpassade modeller. I den här självstudien får du lära dig hur du distribuerar en modell som klassificerar bilder enligt ImageNet-taxonomi.
Om det här exemplet
Modellen som vi ska arbeta med skapades med TensorFlow tillsammans med RestNet-arkitekturen (Identitetsmappningar i djupa residualnätverk). Ett exempel på den här modellen kan laddas ned härifrån. Modellen har följande begränsningar som är viktiga att tänka på för distributionen:
- Den fungerar med bilder av storlek 244x244 (tensorer av
(224, 224, 3)
). - Det kräver att indata skalas till intervallet
[0,1]
.
Informationen i den här artikeln baseras på kodexempel som finns i lagringsplatsen azureml-examples . Om du vill köra kommandona lokalt utan att behöva kopiera/klistra in YAML och andra filer klonar du lagringsplatsen och ändrar sedan katalogerna till cli/endpoints/batch/deploy-models/imagenet-classifier
om du använder Azure CLI eller sdk/python/endpoints/batch/deploy-models/imagenet-classifier
om du använder vårt SDK för Python.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/imagenet-classifier
Följ med i Jupyter Notebooks
Du kan följa det här exemplet i en Jupyter Notebook. På den klonade lagringsplatsen öppnar du notebook-filen: imagenet-classifier-batch.ipynb.
Förutsättningar
Innan du följer stegen i den här artikeln kontrollerar du att du har följande förutsättningar:
En Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar. Prova den kostnadsfria eller betalda versionen av Azure Machine Learning.
En Azure Machine Learning-arbetsyta. Om du inte har någon använder du stegen i artikeln Hantera Azure Machine Learning-arbetsytor för att skapa en.
Kontrollera att du har följande behörigheter på arbetsytan:
Skapa eller hantera batchslutpunkter och distributioner: Använd en ägare, deltagare eller anpassad roll som tillåter
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
.Skapa ARM-distributioner i arbetsytans resursgrupp: Använd en roll som ägare, deltagare eller anpassad som tillåter
Microsoft.Resources/deployments/write
i den resursgrupp där arbetsytan distribueras.
Du måste installera följande programvara för att arbeta med Azure Machine Learning:
Azure CLI och
ml
tillägget för Azure Machine Learning.az extension add -n ml
Kommentar
Distributioner av pipelinekomponenter för Batch-slutpunkter introducerades i version 2.7 av
ml
tillägget för Azure CLI. Användaz extension update --name ml
för att hämta den senaste versionen av den.
Anslut till din arbetsyta
Arbetsytan är resursen på den översta nivån i Azure Machine Learning, och är en central plats där du kan arbeta med alla artefakter du skapar när du använder Azure Machine Learning. I det här avsnittet ansluter vi till arbetsytan där du ska utföra distributionsuppgifter.
Skicka in värdena för ditt prenumerations-ID, arbetsyta, plats och resursgrupp i följande kod:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Bildklassificering med batchdistributioner
I det här exemplet ska vi lära oss hur du distribuerar en djupinlärningsmodell som kan klassificera en viss avbildning enligt taxonomi för ImageNet.
Skapa slutpunkten
Först ska vi skapa den slutpunkt som ska vara värd för modellen:
Bestäm namnet på slutpunkten:
ENDPOINT_NAME="imagenet-classifier-batch"
Följande YAML-fil definierar en batchslutpunkt:
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
Kör följande kod för att skapa slutpunkten.
az ml batch-endpoint create --file endpoint.yml --name $ENDPOINT_NAME
Registrera modellen
Modelldistributioner kan bara distribuera registrerade modeller så vi behöver registrera dem. Du kan hoppa över det här steget om den modell som du försöker distribuera redan är registrerad.
Laddar ned en kopia av modellen:
Registrera modellen:
Skapa ett bedömningsskript
Vi måste skapa ett bedömningsskript som kan läsa avbildningarna som tillhandahålls av batchdistributionen och returnera poängen för modellen. Följande skript:
- Anger en
init
funktion som läser in modellen med hjälp avkeras
modulen itensorflow
. - Anger en
run
funktion som körs för varje mini-batch som batchdistributionen tillhandahåller. - Funktionen
run
läser en bild av filen i taget - Metoden
run
ändrar storlek på bilderna till de förväntade storlekarna för modellen. - Metoden
run
skalar om bilderna till intervalldomänen[0,1]
, vilket är vad modellen förväntar sig. - Den returnerar klasserna och sannolikheterna som är associerade med förutsägelserna.
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)
Dricks
Även om avbildningar tillhandahålls i minibatch av distributionen bearbetar det här bedömningsskriptet en bild i taget. Det här är ett vanligt mönster eftersom försök att läsa in hela batchen och skicka den till modellen på en gång kan leda till hög minnesbelastning på batchexekutorn (OOM-exeptions). Det finns dock vissa fall där det möjliggör högt dataflöde i bedömningsuppgiften. Detta gäller för instanser av batchdistributioner över en GPU-maskinvara där vi vill uppnå hög GPU-användning. Se Distributioner med högt dataflöde för ett exempel på ett bedömningsskript som utnyttjar det.
Kommentar
Om du försöker distribuera en generativ modell (en som genererar filer) läser du hur du skapar ett bedömningsskript enligt beskrivningen i Distribution av modeller som producerar flera filer.
Skapa distributionen
Ett bedömningsskript skapas, det är dags att skapa en batchdistribution för det. Följ följande steg för att skapa det:
Se till att du har skapat ett beräkningskluster där vi kan skapa distributionen. I det här exemplet ska vi använda ett beräkningskluster med namnet
gpu-cluster
. Även om det inte krävs använder vi GPU:er för att påskynda bearbetningen.Vi måste ange över vilken miljö vi ska köra distributionen. I vårt fall körs vår modell på
TensorFlow
. Azure Machine Learning har redan en miljö med nödvändig programvara installerad, så vi kan återanvända den här miljön igen. Vi ska bara lägga till ett par beroenden i enconda.yml
fil.Nu ska vi skapa distributionen.
Om du vill skapa en ny distribution under den skapade slutpunkten skapar du en
YAML
konfiguration som följande. Du kan kontrollera YAML-schemat för den fullständiga batchslutpunkten för extra egenskaper.$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
Skapa sedan distributionen med följande kommando:
az ml batch-deployment create --file deployment-by-file.yml --endpoint-name $ENDPOINT_NAME --set-default
Även om du kan anropa en specifik distribution i en slutpunkt, vill du vanligtvis anropa själva slutpunkten och låta slutpunkten bestämma vilken distribution som ska användas. En sådan distribution heter "standard"-distributionen. Detta ger dig möjlighet att ändra standarddistributionen – och därmed ändra modellen som betjänar distributionen – utan att ändra kontraktet med användaren som anropar slutpunkten. Använd följande instruktion för att uppdatera standarddistributionen:
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Nu är vår batchslutpunkt redo att användas.
Testa distributionen
För att testa slutpunkten använder vi ett exempel på 1 000 bilder från den ursprungliga ImageNet-datauppsättningen. Batch-slutpunkter kan bara bearbeta data som finns i molnet och som är tillgängliga från Azure Machine Learning-arbetsytan. I det här exemplet ska vi ladda upp det till ett Azure Machine Learning-datalager. I synnerhet ska vi skapa en datatillgång som kan användas för att anropa slutpunkten för bedömning. Observera dock att batchslutpunkter accepterar data som kan placeras på flera typer av platser.
Nu ska vi ladda ned associerade exempeldata:
Nu ska vi skapa datatillgången från data som precis har laddats ned
Skapa en datatillgångsdefinition i
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
Skapa sedan datatillgången:
az ml data create -f imagenet-sample-unlabeled.yml
Nu när data har laddats upp och är redo att användas ska vi anropa slutpunkten:
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:imagenet-sample-unlabeled@latest --query name -o tsv)
Kommentar
Verktyget
jq
kanske inte installeras på varje installation. Du kan få instruktioner i den här länken.Dricks
Observera att vi inte anger distributionsnamnet i anropsåtgärden. Det beror på att slutpunkten automatiskt dirigerar jobbet till standarddistributionen. Eftersom vår slutpunkt bara har en distribution är den standard. Du kan rikta en specifik distribution genom att ange argumentet/parametern
deployment_name
.Ett batchjobb startas så snart kommandot returnerar. Du kan övervaka statusen för jobbet tills det har slutförts:
När distributionen är klar kan vi ladda ned förutsägelserna:
Utdataförutsägelserna ser ut så här. Observera att förutsägelserna har kombinerats med etiketterna för att underlätta för läsaren. Mer information om hur du uppnår detta finns i den associerade notebook-filen.
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
fil klass Sannolikheter label n02088094_Afghan_hound. JPEG 161 0.994745 Afghansk hund n02088238_basset 162 0.999397 Basset n02088364_beagle. JPEG 165 0.366914 bluetick n02088466_bloodhound. JPEG 164 0.926464 Bloodhound ... ... ... ...
Distributioner med högt dataflöde
Som tidigare nämnts bearbetar distributionen vi nyss en avbildning i taget, även när batchdistributionen tillhandahåller en batch av dem. I de flesta fall är detta den bästa metoden eftersom det förenklar hur modellerna körs och undviker eventuella problem med slut på minne. Men i vissa andra kanske vi vill mätta så mycket som möjligt användningen av den underliggande maskinvaran. Det här är till exempel fallet GPU:er.
I dessa fall kanske vi vill utföra slutsatsdragning på hela databatchen. Det innebär att läsa in hela uppsättningen bilder till minnet och skicka dem direkt till modellen. I följande exempel används TensorFlow
för att läsa batchen med bilder och poängsätta dem alla samtidigt. Den använder TensorFlow
också ops för att göra alla data förbearbetning så att hela pipelinen sker på samma enhet som används (CPU/GPU).
Varning
Vissa modeller har en icke-linjär relation med storleken på indata när det gäller minnesförbrukning. Batcha igen (som i det här exemplet) eller minska storleken på batcharna som skapas av batchdistributionen för att undvika undantag som inte är minnesfria.
Skapa bedömningsskriptet:
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"] )
Dricks
- Observera att det här skriptet konstruerar en tensor-datauppsättning från mini-batchen som skickas av batchdistributionen. Den här datamängden är förbearbetad för att hämta förväntade tensorer för modellen med hjälp av
map
åtgärden med funktionendecode_img
. - Datauppsättningen batchas igen (16) skickar data till modellen. Använd den här parametern för att styra hur mycket information du kan läsa in i minnet och skicka till modellen samtidigt. Om du kör på en GPU måste du noggrant justera den här parametern för att uppnå den maximala användningen av GPU:n precis innan du får ett OOM-undantag.
- När förutsägelserna har beräknats konverteras tensorerna till
numpy.ndarray
.
- Observera att det här skriptet konstruerar en tensor-datauppsättning från mini-batchen som skickas av batchdistributionen. Den här datamängden är förbearbetad för att hämta förväntade tensorer för modellen med hjälp av
Nu ska vi skapa distributionen.
Om du vill skapa en ny distribution under den skapade slutpunkten skapar du en
YAML
konfiguration som följande. Du kan kontrollera YAML-schemat för den fullständiga batchslutpunkten för extra egenskaper.$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
Skapa sedan distributionen med följande kommando:
az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
Du kan använda den här nya distributionen med de exempeldata som visades tidigare. Kom ihåg att om du vill anropa den här distributionen bör du antingen ange namnet på distributionen i anropsmetoden eller ange den som standard.
Överväganden för MLflow-modeller som bearbetar bilder
MLflow-modeller i Batch-slutpunkter stöder läsning av bilder som indata. Eftersom MLflow-distributioner inte kräver ett bedömningsskript bör du tänka på följande när du använder dem:
- Bildfiler som stöds omfattar:
.png
,.jpg
,.jpeg
,.bmp
.tiff
och.gif
. - MLflow-modeller bör förvänta sig att få en
np.ndarray
som indata som matchar dimensionerna för indatabilden. För att stödja flera bildstorlekar för varje batch anropar batch-kören MLflow-modellen en gång per bildfil. - MLflow-modeller rekommenderas starkt att inkludera en signatur, och om de gör det måste de vara av typen
TensorSpec
. Indata omformas för att matcha tensors form om den är tillgänglig. Om ingen signatur är tillgänglig härleds tensorer av typennp.uint8
. - För modeller som innehåller en signatur och förväntas hantera varierande storlek på bilder ska du sedan inkludera en signatur som kan garantera den. I följande signaturexempel tillåts till exempel batchar med 3 kanalbaserade bilder.
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)
Du hittar ett fungerande exempel i Jupyter Notebook imagenet-classifier-mlflow.ipynb. Mer information om hur du använder MLflow-modeller i batchdistributioner finns i Använda MLflow-modeller i batchdistributioner.