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
ml
Azure 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.
A modell egy példányának letöltése:
A modell regisztrálása:
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ávalkeras
tölti be a modellt a következőbentensorflow
: . - 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:
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-cluster
fogunk használni. Bár ez nem kötelező, gpu-kat használunk a feldolgozás felgyorsításához.Meg kell jelölnünk, hogy melyik környezetben fogjuk futtatni az üzembe helyezést. Esetünkben a modell a következőn
TensorFlow
fut: . 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 egyconda.yml
fájlhoz.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
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
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.
Töltsük le a társított mintaadatokat:
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
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)
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_name
megadásával megcélzhat egy adott üzemelő példányt.A parancs visszatérése után azonnal elindul egy kötegelt feladat. A feladat állapotát a befejezésig figyelheti:
Az üzembe helyezés befejezése után letöltheti az előrejelzéseket:
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.
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énnyeldecode_img
vé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.ndarray
lesznek .
- 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
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
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
TensorSpec
kell 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ípustnp.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.