Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
VAN TOEPASSING OP:
Azure CLI ml extension v2 (current)
Python SDK azure-ai-ml v2 (current)
U kunt batchmodelimplementaties gebruiken voor het verwerken van tabelgegevens, maar ook voor andere bestandstypen, zoals afbeeldingen. Deze implementaties worden ondersteund in zowel MLflow- als aangepaste modellen. In dit artikel leert u hoe u een model implementeert dat afbeeldingen classificeert op basis van de ImageNet-taxonomie.
Vereisten
Een Azure-abonnement. Als u geen Azure-abonnement hebt, maakt u een gratis account.
Een Azure Machine Learning-werkruimte. Zie Azure Machine Learning-werkruimten beheren om een werkruimte te maken.
De volgende machtigingen in de Azure Machine Learning-werkruimte:
- Voor het maken of beheren van batch-eindpunten en -implementaties: gebruik een eigenaar, inzender of aangepaste rol met de
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*machtigingen. - Voor het maken van Azure Resource Manager-implementaties in de werkruimteresourcegroep: Gebruik een eigenaar, inzender of aangepaste rol met de
Microsoft.Resources/deployments/writemachtiging in de resourcegroep waarin de werkruimte wordt geïmplementeerd.
- Voor het maken of beheren van batch-eindpunten en -implementaties: gebruik een eigenaar, inzender of aangepaste rol met de
De Azure Machine Learning CLI of de Azure Machine Learning SDK voor Python:
Voer de volgende opdracht uit om de Azure CLI en de
mlextensie voor Azure Machine Learning te installeren:az extension add -n mlImplementaties van pijplijnonderdelen voor batcheindpunten vereisen versie 2.7 of hoger van de
mlextensie voor de Azure CLI (huidige versie: 2.37.0). Gebruik deaz extension update --name mlopdracht om de nieuwste versie op te halen.
Verbinding maken met uw werkruimte
De werkruimte is de resource op het hoogste niveau voor Azure Machine Learning. Het biedt een gecentraliseerde plek om te werken met alle artefacten die u maakt wanneer u Azure Machine Learning gebruikt. In deze sectie maakt u verbinding met de werkruimte waar u uw implementatietaken uitvoert.
Voer in de volgende opdracht uw abonnements-id, werkruimtenaam, resourcegroepnaam en locatie in:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Over dit voorbeeld
In dit artikel wordt een model gebruikt dat is gebouwd met behulp van TensorFlow, samen met de RestNet-architectuur. Zie Identiteitstoewijzingen in Deep Residual Networks voor meer informatie. U kunt het https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip downloaden. Het model heeft de volgende beperkingen:
- Het werkt met afbeeldingen van grootte 244x244 (tensors van
(224, 224, 3)). - Hiervoor moeten invoerwaarden worden geschaald naar het bereik
[0,1].
De informatie in dit artikel is gebaseerd op codevoorbeelden in de opslagplaats azureml-examples . Als u de opdrachten lokaal wilt uitvoeren zonder YAML en andere bestanden te hoeven kopiëren/plakken, kloont u de opslagplaats. Wijzig mappen in cli/endpoints/batch/deploy-models/imagenet-classifier als u de Azure CLI of sdk/python/endpoints/batch/deploy-models/imagenet-classifier gebruikt als u de SDK voor Python gebruikt.
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/imagenet-classifier
Volg mee met Jupyter Notebooks
U kunt dit voorbeeld volgen in een Jupyter Notebook. Open in de gekloonde opslagplaats het notebook: imagenet-classifier-batch.ipynb.
Afbeeldingsclassificatie met batch-implementaties
In dit voorbeeld leert u hoe u een Deep Learning-model implementeert dat een bepaalde afbeelding kan classificeren op basis van de taxonomie van ImageNet.
Het eindpunt maken
Maak het eindpunt dat als host fungeert voor het model:
Geef de naam van het eindpunt op.
ENDPOINT_NAME="imagenet-classifier-batch"Maak het volgende YAML-bestand om het batch-eindpunt met de naam endpoint.yml te definiëren:
$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_tokenVoer de volgende code uit om het eindpunt te maken:
az ml batch-endpoint create --file endpoint.yml --name $ENDPOINT_NAME
Het model registreren
Modelimplementaties kunnen alleen geregistreerde modellen implementeren. U moet het model registreren. U kunt deze stap overslaan als het model dat u probeert te implementeren al is geregistreerd.
Download een kopie van het model.
Registreer het model.
Een scorescript maken
Maak een scorescript dat de afbeeldingen van de batchimplementatie kan uitlezen en de scores van het model kan terugsturen.
- De
initmethode laadt het model met behulp van dekerasmodule intensorflow. - De
runmethode wordt uitgevoerd voor elke minibatch die de batchimplementatie biedt. - De
runmethode leest één afbeelding van het bestand tegelijk. - De
runmethode past de grootte van de afbeeldingen aan naar de gewenste maten voor het model. - De
runmethode schaalt de afbeeldingen opnieuw naar het bereik[0,1]domein, wat het model verwacht. - Het script retourneert de klassen en de waarschijnlijkheden die zijn gekoppeld aan de voorspellingen.
Deze code is de code/score-by-file/batch_driver.py bestand:
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)
Aanbeveling
Hoewel afbeeldingen in minibatches worden geleverd door het systeem, verwerkt dit scoringsscript één afbeelding tegelijk. Dit is een veelvoorkomend patroon omdat het laden van de hele batch en het tegelijkertijd naar het model verzendt, kan leiden tot hoge geheugenbelasting op de batchuitvoering (OOM-uitzonderingen).
Er zijn bepaalde gevallen waarin dit een hoge verwerkingssnelheid in het scoringsproces mogelijk maakt. Dit is het geval voor batchimplementaties via GPU-hardware waarbij u een hoog GPU-gebruik wilt bereiken. Zie Implementaties met hoge doorvoer voor een scorescript dat gebruikmaakt van deze methode.
Notitie
Als u een generatief model wilt implementeren, waarmee bestanden worden gegenereerd, leert u hoe u een scorescript maakt: Uitvoer in batchimplementaties aanpassen.
De implementatie maken
Nadat u het scorescript hebt gemaakt, maakt u er een batchimplementatie voor. Gebruik de volgende procedure:
Zorg ervoor dat u een rekencluster hebt gemaakt waar u de implementatie kunt maken. In dit voorbeeld gebruikt u een rekencluster met de naam
gpu-cluster. Hoewel dit niet vereist is, versnelt het gebruik van GPU's de verwerking.Geef aan over welke omgeving de implementatie moet worden uitgevoerd. In dit voorbeeld wordt het model uitgevoerd op
TensorFlow. Azure Machine Learning heeft al een omgeving waarop de vereiste software is geïnstalleerd, zodat u deze omgeving opnieuw kunt gebruiken. U moet een aantal afhankelijkheden toevoegen aan een conda.yml bestand.Maak de implementatie.
Als u een nieuwe implementatie wilt maken onder het gemaakte eindpunt, maakt u een
YAMLconfiguratie zoals in het volgende voorbeeld. Zie voor andere eigenschappen het volledige YAML-schema van het batch-eindpunt.$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: infoMaak de implementatie met de volgende opdracht:
az ml batch-deployment create --file deployment-by-file.yml --endpoint-name $ENDPOINT_NAME --set-defaultHoewel u een specifieke implementatie binnen een eindpunt kunt aanroepen, wilt u meestal het eindpunt zelf aanroepen en het eindpunt laten bepalen welke implementatie moet worden gebruikt. Deze implementatie wordt de standaardimplementatie genoemd.
Met deze methode kunt u de standaardimplementatie wijzigen en het model voor de implementatie wijzigen zonder het contract te wijzigen met de gebruiker die het eindpunt aanroept. Gebruik de volgende code om de standaardimplementatie bij te werken:
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Uw batch-eindpunt is klaar om te worden gebruikt.
De implementatie testen
Gebruik een voorbeeld van 1000 afbeeldingen uit de oorspronkelijke ImageNet-gegevensset om het eindpunt te testen. Batch-eindpunten kunnen alleen gegevens verwerken die zich in de cloud bevinden en die toegankelijk zijn vanuit de Azure Machine Learning-werkruimte. Upload het naar een Azure Machine Learning-gegevensarchief. Maak een gegevensasset die kan worden gebruikt om het eindpunt aan te roepen voor scoren.
Notitie
Batch-eindpunten accepteren gegevens die kunnen worden geplaatst in meerdere typen locaties.
Download de bijbehorende voorbeeldgegevens.
Maak de gegevensasset op basis van de gedownloade gegevens.
Maak een definitie van een gegevensasset in een
YAMLbestand met de naam 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: dataMaak het gegevensobject aan.
az ml data create -f imagenet-sample-unlabeled.yml
Wanneer de gegevens zijn geüpload en klaar zijn om te worden gebruikt, roept u het eindpunt aan.
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:imagenet-sample-unlabeled@latest --query name -o tsv)Notitie
Als het hulpprogramma
jqniet is geïnstalleerd, raadpleegt u jq downloaden.
Aanbeveling
U geeft de implementatienaam in de aanroepbewerking niet aan. Dat komt doordat het eindpunt de taak automatisch doorstuurt naar de standaardimplementatie. Omdat het eindpunt slechts één implementatie heeft, is dat de standaardinstelling. U kunt een specifieke implementatie instellen door het argument/de parameter deployment_nameaan te geven.
Een batchtaak wordt gestart zodra het commando terugkeert. U kunt de status van de taak controleren totdat deze is voltooid.
Nadat de implementatie is voltooid, downloadt u de voorspellingen.
De voorspellingen lijken op de volgende uitvoer. De voorspellingen worden gecombineerd met de labels voor het gemak van de lezer. Zie het bijbehorende notebook voor meer informatie over hoe u dit effect kunt bereiken.
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]) scorebestand klasse Waarschijnlijkheid etiket n02088094_Afghan_hound. JPEG 161 0.994745 Afghaanse windhond n02088238_basset 162 0.999397 Basset n02088364_beagle. JPEG 165 0.366914 bluetick n02088466_bloodhound. JPEG 164 0.926464 bloedhond ... ... ... ...
Implementaties met hoge doorvoer
Zoals eerder vermeld verwerkt de implementatie één afbeelding tegelijk, zelfs wanneer de batchimplementatie een batch daarvan levert. In de meeste gevallen is deze aanpak het beste. Het vereenvoudigt hoe de modellen worden uitgevoerd en voorkomt mogelijke problemen met onvoldoende geheugen. Echter, in bepaalde andere gevallen wilt u de onderliggende hardware zo veel mogelijk maximaal benutten. Dit is bijvoorbeeld het geval met GPU's.
In deze gevallen wilt u mogelijk deductie uitvoeren voor de volledige batch met gegevens. Deze benadering impliceert dat de hele set afbeeldingen in het geheugen wordt geladen en deze rechtstreeks naar het model wordt verzonden. In het volgende voorbeeld wordt gebruikgemaakt van TensorFlow om een batch afbeeldingen te lezen en ze allemaal tegelijk te beoordelen. Het maakt ook gebruik TensorFlow van ops om gegevens vooraf te verwerken. De hele pijplijn vindt plaats op hetzelfde apparaat dat wordt gebruikt (CPU/GPU).
Waarschuwing
Sommige modellen hebben een niet-lineaire relatie met de grootte van de invoer in termen van het geheugenverbruik. Om onvoldoende geheugenuitzondering te voorkomen, batcht u opnieuw (zoals in dit voorbeeld is gedaan) of verkleint u de grootte van de batches die door de batchimplementatie zijn gemaakt.
Maak het script voor het scoren 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"] )- Met dit script wordt een tensorgegevensset samengesteld uit de minibatch die door de batch-implementatie wordt verzonden. Deze gegevensset wordt vooraf verwerkt om de verwachte tensors voor het model te verkrijgen met behulp van de
mapbewerking met de functiedecode_img. - De gegevensset wordt opnieuw gebatcheerd (16) om de gegevens naar het model te verzenden. Gebruik deze parameter om te bepalen hoeveel informatie u in het geheugen kunt laden en tegelijk naar het model kunt verzenden. Als u een GPU gebruikt, moet u deze parameter zorgvuldig afstemmen om het maximale gebruik van de GPU te bereiken net voordat u een geheugenfout krijgt.
- Nadat voorspellingen zijn berekend, worden de tensors geconverteerd naar
numpy.ndarray.
- Met dit script wordt een tensorgegevensset samengesteld uit de minibatch die door de batch-implementatie wordt verzonden. Deze gegevensset wordt vooraf verwerkt om de verwachte tensors voor het model te verkrijgen met behulp van de
Maak de implementatie.
- Als u een nieuwe implementatie wilt maken onder het gemaakte eindpunt, maakt u een
YAMLconfiguratie zoals in het volgende voorbeeld. Zie voor andere eigenschappen het volledige YAML-schema van het batch-eindpunt.
$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- Maak de implementatie met de volgende opdracht:
az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default- Als u een nieuwe implementatie wilt maken onder het gemaakte eindpunt, maakt u een
U kunt deze nieuwe implementatie gebruiken met de voorbeeldgegevens die eerder worden weergegeven. Als u deze implementatie wilt aanroepen, geeft u de naam van de implementatie aan in de aanroepmethode of stelt u deze in als de standaardinstelling.
Overwegingen voor MLflow-modellen die afbeeldingen verwerken
MLflow-modellen in Batch-eindpunten ondersteunen het lezen van afbeeldingen als invoergegevens. Aangezien MLflow-implementaties geen scorescript vereisen, moet u rekening houden met de volgende overwegingen bij het gebruik ervan:
- Ondersteunde afbeeldingsbestanden zijn: .png, .jpg, .jpeg, .tiff, .bmp en .gif.
- MLflow-modellen verwachten een
np.ndarrayals invoer te ontvangen die overeenkomt met de afmetingen van de invoerafbeelding. Om meerdere afbeeldingsgrootten in elke batch te ondersteunen, roept de batchuitvoering het MLflow-model eenmaal per afbeeldingsbestand aan. - MLflow-modellen worden sterk aangemoedigd om een handtekening op te nemen. Als dat het gebeurt, moet het van het type
TensorSpeczijn. Invoer worden aangepast om overeen te komen met de vorm van de tensor, indien beschikbaar. Als er geen handtekening beschikbaar is, worden de tensors van het typenp.uint8afgeleid. - Voor modellen die een handtekening bevatten en naar verwachting variabele grootte van afbeeldingen moeten verwerken, moet u een handtekening opnemen die deze kan garanderen. In het volgende voorbeeld van een handtekening zijn bijvoorbeeld batches van drie gekanaalde afbeeldingen toegestaan.
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)
U vindt een werkend voorbeeld in de Jupyter notebook imagenet-classifier-mlflow.ipynb. Zie MLflow-modellen gebruiken in batchimplementaties voor meer informatie over het gebruik van MLflow-modellen in batchimplementaties.