Megosztás a következőn keresztül:


Képfeldolgozás kötegelt modell üzembe helyezésével

ÉRVÉNYES:Azure CLI ml-bővítmény v2 (aktuális)Python SDK azure-ai-ml v2 (aktuális)

A Batch-modell üzembe helyezései használhatók táblázatos adatok feldolgozására, de bármilyen más fájltípusra, például képekre is. Ezek az üzemelő példányok MLflow-ban és egyéni modellekben is támogatottak. Ebben az oktatóanyagban megtanuljuk, hogyan helyezhet üzembe olyan modellt, amely az ImageNet osztályozása szerint osztályozza a képeket.

A minta ismertetése

A modell, amellyel dolgozni fogunk, a TensorFlow használatával készült, a RestNet architektúrával együtt (identitásleképezések a mély reziduális hálózatokban). A modell mintája innen tölthető le. A modell az alábbi korlátozásokkal rendelkezik, amelyeket fontos szem előtt tartani az üzembe helyezéshez:

  • 244x244-es (tenzoros (224, 224, 3)) méretű képekkel működik.
  • A bemeneteket a tartományra [0,1]kell skálázni.

A cikkben szereplő információk az azureml-examples adattárban található kódmintákon alapulnak . Ha helyileg szeretné futtatni a parancsokat a YAML és más fájlok másolása/beillesztése nélkül, klónozza az adattárat, majd módosítsa a címtárakat arra cli/endpoints/batch/deploy-models/imagenet-classifier az esetre, ha az Azure CLI-t használja, vagy sdk/python/endpoints/batch/deploy-models/imagenet-classifier ha a Pythonhoz készült SDK-t használja.

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

Követés a Jupyter Notebooksban

Ezt a mintát követheti egy Jupyter Notebookban. A klónozott adattárban nyissa meg a jegyzetfüzetet: imagenet-classifier-batch.ipynb.

Előfeltételek

A cikkben ismertetett lépések végrehajtása előtt győződjön meg arról, hogy rendelkezik a következő előfeltételekkel:

  • Azure-előfizetés. Ha még nincs Azure-előfizetése, kezdés előtt hozzon létre egy ingyenes fiókot. Próbálja ki az Azure Machine Tanulás ingyenes vagy fizetős verzióját.

  • Egy Azure Machine Learning-munkaterület. Ha nincs ilyenje, az Azure Machine Tanulás-munkaterületek kezelése című cikk lépéseit követve hozzon létre egyet.

  • Győződjön meg arról, hogy rendelkezik a következő engedélyekkel a munkaterületen:

    • Batch-végpontok és -üzemelő példányok létrehozása vagy kezelése: Használjon tulajdonosi, közreműködői vagy egyéni szerepkört, amely lehetővé teszi Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.

    • ARM-üzemelő példányok létrehozása a munkaterület erőforráscsoportjában: Használjon tulajdonosi, közreműködői vagy egyéni szerepkört, amely lehetővé teszi Microsoft.Resources/deployments/write abban az erőforráscsoportban, amelyben a munkaterület telepítve van.

  • Az Azure Machine Tanulás használatához telepítenie kell a következő szoftvert:

    Az Azure CLI és az mlAzure Machine Tanulás bővítménye.

    az extension add -n ml
    

    Feljegyzés

    A Batch-végpontok folyamatösszetevő-üzembe helyezését az ml Azure CLI bővítményének 2.7-es verziójában vezettük be. Az utolsó verzió lekérésére használható az extension update --name ml .

Csatlakozás a munkaterülethez

A munkaterület az Azure Machine Learning legfelső szintű erőforrása, amely egy központi helyet biztosít az Azure Machine Learning használata során létrehozott összetevőkkel való munkához. Ebben a szakaszban ahhoz a munkaterülethez csatlakozunk, amelyben üzembe helyezési feladatokat fog végrehajtani.

Adja meg az előfizetés azonosítójának, munkaterületének, helyének és erőforráscsoportjának értékeit a következő kódban:

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

Képbesorolás kötegelt üzembe helyezésekkel

Ebben a példában megtanuljuk, hogyan helyezhet üzembe olyan mélytanulási modellt, amely az ImageNet osztályozása szerint osztályozhat egy adott képet.

A végpont létrehozása

