Share via


Pontozási szkriptek létrehozása kötegelt üzembe helyezésekhez

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

A Batch-végpontok lehetővé teszik olyan modellek üzembe helyezését, amelyek hosszú ideig futó következtetést végeznek nagy léptékben. Modellek üzembe helyezésekor létre kell hoznia és meg kell adnia egy pontozószkriptet (más néven kötegelt illesztőszkriptet), amely jelzi, hogyan használhatja azokat a bemeneti adatokon az előrejelzések létrehozásához. Ebből a cikkből megtudhatja, hogyan használhat pontozószkripteket a modelltelepítésekben különböző forgatókönyvekhez. Megismerheti a kötegelt végpontok ajánlott eljárásait is.

Tipp.

Az MLflow-modellekhez nincs szükség pontozószkriptre. Automatikusan létrejön az Ön számára. A kötegelt végpontok MLflow-modellekkel való működésével kapcsolatos további információkért tekintse meg az MLflow-modellek használatát a batch deployments dedikált oktatóanyagában.

Figyelmeztetés

Ha automatizált ml-modellt szeretne üzembe helyezni egy kötegvégpont alatt, vegye figyelembe, hogy az Automatizált gépi tanulás egy pontozó szkriptet biztosít, amely csak online végpontokhoz működik. Ez a pontozási szkript nem kötegelt végrehajtásra lett tervezve. Kövesse ezeket az irányelveket, ha többet szeretne megtudni arról, hogyan hozhat létre pontozószkriptet, amely a modell működéséhez van testre szabva.

A pontozási szkript ismertetése

A pontozási szkript egy Python-fájl (.py), amely meghatározza a modell futtatásának módját, és beolvassa a kötegelt üzembehelyezési végrehajtó által beküldött bemeneti adatokat. Minden modelltelepítés a létrehozáskor biztosítja a pontozási szkriptet (az összes többi szükséges függőséggel együtt). A pontozási szkript általában így néz ki:

deployment.yml

code_configuration:
  code: code
  scoring_script: batch_driver.py

A pontozási szkriptnek két metódust kell tartalmaznia:

A init metódus

Használja a init() módszert bármilyen költséges vagy gyakori előkészítéshez. Használhatja például a modell memóriába való betöltéséhez. A teljes kötegelt feladat indítása egyszer meghívja ezt a függvényt. A modell fájljai a környezeti változó AZUREML_MODEL_DIRáltal meghatározott elérési úton érhetők el. A modell regisztrációjától függően előfordulhat, hogy a fájlok egy mappában találhatók. A következő példában a modell több fájlt tartalmaz egy nevű modelmappában. További információkért tekintse meg , hogyan határozhatja meg a modell által használt mappát.

def init():
    global model

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    # The path "model" is the name of the registered model's folder
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")

    # load the model
    model = load_model(model_path)

Ebben a példában a modellt globális változóba modelhelyezzük. Ha elérhetővé szeretné tenni a pontozási függvény következtetéséhez szükséges eszközöket, használjon globális változókat.

A run metódus

Ezzel a run(mini_batch: List[str]) -> Union[List[Any], pandas.DataFrame] módszerrel kezelheti a köteg üzembe helyezése által létrehozott mini kötegek pontozását. Ezt a metódust a rendszer minden bemeneti adathoz mini_batch egyszer meghívja. A Batch-üzemelő példányok az üzembehelyezési konfigurációnak megfelelően olvassák be az adatokat kötegekben.

import pandas as pd
from typing import List, Any, Union

def run(mini_batch: List[str]) -> Union[List[Any], pd.DataFrame]:
    results = []

    for file in mini_batch:
        (...)

    return pd.DataFrame(results)

