Delen via


Afbeeldingsverwerking met batchmodelimplementaties

VAN TOEPASSING OP:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)

Batchmodelimplementaties kunnen worden gebruikt voor het verwerken van tabelgegevens, maar ook voor elk ander bestandstype, zoals installatiekopieën. Deze implementaties worden ondersteund in zowel MLflow- als aangepaste modellen. In deze zelfstudie leert u hoe u een model implementeert dat afbeeldingen classificeert op basis van de ImageNet-taxonomie.

Over dit voorbeeld

Het model waarmee we gaan werken, is gebouwd met Behulp van TensorFlow, samen met de RestNet-architectuur (Identiteitstoewijzingen in Deep Residual Networks). Hier kunt u een voorbeeld van dit model downloaden. Het model heeft de volgende beperkingen die belangrijk zijn om rekening te houden met implementatie:

  • 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 en wijzigt u vervolgens mappen in de cli/endpoints/batch/deploy-models/imagenet-classifier map als u de Azure CLI gebruikt of sdk/python/endpoints/batch/deploy-models/imagenet-classifier als u onze SDK voor Python gebruikt.

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli/endpoints/batch/deploy-models/imagenet-classifier

Volgen in Jupyter Notebooks

U kunt dit voorbeeld volgen in een Jupyter Notebook. Open in de gekloonde opslagplaats het notebook: imagenet-classifier-batch.ipynb.

Vereisten

Voordat u de stappen in dit artikel volgt, moet u ervoor zorgen dat u over de volgende vereisten beschikt:

  • Een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint. Probeer de gratis of betaalde versie van Azure Machine Learning.

  • Een Azure Machine Learning-werkruimte. Als u nog geen werkruimte hebt, gebruikt u de stappen in het artikel Azure Machine Learning-werkruimten beheren om er een te maken.

  • Zorg ervoor dat u over de volgende machtigingen in de werkruimte beschikt:

    • Batch-eindpunten en -implementaties maken of beheren: gebruik een eigenaar, inzender of aangepaste rol die dit toestaat Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.

    • ARM-implementaties maken in de resourcegroep van de werkruimte: gebruik een eigenaar, inzender of aangepaste rol die het mogelijk maakt Microsoft.Resources/deployments/write in de resourcegroep waarin de werkruimte wordt geïmplementeerd.

  • U moet de volgende software installeren om te kunnen werken met Azure Machine Learning:

    De Azure CLI en de mlextensie voor Azure Machine Learning.

    az extension add -n ml
    

    Notitie

    Implementaties van pijplijnonderdelen voor Batch-eindpunten zijn geïntroduceerd in versie 2.7 van de ml extensie voor Azure CLI. Gebruik az extension update --name ml deze om de laatste versie ervan op te halen.

Verbinding maken met uw werkruimte

De werkruimte is de resource op het hoogste niveau voor Azure Machine Learning en biedt een gecentraliseerde werkplek met alle artefacten die u maakt in Azure Machine Learning. In deze sectie maken we verbinding met de werkruimte waarin u implementatietaken uitvoert.

Geef de waarden voor uw abonnements-id, werkruimte, locatie en resourcegroep door in de volgende code:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Afbeeldingsclassificatie met batchimplementaties

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

Eerst gaan we het eindpunt maken dat als host fungeert voor het model:

Bepaal de naam van het eindpunt:

ENDPOINT_NAME="imagenet-classifier-batch"

Het volgende YAML-bestand definieert een batch-eindpunt:

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

Voer 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, dus moeten we deze registreren. U kunt deze stap overslaan als het model dat u probeert te implementeren al is geregistreerd.

  1. Een kopie van het model downloaden:

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip
    unzip model.zip -d .
    
  2. Registreer het model:

    MODEL_NAME='imagenet-classifier'
    az ml model create --name $MODEL_NAME --path "model"
    

Een scorescript maken

We moeten een scorescript maken waarmee de installatiekopieën van de batchimplementatie kunnen worden gelezen en de scores van het model kunnen worden geretourneerd. Het volgende script:

  • Geeft een init functie aan die het model laadt met behulp van keras module in tensorflow.
  • Geeft een run functie aan die wordt uitgevoerd voor elke minibatch die de batch-implementatie biedt.
  • De run functie heeft één afbeelding van het bestand tegelijk gelezen
  • De run methode wijzigt de grootte van de afbeeldingen in de verwachte grootten voor het model.
  • De run methode schaalt de installatiekopieën opnieuw in het bereikdomein [0,1] . Dit is wat het model verwacht.
  • Hiermee worden de klassen en de waarschijnlijkheden geretourneerd die aan de voorspellingen zijn gekoppeld.

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)

Tip