Először hozzuk létre a modellt futtató végpontot:

Döntse el a végpont nevét:

ENDPOINT_NAME="imagenet-classifier-batch"

A következő YAML-fájl egy kötegvégpontot határoz meg:

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

Futtassa a következő kódot a végpont létrehozásához.

az ml batch-endpoint create --file endpoint.yml  --name $ENDPOINT_NAME

A modell regisztrálása

A modelltelepítések csak regisztrált modelleket helyezhetnek üzembe, ezért regisztrálni kell. Ezt a lépést kihagyhatja, ha az üzembe helyezni kívánt modell már regisztrálva van.

  1. A modell egy példányának letöltése:

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/model.zip
    unzip model.zip -d .
    
  2. A modell regisztrálása:

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

Pontozószkript létrehozása

Létre kell hoznunk egy pontozószkriptet, amely képes beolvasni a kötegelt üzembe helyezés által biztosított képeket, és visszaadni a modell pontszámait. A következő szkript:

  • Azt a függvényt init jelzi, amely a modul használatával keras tölti be a modellt a következőben tensorflow: .
  • Egy függvényt run jelöl, amelyet a batch üzembe helyezése által biztosított mini kötegekhez hajtanak végre.
  • A run függvény egyszerre egy képet olvas be a fájlról
  • A run metódus átméretezi a képeket a modell várt méretére.
  • A run metódus a rendszerképeket a tartomány tartományára [0,1] skálázja át, és ez az, amit a modell elvár.
  • Az előrejelzésekhez tartozó osztályokat és valószínűségeket adja vissza.

kód/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)

Tipp.

Bár a rendszerképeket az üzembe helyezés mini kötegekben biztosítja, ez a pontozó szkript egyszerre egy képet dolgoz fel. Ez egy gyakori minta, mivel a teljes köteg betöltése és a modellbe való egyidejű elküldése nagy memóriaterhelést okozhat a batch-végrehajtón (OOM-exeptions). Vannak azonban olyan esetek, amikor ez lehetővé teszi a magas átviteli sebességet a pontozási feladatban. Ez a helyzet a gpu-hardveren keresztüli kötegelt üzembe helyezések esetében, ahol magas GPU-kihasználtságot szeretnénk elérni. Tekintse meg a magas átviteli sebesség üzembe helyezését egy olyan pontozó szkript példájához, amely kihasználja azt.

Feljegyzés

Ha egy generatív modellt próbál üzembe helyezni (amely fájlokat hoz létre), olvassa el, hogyan hozhat létre pontozó szkriptet a több fájlt előállító modellek üzembe helyezésénél leírtak szerint.

Az üzembe helyezés létrehozása

Az egyik pontozó szkript létrejön, itt az ideje, hogy hozzon létre egy kötegelt üzembe helyezést. A létrehozáshoz kövesse az alábbi lépéseket:

  1. Győződjön meg arról, hogy létrehozott egy számítási fürtöt, ahol létrehozhatjuk az üzembe helyezést. Ebben a példában egy számítási fürtöt gpu-clusterfogunk használni. Bár ez nem kötelező, gpu-kat használunk a feldolgozás felgyorsításához.

  2. Meg kell jelölnünk, hogy melyik környezetben fogjuk futtatni az üzembe helyezést. Esetünkben a modell a következőn TensorFlowfut: . Az Azure Machine Tanulás már rendelkezik olyan környezettel, amelyre telepítve van a szükséges szoftver, így újra tudjuk használni ezt a környezetet. Csak néhány függőséget fogunk hozzáadni egy conda.yml fájlhoz.

    A környezetdefiníció szerepelni fog az üzembehelyezési fájlban.

    compute: azureml:gpu-cluster
    environment:
      name: tensorflow212-cuda11-gpu
      image: mcr.microsoft.com/azureml/curated/tensorflow-2.12-cuda11:latest
    
  3. Most hozza létre az üzembe helyezést.

    Ha új üzembe helyezést szeretne létrehozni a létrehozott végpont alatt, hozzon létre egy konfigurációt YAML az alábbihoz hasonlóan. További tulajdonságokat a teljes kötegelt végpont YAML-sémája is ellenőrizhet.

    $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
    

    Ezután hozza létre az üzembe helyezést a következő paranccsal:

    az ml batch-deployment create --file deployment-by-file.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  4. Bár egy adott üzembe helyezést meghívhat egy végponton belül, általában magát a végpontot szeretné meghívni, és hagyja, hogy a végpont döntse el, melyik üzembe helyezést használja. Az ilyen üzembe helyezés neve "alapértelmezett" üzemelő példány. Ez lehetővé teszi az alapértelmezett üzembe helyezés megváltoztatását – és ezáltal az üzembe helyezést kiszolgáló modell módosítását – anélkül, hogy módosítaná a végpontot megvevő felhasználóval kötött szerződést. Az alapértelmezett üzembe helyezés frissítéséhez használja az alábbi utasításokat:

    az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
    
  5. Ezen a ponton a kötegvégpont készen áll a használatra.

