Scorescripts maken voor batchimplementaties

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

Met Batch-eindpunten kunt u modellen implementeren die langlopende deductie op schaal uitvoeren. Bij het implementeren van modellen moet u een scorescript (ook wel een batchstuurprogrammascript genoemd) maken en opgeven om aan te geven hoe u dit kunt gebruiken voor de invoergegevens om voorspellingen te maken. In dit artikel leert u hoe u scorescripts gebruikt in modelimplementaties voor verschillende scenario's. U krijgt ook informatie over aanbevolen procedures voor batch-eindpunten.

Tip

Voor MLflow-modellen is geen scorescript vereist. Het wordt automatisch gegenereerd voor u. Voor meer informatie over de werking van batch-eindpunten met MLflow-modellen gaat u naar de zelfstudie MLflow-modellen gebruiken in batchimplementaties .

Waarschuwing

Als u een geautomatiseerd ML-model onder een batcheindpunt wilt implementeren, moet u er rekening mee houden dat Automated ML een scorescript biedt dat alleen werkt voor online-eindpunten. Dat scorescript is niet ontworpen voor batchuitvoering. Volg deze richtlijnen voor meer informatie over het maken van een scorescript, aangepast voor wat uw model doet.

Inzicht in het scorescript

Het scorescript is een Python-bestand (.py) dat aangeeft hoe het model moet worden uitgevoerd en de invoergegevens leest die de uitvoerders voor batchimplementatie indienen. Elke modelimplementatie biedt het scorescript (samen met alle andere vereiste afhankelijkheden) tijdens het maken. Het scorescript ziet er meestal als volgt uit:

deployment.yml

code_configuration:
  code: code
  scoring_script: batch_driver.py

Het scorescript moet twee methoden bevatten:

De init methode

Gebruik de init() methode voor kostbare of algemene voorbereiding. Gebruik het bijvoorbeeld om het model in het geheugen te laden. De start van de volledige batchtaak roept deze functie één keer aan. De bestanden van uw model zijn beschikbaar in een pad dat wordt bepaald door de omgevingsvariabele AZUREML_MODEL_DIR. Afhankelijk van hoe uw model is geregistreerd, kunnen de bijbehorende bestanden zich in een map bevinden. In het volgende voorbeeld bevat het model verschillende bestanden in een map met de naam model. Ga voor meer informatie naar hoe u de map kunt bepalen die door uw model wordt gebruikt.

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)

In dit voorbeeld plaatsen we het model in een globale variabele model. Gebruik globale variabelen om de assets beschikbaar te maken die nodig zijn om deductie uit te voeren voor uw scorefunctie.

De run methode

Gebruik de run(mini_batch: List[str]) -> Union[List[Any], pandas.DataFrame] methode om de score af te handelen van elke minibatch die door de batchimplementatie wordt gegenereerd. Deze methode wordt eenmaal aangeroepen voor elke mini_batch gegenereerde invoergegevens. Batch-implementaties lezen gegevens in batches op basis van hoe de implementatieconfiguratie.

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)

De methode ontvangt een lijst met bestandspaden als een parameter (mini_batch). U kunt deze lijst gebruiken om elk bestand te herhalen en afzonderlijk te verwerken, of om de hele batch te lezen en allemaal tegelijk te verwerken. De beste optie is afhankelijk van uw rekengeheugen en de doorvoer die u moet bereiken. Voor een voorbeeld waarin wordt beschreven hoe u volledige batches met gegevens tegelijk kunt lezen, gaat u naar implementaties met hoge doorvoer.

Notitie

Hoe wordt gedistribueerd?

Batch-implementaties distribueren werk op bestandsniveau, wat betekent dat een map met 100 bestanden, met minibatches van 10 bestanden, elk 10 batches van 10 bestanden genereert. Houd er rekening mee dat de grootte van de relevante bestanden niet relevant is. Voor bestanden die te groot zijn om te verwerken in grote minibatches, raden we u aan om de bestanden te splitsen in kleinere bestanden om een hoger niveau van parallelle uitvoering te bereiken of het aantal bestanden per minibatch te verlagen. Op dit moment kan batchimplementatie geen rekening houden met scheeftrekken in de verdeling van de bestandsgrootte.

De run() methode moet een Pandas DataFrame of een matrix/lijst retourneren. Elk geretourneerd uitvoerelement geeft één geslaagde uitvoering van een invoerelement in de invoer mini_batchaan. Voor bestands- of mapgegevensassets vertegenwoordigt elk geretourneerde rij/element één verwerkt bestand. Voor een gegevensasset in tabelvorm vertegenwoordigt elk geretourneerde rij/element een rij in een verwerkt bestand.

