Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 het model moet worden gebruikt 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.
Aanbeveling
Voor MLflow-modellen is geen scorescript vereist. De dienst genereert het automatisch 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. Zie de volgende richtlijnen voor meer informatie over het maken van een scorescript dat is 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 uitvoerprogramma voor batchimplementatie verzendt. 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 u uw model hebt 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 plaatst u 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 u de implementatie configureert.
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, splitst u de bestanden in kleinere bestanden om een hoger niveau van parallelle uitvoering te bereiken of verlaagt u het aantal bestanden per minibatch. 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 getransformeerd naar 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 een of meer 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 moet u de omgevingen per implementatie aangeven. 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
Zie Uitvoer aanpassen in batchimplementaties voor meer informatie.
Broncodebeheer voor scorescripts
Plaats scorescripts onder broncodebeheer.
Aanbevolen procedures voor het schrijven van scorescripts
Houd rekening met verschillende factoren bij het schrijven van scorescripts die grote hoeveelheden gegevens verwerken, 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 verwerken van de invoergegevens
- Het beschikbare geheugen in uw rekenproces
Batch-implementaties distribueren werk op bestandsniveau. Deze distributie 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, splitst u de bestanden in kleinere bestanden om een hoger niveau van parallelle uitvoering te bereiken of verlaagt u het aantal bestanden per minibatch. 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. Deze configuratie is belangrijk wanneer u besluit of u de hele minibatch moet lezen om deductie uit te voeren, het deductiebestand per bestand uit te voeren of de deductierij per rij uit te voeren (voor tabellair). Zie Deductie uitvoeren op het niveau van minibatch, bestand of rij voor meer informatie.
Wanneer u meerdere processen op dezelfde instance uitvoert, houd er rekening mee dat alle processen geheugen delen. Als u het aantal werkers per knooppunt verhoogt, moet u over het algemeen de mini-batchgrootte verlagen of de scoringsstrategie wijzigen als de gegevensgrootte en reken-SKU hetzelfde blijven.
Inference uitvoeren op mini-batch, bestand of rij-niveau
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 voert u deductie uit over de hele batch om een hoge doorvoer in uw batchscoreproces te bereiken. Deze aanpak werkt goed als u deductie uitvoert via een GPU, waar u het deductieapparaat wilt verzadigen. U kunt ook afhankelijk zijn van een gegevenslaadprogramma dat de batchverwerking zelf kan afhandelen als gegevens niet in het geheugen passen, zoals TensorFlow of PyTorch gegevensladers. In deze gevallen voert u inferentie uit 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 door alle bestanden in de minibatch te herhalen en vervolgens het model over elk bestand uit te voeren. In sommige gevallen, zoals afbeeldingsverwerking, werkt deze aanpak goed. Voor tabelgegevens moet u het aantal rijen in elk bestand schatten. Deze schatting laat 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.
Aanbeveling
Overweeg om bestanden op te delen die te groot zijn om in één keer te lezen in meerdere kleinere bestanden, om parallelle uitvoering te verbeteren.
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. Deze benadering kan inefficiënt lijken, 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. 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 mogelijk moet u rekening houden met die structuur bij het laden ervan. U kunt de mapstructuur van uw model identificeren, zoals hier wordt weergegeven:
Ga naar de Azure Machine Learning-portal.
Ga naar de sectie Modellen .
Selecteer het model dat u wilt implementeren en selecteer het tabblad Artefacten .
Noteer de weergegeven map. Deze map wordt aangegeven wanneer het model is geregistreerd.
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)