Avbildningsbearbetning med distributioner av batchmodeller
GÄLLER FÖR:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (aktuell)
Du kan använda batchmodelldistributioner för bearbetning av tabelldata, men även andra filtyper, till exempel bilder. Dessa distributioner stöds i både MLflow och anpassade modeller. I den här artikeln får du lära dig hur du distribuerar en modell som klassificerar bilder enligt ImageNet-taxonomi.
Förutsättningar
En Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.
En Azure Machine Learning-arbetsyta. Information om hur du skapar en arbetsyta finns i Hantera Azure Machine Learning-arbetsytor.
Följande behörigheter på Azure Machine Learning-arbetsytan:
- För att skapa eller hantera batchslutpunkter och distributioner: Använd en ägare, deltagare eller anpassad roll som har tilldelats behörigheterna
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
. - För att skapa Azure Resource Manager-distributioner i arbetsytans resursgrupp: Använd en ägare, deltagare eller anpassad roll som har tilldelats behörigheten
Microsoft.Resources/deployments/write
i resursgruppen där arbetsytan distribueras.
- För att skapa eller hantera batchslutpunkter och distributioner: Använd en ägare, deltagare eller anpassad roll som har tilldelats behörigheterna
Azure Machine Learning CLI eller Azure Machine Learning SDK för Python:
Kör följande kommando för att installera Azure CLI och
ml
tillägget för Azure Machine Learning:az extension add -n ml
Distributioner av pipelinekomponenter för batchslutpunkter introduceras i version 2.7 av
ml
tillägget för Azure CLI.az extension update --name ml
Använd kommandot för att hämta den senaste versionen.
Anslut till din arbetsyta
Arbetsytan är resursen på den översta nivån för Azure Machine Learning. Det är en central plats där du kan arbeta med alla artefakter som du skapar när du använder Azure Machine Learning. I det här avsnittet ansluter du till arbetsytan där du utför dina distributionsuppgifter.
I följande kommando anger du ditt prenumerations-ID, arbetsytans namn, resursgruppsnamn och plats:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Om det här exemplet
Den här artikeln använder en modell som har skapats med TensorFlow tillsammans med RestNet-arkitekturen. Mer information finns i Identitetsmappningar i djupa kvarvarande nätverk. Du kan ladda ned ett exempel på den här modellen. Modellen har följande begränsningar:
- 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. Ändra kataloger 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 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.
Bildklassificering med batchdistributioner
I det här exemplet får du lära dig hur du distribuerar en djupinlärningsmodell som kan klassificera en viss avbildning enligt taxonomi för ImageNet.
Skapa slutpunkten
Skapa den slutpunkt som är värd för modellen:
Ange namnet på slutpunkten.
ENDPOINT_NAME="imagenet-classifier-batch"
Skapa följande YAML-fil för att definiera batchslutpunkten med namnet 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. Du måste registrera modellen. Du kan hoppa över det här steget om den modell som du försöker distribuera redan är registrerad.
Ladda ned en kopia av modellen.
Registrera modellen.
Skapa ett bedömningsskript
Skapa ett bedömningsskript som kan läsa avbildningarna som tillhandahålls av batchdistributionen och returnera poängen för modellen.
- Metoden
init
läser in modellen med hjälp av modulenkeras
itensorflow
. - Metoden
run
körs för varje mini-batch som batchdistributionen tillhandahåller. - Metoden
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. - Skriptet returnerar klasserna och sannolikheterna som är associerade med förutsägelserna.
Den här koden är filen 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 samtidigt kan leda till hög minnesbelastning på batchexekutorn (OOM-undantag).
Det finns vissa fall där det möjliggör högt dataflöde i bedömningsuppgiften. Detta gäller för batchdistributioner via GPU-maskinvara där du vill uppnå hög GPU-användning. Ett bedömningsskript som utnyttjar den här metoden finns i Distributioner med högt dataflöde.
Kommentar
Om du vill distribuera en generativ modell, som genererar filer, lär du dig hur du skapar ett bedömningsskript: Anpassa utdata i batchdistributioner.
Skapa distributionen
När du har skapat bedömningsskriptet skapar du en batchdistribution för det. Följ dessa steg:
Se till att du har skapat ett beräkningskluster där du kan skapa distributionen. I det här exemplet använder du ett beräkningskluster med namnet
gpu-cluster
. Även om det inte krävs, påskyndas bearbetningen med hjälp av GPU:er.Ange vilken miljö som distributionen ska köras i. I det här exemplet körs modellen på
TensorFlow
. Azure Machine Learning har redan en miljö med nödvändig programvara installerad, så du kan återanvända den här miljön. Du måste lägga till ett par beroenden i en conda.yml fil.Skapa distributionen.
Om du vill skapa en ny distribution under den skapade slutpunkten skapar du en
YAML
konfiguration som i följande exempel. Andra egenskaper finns i YAML-schemat för den fullständiga batchslutpunkten.$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 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 kallas för standarddistribution .
Med den här metoden kan du ändra standarddistributionen och ändra den modell som betjänar distributionen utan att ändra kontraktet med användaren som anropar slutpunkten. Använd följande kod för att uppdatera standarddistributionen:
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Batchslutpunkten är redo att användas.
Testa distributionen
För att testa slutpunkten använder du 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. Ladda upp den till ett Azure Machine Learning-datalager. Skapa en datatillgång som kan användas för att anropa slutpunkten för bedömning.
Kommentar
Batchslutpunkter accepterar data som kan placeras på flera typer av platser.
Ladda ned tillhörande exempeldata.
Skapa datatillgången från data som laddats ned.
Skapa en datatillgångsdefinition i en
YAML
fil med namnet 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 datatillgången.
az ml data create -f imagenet-sample-unlabeled.yml
När data laddas upp och är redo att användas anropar du slutpunkten.
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:imagenet-sample-unlabeled@latest --query name -o tsv)
Kommentar
Om verktyget
jq
inte är installerat läser du Ladda ned jq.
Dricks
Du anger inte distributionsnamnet i anropsåtgärden. Det beror på att slutpunkten automatiskt dirigerar jobbet till standarddistributionen. Eftersom slutpunkten bara har en distribution är den standardinställningen. Du kan rikta en specifik distribution genom att ange argumentet/parametern deployment_name
.
Ett batchjobb startar så snart kommandot returnerar. Du kan övervaka status för jobbet tills det har slutförts.
När distributionen är klar laddar du ned förutsägelserna.
Förutsägelserna ser ut som följande utdata. Förutsägelserna kombineras med etiketterna för att underlätta för läsaren. Mer information om hur du uppnår den här effekten 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 blodhund ... ... ... ...
Distributioner med högt dataflöde
Som tidigare nämnts bearbetar distributionen en avbildning i taget, även när batchdistributionen tillhandahåller en batch av dem. I de flesta fall är den här metoden bäst. Det förenklar hur modellerna körs och undviker eventuella minnesproblem. Men i vissa andra fall kanske du vill mätta den underliggande maskinvaran så mycket som möjligt. Den här situationen är till exempel fallet GPU:er.
I dessa fall kanske du vill dra slutsatser om hela databatchen. Den metoden 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
även ops för att utföra förbearbetning av data. 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. För att undvika undantag utan minne kan du batcha igen (som i det här exemplet) eller minska storleken på de batchar som skapas av batchdistributionen.
Skapa bedömningsskriptkoden /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"] )
- 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) för att skicka 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 den körs på en GPU måste du noggrant justera den här parametern för att uppnå maximal användning av GPU:n precis innan du får ett OOM-undantag.
- När förutsägelserna har beräknats konverteras tensorerna till
numpy.ndarray
.
- 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
Skapa distributionen.
- Om du vill skapa en ny distribution under den skapade slutpunkten skapar du en
YAML
konfiguration som i följande exempel. Andra egenskaper finns i YAML-schemat för den fullständiga batchslutpunkten.
$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 distributionen med följande kommando:
az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
- Om du vill skapa en ny distribution under den skapade slutpunkten skapar du en
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 anger du antingen namnet på distributionen i anropsmetoden eller anger 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 är: .png, .jpg, .jpeg, .tiff, .bmp 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 på varje batch anropar batchexekutorn MLflow-modellen en gång per bildfil. - MLflow-modeller rekommenderas starkt att inkludera en signatur. Om de gör det måste det 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 inkluderar du en signatur som kan garantera den. Till exempel tillåter följande signaturexempel 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.