A metódus paraméterként (mini_batch) fogadja a fájlelérési útvonalak listáját. Ezzel a listával átfuttathatja és egyenként feldolgozhatja az egyes fájlokat, vagy elolvashatja a teljes köteget, és egyszerre feldolgozhatja azokat. A legjobb megoldás a számítási memóriától és az elérni kívánt átviteli sebességtől függ. Egy példa, amely leírja, hogyan olvasható be egyszerre teljes adatkötegek, látogasson el a nagy átviteli sebességű üzembe helyezésekre.

Feljegyzés

Hogyan oszlik el a munka?

A Batch-telepítések fájlszinten terjesztik a munkát, ami azt jelenti, hogy egy 100 fájlt tartalmazó mappa, amely 10 fájlból álló mini kötegekkel 10 köteget hoz létre, egyenként 10 fájlt. Vegye figyelembe, hogy a megfelelő fájlok méretének nincs jelentősége. Ha a fájlok túl nagy méretűek ahhoz, hogy nagy mini kötegekben dolgozzanak fel, javasoljuk, hogy vagy ossza fel a fájlokat kisebb fájlokra a nagyobb párhuzamosság elérése érdekében, vagy csökkentse a fájlok számát mini-kötegenként. A kötegelt üzembe helyezés jelenleg nem tudja figyelembe venni a fájl méreteloszlását.

A run() metódusnak pandast DataFrame vagy tömböt/listát kell visszaadnia. Minden visszaadott kimeneti elem egy bemeneti elem sikeres futtatását jelzi a bemenetben mini_batch. A fájl- vagy mappaadat-objektumok esetében minden visszaadott sor/elem egyetlen feldolgozott fájlt jelöl. Táblázatos adategység esetén minden visszaadott sor/elem egy feldolgozott fájl egy sorát jelöli.

Fontos

Hogyan írhat előrejelzéseket?

run() A függvény által visszaadott összes adat hozzá lesz fűzve a kötegelt feladat által létrehozott kimeneti előrejelzési fájlhoz. Fontos, hogy a megfelelő adattípust adja vissza ebből a függvényből. Tömböket ad vissza, ha egyetlen előrejelzést kell kiküldenie. A pandas DataFrame-eket akkor adja vissza, ha több információt kell visszaadnia. Táblázatos adatok esetében például érdemes lehet az előrejelzéseket hozzáfűzni az eredeti rekordhoz. Ehhez használja a pandas DataFrame-et. Bár a pandas DataFrame oszlopneveket tartalmazhat, a kimeneti fájl nem tartalmazza ezeket a neveket.

Ha más módon szeretne előrejelzéseket írni, testre szabhatja a kimeneteket a kötegtelepítésekben.

Figyelmeztetés

A függvényben run ne adjon ki összetett adattípusokat (vagy összetett adattípusok listáját) helyett pandas.DataFrame. Ezek a kimenetek sztringekké alakulnak, és nehezen olvashatók lesznek.

Az eredményként kapott DataFrame vagy tömb hozzá van fűzve a megadott kimeneti fájlhoz. Az eredmények számosságára nincs szükség. Egy fájl 1 vagy több sort/elemet hozhat létre a kimenetben. Az eredmény Adatkeret vagy tömb minden eleme a kimeneti fájlba van írva (figyelembe véve, output_action hogy nem summary_only).

Python-csomagok pontozáshoz

Minden olyan kódtárat meg kell jelölnie, amelyet a pontozási szkriptnek abban a környezetben kell futtatnia, ahol a kötegelt üzembe helyezés fut. A pontozási szkriptek esetében a környezetek üzemelő példányonként jelennek meg. A követelményeket általában egy conda.yml függőségi fájllal jelzi, amely a következőképpen nézhet ki:

mnist/environment/conda.yaml

name: mnist-env
channels:
  - conda-forge
dependencies:
  - python=3.8.5
  - pip<22.0
  - pip:
    - torch==1.13.0
    - torchvision==0.14.0
    - pytorch-lightning
    - pandas
    - azureml-core
    - azureml-dataset-runtime[fuse]

A modell környezetének jelzésével kapcsolatos további információkért látogasson el a Batch-környezet létrehozása című szakaszra.

