Udostępnij za pośrednictwem


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.
  • 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:

  1. Określ nazwę punktu końcowego.

    ENDPOINT_NAME="imagenet-classifier-batch"
    
  2. 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.

  1. Pobierz kopię modelu.

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip
    unzip model.zip -d .
    
  2. 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łu keras w pliku tensorflow.
  • 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ą:

  1. 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.

  2. 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
    
  3. 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
    
  4. 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:

    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.

  1. 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 .

  2. Utwórz zasób danych na podstawie pobranych danych.

    1. 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
      
    2. Utwórz zasób danych.

      az ml data create -f imagenet-sample-unlabeled.yml
      
  3. 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.

  1. 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
    
  2. 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 ./
    
  3. 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.

  1. 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.ndarraywartość .
  2. Utwórz wdrożenie.

    1. 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
    
    1. 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
    
  3. 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 typu np.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.

Następne kroki