Belangrijk

Hoe schrijf ik voorspellingen?

Alles wat de run() functie retourneert, wordt toegevoegd aan het uitvoervoorspellingsbestand dat door de batchtaak wordt gegenereerd. Het is belangrijk om het juiste gegevenstype van deze functie te retourneren. Retourneert matrices wanneer u één voorspelling moet uitvoeren. Retourneer pandas DataFrames wanneer u meerdere stukjes informatie moet retourneren. Voor tabelgegevens wilt u bijvoorbeeld uw voorspellingen toevoegen aan de oorspronkelijke record. Gebruik hiervoor een Pandas DataFrame. Hoewel een Pandas DataFrame kolomnamen kan bevatten, bevat het uitvoerbestand deze namen niet.

als u voorspellingen op een andere manier wilt schrijven, kunt u uitvoer in batchimplementaties aanpassen.

Waarschuwing

Voer in de run functie geen complexe gegevenstypen (of lijsten met complexe gegevenstypen) uit in plaats van pandas.DataFrame. Deze uitvoer wordt omgezet in tekenreeksen en ze worden moeilijk te lezen.

Het resulterende DataFrame of de resulterende matrix wordt toegevoegd aan het aangegeven uitvoerbestand. Er is geen vereiste voor de kardinaliteit van de resultaten. Eén bestand kan 1 of veel rijen/elementen genereren in de uitvoer. Alle elementen in het resultaat dataframe of de matrix worden naar het uitvoerbestand geschreven (gezien het output_action niet summary_only).

Python-pakketten voor scoren

U moet een bibliotheek aangeven waarvoor uw scorescript moet worden uitgevoerd in de omgeving waarin uw batch-implementatie wordt uitgevoerd. Voor scorescripts worden omgevingen per implementatie aangegeven. Meestal geeft u uw vereisten aan met behulp van een conda.yml afhankelijkheidsbestand. Dit kan er als volgt uitzien:

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]

Ga naar Een batchimplementatie maken voor meer informatie over het aangeven van de omgeving voor uw model.

Voorspellingen op een andere manier schrijven

Standaard schrijft de batchimplementatie de voorspellingen van het model in één bestand, zoals aangegeven in de implementatie. In sommige gevallen moet u echter de voorspellingen in meerdere bestanden schrijven. Voor gepartitioneerde invoergegevens wilt u waarschijnlijk ook gepartitioneerde uitvoer genereren. In die gevallen kunt u uitvoer in batchimplementaties aanpassen om het volgende aan te geven:

  • De bestandsindeling (CSV, parquet, json, enzovoort) die wordt gebruikt voor het schrijven van voorspellingen
  • De manier waarop gegevens worden gepartitioneerd in de uitvoer

Ga naar Uitvoer aanpassen in batchimplementaties voor meer informatie over hoe u dit kunt bereiken.

Broncodebeheer voor scorescripts

Het is raadzaam om scorescripts onder broncodebeheer te plaatsen.

Aanbevolen procedures voor het schrijven van scorescripts

Bij het schrijven van scorescripts die grote hoeveelheden gegevens verwerken, moet u rekening houden met verschillende factoren, waaronder

  • De grootte van elk bestand
  • De hoeveelheid gegevens in elk bestand
  • De hoeveelheid geheugen die nodig is om elk bestand te lezen
  • De hoeveelheid geheugen die nodig is om een volledige batch bestanden te lezen
  • De geheugenvoetafdruk van het model
  • De geheugenvoetafdruk van het model bij het uitvoeren van de invoergegevens
  • Het beschikbare geheugen in uw rekenproces

Batch-implementaties distribueren werk op bestandsniveau. Dit betekent dat een map met 100 bestanden, in minibatches van 10 bestanden, elk 10 batches van 10 bestanden genereert (ongeacht de grootte van de betrokken bestanden). Voor bestanden die te groot zijn om te verwerken in grote minibatches, raden we u aan om de bestanden op te splitsen in kleinere bestanden, om een hoger niveau van parallelle uitvoering te bereiken of dat u het aantal bestanden per minibatch verlaagt. Op dit moment kan batchimplementatie geen rekening houden met scheeftrekken in de verdeling van de bestandsgrootte.

Relatie tussen de mate van parallelle uitvoering en het scorescript

Uw implementatieconfiguratie bepaalt zowel de grootte van elke minibatch als het aantal werkrollen op elk knooppunt. Dit wordt belangrijk wanneer u besluit of u de hele minibatch moet lezen om deductie uit te voeren, om het deductiebestand per bestand uit te voeren of de deductierij per rij uit te voeren (voor tabellair). Ga naar Deductie uitvoeren op minibatch, bestand of rijniveau voor meer informatie.