Előrejelzések írása más módon

Alapértelmezés szerint a köteg üzembe helyezése egyetlen fájlba írja a modell előrejelzéseit az üzembe helyezésben leírtak szerint. Bizonyos esetekben azonban az előrejelzéseket több fájlba kell írnia. Particionált bemeneti adatok esetében például valószínűleg particionált kimenetet is szeretne létrehozni. Ezekben az esetekben testre szabhatja a batch-üzemelő példányok kimeneteit , hogy jelezze:

  • Az előrejelzések írásához használt fájlformátum (CSV, parquet, json stb.)
  • Az adatok particionálásának módja a kimenetben

A batch-környezetek kimeneteinek testreszabása című témakörben talál további információt a kimenetek eléréséről.

Pontozási szkriptek forrásvezérlése

Erősen ajánlott pontozó szkripteket a forráskövetés alá helyezni.

Ajánlott eljárások pontozási szkriptek írásához

Nagy mennyiségű adatot kezelő pontozószkript írásakor több tényezőt is figyelembe kell vennie, többek között

  • Az egyes fájlok mérete
  • Az egyes fájlok adatainak mennyisége
  • Az egyes fájlok olvasásához szükséges memória mennyisége
  • A teljes fájlköteg olvasásához szükséges memória mennyisége
  • A modell memória-lábnyoma
  • A modell memóriaigénye a bemeneti adatok futtatásakor
  • A számításban rendelkezésre álló memória

A Batch-környezetek fájlszinten terjesztik a munkát. Ez azt jelenti, hogy egy 100 fájlt tartalmazó mappa 10 fájlból álló mini kötegekben 10 köteget hoz létre egyenként 10 fájlból (függetlenül az érintett fájlok méretétől). Ha a fájlok túl nagy méretűek ahhoz, hogy nagy mini kötegekben dolgozzanak fel, javasoljuk, hogy a fájlokat kisebb fájlokra ossza fel, hogy magasabb szintű párhuzamosságot érjen el, vagy csökkentse a mini kötegenkénti fájlok számát. A kötegelt üzembe helyezés jelenleg nem tudja figyelembe venni a fájl méreteloszlását.

A párhuzamosság foka és a pontozó szkript közötti kapcsolat

Az üzembehelyezési konfiguráció szabályozza az egyes mini kötegek méretét és az egyes csomópontokon lévő feldolgozók számát. Ez akkor válik fontossá, ha eldönti, hogy beolvassa-e a teljes miniköteget a következtetés végrehajtásához, a következtetésfájl fájlonkénti futtatásához, vagy a következtetési sor sorról sorra (táblázatos) futtatásához. További információért tekintse meg a Futó következtetést a mini kötegben, a fájlban vagy a sor szintjén .

Ha több feldolgozót futtat ugyanazon a példányon, figyelembe kell vennie azt a tényt, hogy a memória az összes feldolgozó között meg van osztva. A csomópontonkénti feldolgozók számának növekedését általában a mini köteg méretének csökkenésével, vagy a pontozási stratégia változásával kell kísérnie, ha az adatméret és a számítási termékváltozat változatlan marad.

Következtetés futtatása a miniköteg, a fájl vagy a sor szintjén

A Batch-végpontok mini kötegenként egyszer meghívják a run() függvényt egy pontozószkriptben. Eldöntheti azonban, hogy a következtetést a teljes kötegre, egyszerre egy fájlra vagy egy sorra szeretné-e futtatni a táblázatos adatok esetében.

Mini kötegszint

Általában egyszerre kell következtetést futtatnia a kötegen, hogy magas átviteli sebességet érjen el a köteg pontozási folyamatában. Ez akkor fordul elő, ha következtetést futtat egy GPU-val, ahol a következtetési eszköz telítettségét szeretné elérni. Olyan adatbetöltőre is támaszkodhat, amely képes kezelni magát a kötegelést, ha az adatok nem férnek el a memóriában, például TensorFlow az PyTorch adatbetöltőkben. Ezekben az esetekben érdemes lehet következtetést futtatni a teljes kötegen.