Hoewel installatiekopieën worden geleverd in minibatches door de implementatie, verwerkt dit scorescript één installatiekopieën tegelijk. Dit is een veelvoorkomend patroon omdat het laden van de hele batch en het tegelijkertijd naar het model verzendt, kan leiden tot een hoge geheugenbelasting op de batchuitvoering (OOM-exeptions). Er zijn echter bepaalde gevallen waarin dit een hoge doorvoer in de scoretaak mogelijk maakt. Dit is het geval voor batchimplementaties via een GPU-hardware waarbij we een hoog GPU-gebruik willen bereiken. Zie Implementaties met hoge doorvoer voor een voorbeeld van een scorescript dat hiervan gebruikmaakt.

Notitie

Als u een generatief model probeert te implementeren (een model dat bestanden genereert), leest u hoe u een scorescript maakt, zoals wordt uitgelegd bij de implementatie van modellen die meerdere bestanden produceren.

De implementatie maken

Een van de scorescripts wordt gemaakt. Het is tijd om er een batchimplementatie voor te maken. Volg de volgende stappen om deze te maken:

  1. Zorg ervoor dat u een rekencluster hebt gemaakt waar we de implementatie kunnen maken. In dit voorbeeld gebruiken we een rekencluster met de naam gpu-cluster. Hoewel dit niet vereist is, gebruiken we GPU's om de verwerking te versnellen.

  2. We moeten aangeven over welke omgeving we de implementatie gaan uitvoeren. In ons geval wordt ons model uitgevoerd op TensorFlow. Azure Machine Learning heeft al een omgeving waarop de vereiste software is geïnstalleerd, zodat we deze omgeving opnieuw kunnen gebruiken. We gaan gewoon een aantal afhankelijkheden toevoegen aan een conda.yml bestand.

    De omgevingsdefinitie wordt opgenomen in het implementatiebestand.

    compute: azureml:gpu-cluster
    environment:
      name: tensorflow212-cuda11-gpu
      image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
    
  3. Nu gaan we de implementatie maken.

    Als u een nieuwe implementatie wilt maken onder het gemaakte eindpunt, maakt u een YAML configuratie zoals hieronder. U kunt het YAML-schema voor het volledige batcheindpunt controleren op extra eigenschappen.

    $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
    

    Maak vervolgens de implementatie met de volgende opdracht:

    az ml batch-deployment create --file deployment-by-file.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  4. Hoewel 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 heet de standaardimplementatie. Dit biedt u de mogelijkheid om de standaardimplementatie te wijzigen en daarom het model te wijzigen dat de implementatie bedient, zonder het contract te wijzigen met de gebruiker die het eindpunt aanroept. Gebruik de volgende instructie om de standaardimplementatie bij te werken:

    az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
    
  5. Op dit moment is ons batcheindpunt gereed om te worden gebruikt.

De implementatie testen

Voor het testen van ons eindpunt gebruiken we een voorbeeld van 1000 afbeeldingen uit de oorspronkelijke ImageNet-gegevensset. Batch-eindpunten kunnen alleen gegevens verwerken die zich in de cloud bevinden en die toegankelijk zijn vanuit de Azure Machine Learning-werkruimte. In dit voorbeeld gaan we het uploaden naar een Azure Machine Learning-gegevensarchief. We gaan met name een gegevensasset maken die kan worden gebruikt om het eindpunt aan te roepen voor scoren. U ziet echter dat batcheindpunten gegevens accepteren die op meerdere typen locaties kunnen worden geplaatst.

  1. We gaan de bijbehorende voorbeeldgegevens downloaden:

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/imagenet-1000.zip
    unzip imagenet-1000.zip -d data
    
  2. Nu gaan we de gegevensasset maken van de zojuist gedownloade gegevens

    Een gegevensassetdefinitie maken in 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
    

    Maak vervolgens de gegevensasset:

    az ml data create -f imagenet-sample-unlabeled.yml
    
  3. Nu de gegevens zijn geüpload en klaar zijn om te worden gebruikt, gaan we het eindpunt aanroepen:

    JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:imagenet-sample-unlabeled@latest --query name -o tsv)
    

    Notitie

    Het hulpprogramma jq is mogelijk niet geïnstalleerd op elke installatie. In deze koppeling vindt u instructies.

    Tip

    U ziet dat de implementatienaam in de aanroepbewerking niet wordt aangegeven. Dat komt doordat het eindpunt de taak automatisch doorstuurt naar de standaardimplementatie. Omdat ons eindpunt slechts één implementatie heeft, is dat de standaardimplementatie. U kunt een specifieke implementatie instellen door het argument/de parameter deployment_nameaan te geven.

  4. Er wordt een batchtaak gestart zodra de opdracht wordt geretourneerd. U kunt de status van de taak controleren totdat deze is voltooid:

    az ml job show -n $JOB_NAME --web
    
  5. Zodra de implementatie is voltooid, kunnen we de voorspellingen downloaden:

    Gebruik de volgende opdracht om de voorspellingen te downloaden:

    az ml job download --name $JOB_NAME --output-name score --download-path ./
    
  6. De uitvoervoorspellingen zien er als volgt uit. U ziet dat de voorspellingen zijn gecombineerd met de labels voor het gemak van de lezer. Zie het bijbehorende notitieblok voor meer informatie over hoe u dit 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])
    score
    
    bestand class Waarschijnlijkheid label
    n02088094_Afghan_hound. JPEG 161 0.994745 Afghaanse hond
    n02088238_basset 162 0.999397 Basset
    n02088364_beagle. JPEG 165 0.366914 bluetick
    n02088466_bloodhound. JPEG 164 0.926464 Bloodhound
    ... ... ... ...