Az üzembe helyezés tesztelése

A végpont teszteléséhez egy 1000 képből álló mintát fogunk használni az eredeti ImageNet-adatkészletből. A Batch-végpontok csak a felhőben található és az Azure Machine Tanulás-munkaterületről elérhető adatokat képesek feldolgozni. Ebben a példában egy Azure Machine-Tanulás adattárba fogjuk feltölteni. Különösen egy olyan adategységet fogunk létrehozni, amely a végpont pontozásra való meghívására használható. Figyelje meg azonban, hogy a kötegelt végpontok olyan adatokat fogadnak el, amelyek több helyen is elhelyezhetők.

  1. Töltsük le a társított mintaadatokat:

    wget https://azuremlexampledata.blob.core.windows.net/data/imagenet/imagenet-1000.zip
    unzip imagenet-1000.zip -d data
    
  2. Most hozzuk létre az adategységet az imént letöltött adatokból

    Adategység-definíció létrehozása a következő helyen 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
    

    Ezután hozza létre az adategységet:

    az ml data create -f imagenet-sample-unlabeled.yml
    
  3. Most, hogy az adatok feltöltődtek és használatra készek, hívjuk meg a végpontot:

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

    Feljegyzés

    Előfordulhat, hogy a segédprogram jq nem minden telepítésre telepíthető. Ebben a hivatkozásban talál útmutatást.

    Tipp.

    Figyelje meg, hogy nem jelezzük az üzembe helyezés nevét a meghívási műveletben. Ennek az az oka, hogy a végpont automatikusan átirányítja a feladatot az alapértelmezett üzembe helyezéshez. Mivel a végpontnak csak egy üzemelő példánya van, akkor ez az alapértelmezett. Az argumentum/paraméter deployment_namemegadásával megcélzhat egy adott üzemelő példányt.

  4. A parancs visszatérése után azonnal elindul egy kötegelt feladat. A feladat állapotát a befejezésig figyelheti:

    az ml job show -n $JOB_NAME --web
    
  5. Az üzembe helyezés befejezése után letöltheti az előrejelzéseket:

    Az előrejelzések letöltéséhez használja a következő parancsot:

    az ml job download --name $JOB_NAME --output-name score --download-path ./
    
  6. A kimeneti előrejelzések az alábbiakhoz hasonlóan fognak kinézni. Figyelje meg, hogy az előrejelzések össze lettek adva a címkékkel az olvasó kényelme érdekében. Ha többet szeretne tudni ennek eléréséről, tekintse meg a társított jegyzetfüzetet.

    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
    
    fájl osztály Valószínűségek label
    n02088094_Afghan_hound. JPEG 161 0.994745 Afgán kutya
    n02088238_basset 162 0.999397 Basset
    n02088364_beagle. JPEG 165 0.366914 bluetick
    n02088466_bloodhound. JPEG 164 0.926464 Bloodhound
    ... ... ... ...

Magas átviteli sebesség üzembe helyezése

Ahogy korábban említettük, az imént létrehozott üzembe helyezés egyszerre egy rendszerképet dolgoz fel, még akkor is, ha a kötegelt üzembe helyezés egy köteget biztosít belőlük. A legtöbb esetben ez a legjobb módszer, mivel leegyszerűsíti a modellek végrehajtását, és elkerüli az esetleges memóriakihasználtság-problémákat. Bizonyos esetekben azonban érdemes lehet a lehető legnagyobb mértékben telíteni a mögöttes hardver kihasználtságát. Ilyenek például a GPU-k.