Figyelmeztetés

Ha a köteg szintjén futtatja a következtetést, az a bemeneti adatok méretének szoros ellenőrzését, a memóriakövetelmények megfelelő figyelembevételét és a memóriakivételek elkerülését igényelheti. Az, hogy a teljes miniköteg betölthető-e a memóriába, a mini köteg méretétől, a fürt példányainak méretétől, az egyes csomópontokon lévő feldolgozók számától és a mini köteg méretétől függ.

Ennek eléréséhez látogasson el a Nagy átviteli sebességű üzemelő példányokra . Ez a példa egyszerre egy teljes fájlköteget dolgoz fel.

Fájlszint

A következtetés végrehajtásának egyik legegyszerűbb módja a minikötegben lévő összes fájl iterálása, majd a modell futtatása. Bizonyos esetekben, például a képfeldolgozás, ez jó ötlet lehet. Táblázatos adatok esetén érdemes lehet jó becslést készíteni az egyes fájlok sorainak számáról. Ez a becslés megmutatja, hogy a modell képes-e kezelni a memóriakövetelményeket a teljes adatok memóriába való betöltéséhez és a következtetés végrehajtásához. Egyes modellek (különösen az ismétlődő neurális hálózatokon alapuló modellek) bontanak ki, és memóriaigényt mutatnak egy potenciálisan nemlineáris sorszámmal. A nagy memóriaköltséggel rendelkező modellek esetében érdemes lehet következtetést futtatni a sor szintjén.

Tipp.

A jobb párhuzamosítás érdekében fontolja meg a túl nagy méretű fájlok több kisebb fájlba való olvasását.

A rendszerképek kötegelt üzembe helyezéssel történő feldolgozását ismertető cikkből megtudhatja , hogyan teheti ezt meg. Ez a példa egyszerre dolgoz fel egy fájlt.

Sorszint (táblázatos)

Az olyan modellek esetében, amelyek kihívást jelentenek a bemeneti méretükkel kapcsolatban, érdemes lehet következtetést futtatni a sor szintjén. A köteg üzembe helyezése továbbra is biztosítja a pontozási szkriptet egy minimális fájlköteggel. Azonban egyszerre csak egy fájlt, egy sort fog olvasni. Ez nem hatékonynak tűnhet, de egyes mélytanulási modellek esetében ez lehet az egyetlen módja annak, hogy következtetést hajtson végre a hardvererőforrások felskálázása nélkül.

A kötegelt üzembe helyezésekkel kapcsolatos szövegfeldolgozási útmutatóból megtudhatja , hogyan teheti ezt meg. Ez a példa egyszerre dolgoz fel egy sort.

Mappákat tartalmazó modellek használata

A AZUREML_MODEL_DIR környezeti változó tartalmazza a kiválasztott modell helyének elérési útját, és a init() függvény általában arra használja, hogy betöltse a modellt a memóriába. Előfordulhat azonban, hogy egyes modellek egy mappában tartalmazzák a fájljaikat, ezért előfordulhat, hogy a betöltéskor ezt figyelembe kell vennie. A modell mappastruktúráját az itt látható módon azonosíthatja:

  1. Lépjen az Azure Machine Tanulás portálra.

  2. Nyissa meg a Modellek szakaszt.

  3. Jelölje ki az üzembe helyezni kívánt modellt, és válassza az Összetevők lapot.

  4. Jegyezze fel a megjelenített mappát. Ezt a mappát a modell regisztrálásakor jelezték.

    Képernyőkép a modellösszetevők elhelyezésére szolgáló mappáról.

Használja ezt az elérési utat a modell betöltéséhez:

def init():
    global model

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    # The path "model" is the name of the registered model's folder
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")

    model = load_model(model_path)

Következő lépések