Implementaties met hoge doorvoer

Zoals eerder vermeld, verwerkt de implementatie die we zojuist zojuist hebben gemaakt één installatiekopieën, zelfs wanneer de batchimplementatie een batch ervan levert. In de meeste gevallen is dit de beste aanpak, omdat het vereenvoudigt hoe de modellen worden uitgevoerd en mogelijke problemen met onvoldoende geheugen worden voorkomen. In bepaalde andere kunnen we echter zoveel mogelijk het gebruik van de onderliggende hardware verzadiging geven. Dit is bijvoorbeeld het geval gpu's.

In deze gevallen willen we mogelijk deductie uitvoeren voor de volledige batch met gegevens. Dat betekent dat u de volledige set afbeeldingen in het geheugen laadt en deze rechtstreeks naar het model verzendt. In het volgende voorbeeld wordt gebruikgemaakt TensorFlow van het lezen van batch afbeeldingen en het beoordelen ervan allemaal tegelijk. Het maakt ook gebruik TensorFlow van ops om gegevens vooraf te verwerken, zodat de volledige pijplijn plaatsvindt 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. Batch opnieuw (zoals in dit voorbeeld is gedaan) of verklein de grootte van de batches die door de batch-implementatie zijn gemaakt om onvoldoende geheugenuitzondering te voorkomen.

  1. Het scorescript maken:

    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"]
        )
    

    Tip

    • U ziet dat dit script een tensor-gegevensset maakt van de minibatch die door de batchimplementatie wordt verzonden. Deze gegevensset wordt vooraf verwerkt om de verwachte tensors voor het model te verkrijgen met behulp van de map bewerking met de functie decode_img.
    • De gegevensset wordt opnieuw gebatcheerd (16) verzendt de gegevens naar het model. Gebruik deze parameter om te bepalen hoeveel informatie u in het geheugen kunt laden en tegelijk naar het model kunt verzenden. Als u op een GPU uitvoert, moet u deze parameter zorgvuldig afstemmen om het maximale gebruik van de GPU te bereiken net voordat u een OOM-uitzondering krijgt.
    • Zodra voorspellingen zijn berekend, worden de tensors geconverteerd naar numpy.ndarray.
  2. Nu gaan we de implementatie maken.

    Als u een nieuwe implementatie wilt maken onder het gemaakte eindpunt, maakt u een YAML configuratie zoals hieronder. U kunt het YAML-schema voor het volledige batcheindpunt controleren op extra eigenschappen.

    $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 vervolgens de implementatie met de volgende opdracht:

    az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. U kunt deze nieuwe implementatie gebruiken met de voorbeeldgegevens die eerder worden weergegeven. Als u deze implementatie wilt aanroepen, moet u de naam van de implementatie in de aanroepmethode aangeven of deze als standaard instellen.

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 omvatten: .png, .jpg, .jpeg, .tiffen .gif.bmp .
  • MLflow-modellen verwachten een np.ndarray als 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 ten zeerste aangemoedigd om een handtekening op te nemen en als ze dit doen, moeten ze van het type TensorSpeczijn. Invoer wordt aangepast aan de shape van tensor, indien beschikbaar. Als er geen handtekening beschikbaar is, worden de tensors van het type np.uint8 afgeleid.
  • Voor modellen die een handtekening bevatten en naar verwachting variabele grootte van afbeeldingen moeten verwerken, moet u vervolgens een handtekening opnemen die dit kan garanderen. In het volgende voorbeeld van een handtekening worden 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. Lees MLflow-modellen gebruiken in batchimplementaties voor meer informatie over het gebruik van MLflow-modellen in batchimplementaties.

Volgende stappen