Wanneer u meerdere werkrollen op hetzelfde exemplaar uitvoert, moet u rekening houden met het feit dat het geheugen wordt gedeeld door alle werkrollen. Een toename van het aantal werkrollen per knooppunt moet over het algemeen gepaard gaan met een afname van de minibatchgrootte of door een wijziging in de scorestrategie als de gegevensgrootte en reken-SKU hetzelfde blijven.

Deductie uitvoeren op minibatch, bestand of rijniveau

Batch-eindpunten roepen de run() functie één keer aan in een scorescript per minibatch. U kunt echter beslissen of u de deductie wilt uitvoeren over de hele batch, over één bestand tegelijk of over één rij voor gegevens in tabelvorm.

Minibatchniveau

Doorgaans wilt u deductie uitvoeren voor de batch allemaal tegelijk om een hoge doorvoer in uw batchscoreproces te bereiken. Dit gebeurt als u deductie uitvoert via een GPU, waar u de verzadiging van het deductieapparaat wilt bereiken. U kunt ook afhankelijk zijn van een gegevenslaadprogramma dat de batchverwerking zelf kan verwerken als gegevens niet in het geheugen passen, zoals TensorFlow of PyTorch gegevensladers. In dergelijke gevallen wilt u mogelijk deductie uitvoeren voor de hele batch.

Waarschuwing

Het uitvoeren van deductie op batchniveau vereist mogelijk een nauwe controle over de grootte van de invoergegevens, om correct rekening te houden met de geheugenvereisten en om onvoldoende geheugenuitzondering te voorkomen. Of u de hele minibatch al dan niet in het geheugen kunt laden, is afhankelijk van de grootte van de minibatch, de grootte van de exemplaren in het cluster, het aantal werkrollen op elk knooppunt en de grootte van de minibatch.

Ga naar implementaties met hoge doorvoer om te leren hoe u dit kunt bereiken. In dit voorbeeld wordt een hele batch bestanden tegelijk verwerkt.

Bestandsniveau

Een van de eenvoudigste manieren om deductie uit te voeren, is iteratie van alle bestanden in de minibatch en voer vervolgens het model erover uit. In sommige gevallen is dit bijvoorbeeld een goed idee om afbeeldingen te verwerken. Voor tabelgegevens moet u mogelijk een goede schatting maken van het aantal rijen in elk bestand. Deze schatting kan laten zien of uw model de geheugenvereisten kan verwerken om zowel de volledige gegevens in het geheugen te laden als om deductie over het model uit te voeren. Sommige modellen (met name die modellen op basis van terugkerende neurale netwerken) ontvouwen en presenteren een geheugenvoetafdruk met een mogelijk niet-lineair aantal rijen. Voor een model met hoge geheugenkosten kunt u deductie uitvoeren op rijniveau.

Tip

Overweeg het opsplitsen van bestanden die te groot zijn om in één keer te lezen in meerdere kleinere bestanden, om rekening te houden met betere parallelle uitvoering.

Ga naar Afbeeldingsverwerking met batchimplementaties om te leren hoe u dit doet. In dit voorbeeld wordt een bestand tegelijk verwerkt.

Rijniveau (tabellair)

Voor modellen die uitdagingen met hun invoergrootten opleveren, wilt u mogelijk deductie uitvoeren op rijniveau. Uw batchimplementatie biedt nog steeds uw scorescript met een minibatch met bestanden. U leest echter één bestand, één rij tegelijk. Dit lijkt inefficiënt, maar voor sommige Deep Learning-modellen is het misschien de enige manier om deductie uit te voeren zonder uw hardwarebronnen op te schalen.

Ga naar Tekstverwerking met batchimplementaties om te leren hoe u dit doet. In dit voorbeeld wordt een rij tegelijk verwerkt.

Modellen gebruiken die mappen zijn

De AZUREML_MODEL_DIR omgevingsvariabele bevat het pad naar de geselecteerde modellocatie en de init() functie gebruikt deze doorgaans om het model in het geheugen te laden. Sommige modellen bevatten echter mogelijk hun bestanden in een map en u moet er mogelijk rekening mee houden bij het laden ervan. U kunt de mapstructuur van uw model identificeren, zoals hier wordt weergegeven:

  1. Ga naar de Azure Machine Learning-portal.

  2. Ga naar de sectie Modellen.

  3. Selecteer het model dat u wilt implementeren en selecteer het tabblad Artefacten .

  4. Noteer de weergegeven map. Deze map is aangegeven toen het model werd geregistreerd.

    Schermopname van de map waarin de modelartefacten zijn geplaatst.

Gebruik dit pad om het model te laden:

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)

Volgende stappen