Ezekben az esetekben érdemes lehet következtetést végezni a teljes adatkötegen. Ez azt jelenti, hogy a rendszerképek teljes készletét betölti a memóriába, és közvetlenül a modellbe küldi őket. Az alábbi példa a képek kötegének olvasására és egyszerre történő pontozására használható TensorFlow . Emellett ops használatával TensorFlow végez bármilyen adatelőfeldolgozást, így a teljes folyamat ugyanazon az eszközön fog történni (CPU/GPU).

Figyelmeztetés

Egyes modellek nem lineáris kapcsolatban vannak a bemenetek méretével a memóriahasználat szempontjából. A kötegelt telepítés által létrehozott kötegek méretének csökkentése a memóriakivételek elkerülése érdekében (a példában leírtaknak megfelelően) ismét batch.

  1. A pontozó szkript létrehozása:

    kód/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"]
        )
    

    Tipp.

    • Figyelje meg, hogy ez a szkript egy tensor-adathalmazt hoz létre a köteg üzembe helyezése által küldött mini kötegből. Ez az adatkészlet előre feldolgozva lesz a modell várható tenzorainak lekéréséhez a map függvénnyel decode_imgvégzett művelettel.
    • Az adathalmaz újra kötegelt lesz (16) elküldi az adatokat a modellnek. Ezzel a paraméterrel szabályozhatja, hogy mennyi információt tölthet be a memóriába, és hogyan küldheti el egyszerre a modellnek. HA GPU-n fut, ezt a paramétert gondosan kell finomhangolnia, hogy elérje a GPU maximális kihasználtságát, mielőtt OOM-kivételt kap.
    • Az előrejelzések kiszámítása után a tenzorok átalakítva numpy.ndarraylesznek .
  2. Most hozza létre az üzembe helyezést.

    Ha új üzembe helyezést szeretne létrehozni a létrehozott végpont alatt, hozzon létre egy konfigurációt YAML az alábbihoz hasonlóan. További tulajdonságokat a teljes kötegelt végpont YAML-sémája is ellenőrizhet.

    $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
    

    Ezután hozza létre az üzembe helyezést a következő paranccsal:

    az ml batch-deployment create --file deployment-by-batch.yml --endpoint-name $ENDPOINT_NAME --set-default
    
  3. Ezt az új üzembe helyezést a korábban bemutatott mintaadatokkal használhatja. Ne feledje, hogy az üzembe helyezés meghívásához vagy az üzembe helyezés nevét kell megadnia a meghívási metódusban, vagy állítsa be alapértelmezettként.

A rendszerképeket feldolgozó MLflow-modellek szempontjai

A Batch-végpontok MLflow-modelljei támogatják a képek bemeneti adatokként való olvasását. Mivel az MLflow-üzemelő példányok nem igényelnek pontozási szkriptet, a használatuk során az alábbi szempontokat kell figyelembe venni:

  • A támogatott képfájlok a következők: .png, .jpg, .jpeg, .bmp.tiffés .gif.
  • Az MLflow-modelleknek olyan bemenetet kell kapniuk np.ndarray , amely megfelel a bemeneti kép dimenzióinak. Annak érdekében, hogy az egyes kötegeken több képméret is támogatott legyen, a köteg-végrehajtó rendszerképfájlonként egyszer meghívja az MLflow-modellt.
  • Az MLflow modelleket erősen javasoljuk, hogy tartalmazzon aláírást, és ha mégis, akkor a típusnak TensorSpeckell lennie. A bemenetek át lesznek alakítva, hogy megfeleljenek a tenzor alakjának, ha vannak. Ha nem áll rendelkezésre aláírás, a rendszer több típust np.uint8 is kikövetkeztet.
  • Az aláírást tartalmazó és változó méretű képeket kezelő modellek esetében adjon meg egy olyan aláírást, amely garantálja azt. Az alábbi aláírási példa például 3 csatornázott rendszerkép kötegeit teszi lehetővé.
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)

A Jupyter notebook imagenet-classifier-mlflow.ipynb fájljában talál egy működő példát. Az MLflow-modellek kötegelt üzembe helyezések során való használatáról további információt az MLflow-modellek használata kötegtelepítésekben című témakörben talál.

Következő lépések