MLflow-modellen implementeren in batchimplementaties
VAN TOEPASSING OP:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)
In dit artikel leert u hoe u MLflow-modellen implementeert in Azure Machine Learning voor beide batchdeductie met behulp van batcheindpunten. Bij het implementeren van MLflow-modellen op batch-eindpunten, Azure Machine Learning:
- Biedt een MLflow-basisinstallatiekopieën/gecureerde omgeving die de vereiste afhankelijkheden bevat voor het uitvoeren van een Azure Machine Learning Batch-taak.
- Hiermee maakt u een batchtaakpijplijn met een scorescript dat kan worden gebruikt om gegevens te verwerken met behulp van parallelle uitvoering.
Notitie
Zie Overwegingen bij het implementeren van batchdeductie voor meer informatie over de ondersteunde invoerbestandstypen en details over hoe het MLflow-model werkt.
Over dit voorbeeld
In dit voorbeeld ziet u hoe u een MLflow-model kunt implementeren in een batch-eindpunt om batchvoorspellingen uit te voeren. In dit voorbeeld wordt een MLflow-model gebruikt op basis van de UCI Heart Disease Data Set. De database bevat 76 kenmerken, maar we gebruiken een subset van 14 kenmerken. Het model probeert de aanwezigheid van hart- en vaatziekten bij een patiënt te voorspellen. Het is een geheel getal van 0 (geen aanwezigheid) tot 1 (aanwezigheid).
Het model is getraind met behulp van een XGBBoost
classificatie en alle vereiste voorverwerking is verpakt als een scikit-learn
pijplijn, waardoor dit model een end-to-end-pijplijn is die van onbewerkte gegevens naar voorspellingen gaat.
Het voorbeeld in dit artikel is gebaseerd op codevoorbeelden in de opslagplaats azureml-examples . Als u de opdrachten lokaal wilt uitvoeren zonder YAML en andere bestanden te hoeven kopiëren/plakken, kloont u eerst de opslagplaats en wijzigt u vervolgens mappen in de map:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
De bestanden voor dit voorbeeld bevinden zich in:
cd endpoints/batch/deploy-models/heart-classifier-mlflow
Volgen in Jupyter Notebooks
U kunt dit voorbeeld volgen in de volgende notebooks. Open in de gekloonde opslagplaats het notebook: mlflow-for-batch-tabular.ipynb.
Vereisten
Voordat u de stappen in dit artikel volgt, moet u ervoor zorgen dat u over de volgende vereisten beschikt:
Een Azure-abonnement. Als u nog geen abonnement op Azure hebt, maak dan een gratis account aan voordat u begint. Probeer de gratis of betaalde versie van Azure Machine Learning.
Een Azure Machine Learning-werkruimte. Als u nog geen werkruimte hebt, gebruikt u de stappen in het artikel Azure Machine Learning-werkruimten beheren om er een te maken.
Zorg ervoor dat u over de volgende machtigingen in de werkruimte beschikt:
Batch-eindpunten en -implementaties maken of beheren: gebruik een eigenaar, inzender of aangepaste rol die dit toestaat
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
.ARM-implementaties maken in de resourcegroep van de werkruimte: gebruik een eigenaar, inzender of aangepaste rol die het mogelijk maakt
Microsoft.Resources/deployments/write
in de resourcegroep waarin de werkruimte wordt geïmplementeerd.
U moet de volgende software installeren om te kunnen werken met Azure Machine Learning:
De Azure CLI en de
ml
extensie voor Azure Machine Learning.az extension add -n ml
Notitie
Implementaties van pijplijnonderdelen voor Batch-eindpunten zijn geïntroduceerd in versie 2.7 van de
ml
extensie voor Azure CLI. Gebruikaz extension update --name ml
deze om de laatste versie ervan op te halen.
Verbinding maken met uw werkruimte
De werkruimte is de resource op het hoogste niveau voor Azure Machine Learning en biedt een gecentraliseerde werkplek met alle artefacten die u maakt in Azure Machine Learning. In deze sectie maken we verbinding met de werkruimte waarin u implementatietaken uitvoert.
Geef de waarden voor uw abonnements-id, werkruimte, locatie en resourcegroep door in de volgende code:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Stappen
Volg deze stappen om een MLflow-model te implementeren in een batch-eindpunt voor het uitvoeren van batchdeductie over nieuwe gegevens:
Batch-eindpunt kan alleen geregistreerde modellen implementeren. In dit geval hebben we al een lokale kopie van het model in de opslagplaats, dus we hoeven het model alleen in het register in de werkruimte te publiceren. U kunt deze stap overslaan als het model dat u probeert te implementeren al is geregistreerd.
Voordat u verdergaat, moet u ervoor zorgen dat de batchimplementaties die we gaan maken, kunnen worden uitgevoerd op een bepaalde infrastructuur (compute). Batch-implementaties kunnen worden uitgevoerd op elke Azure Machine Learning-rekenkracht die al bestaat in de werkruimte. Dat betekent dat meerdere batchimplementaties dezelfde rekeninfrastructuur kunnen delen. In dit voorbeeld gaan we werken aan een Azure Machine Learning-rekencluster met de naam
cpu-cluster
. Laten we controleren of de berekening aanwezig is in de werkruimte of anders maakt.Nu is het tijd om het batch-eindpunt en de implementatie te maken. Laten we eerst beginnen met het eindpunt. Voor eindpunten is alleen een naam en een beschrijving vereist om te worden gemaakt. De naam van het eindpunt eindigt in de URI die is gekoppeld aan uw eindpunt. Daarom moeten namen van batcheindpunten uniek zijn binnen een Azure-regio. Er kan bijvoorbeeld slechts één batcheindpunt zijn met de naam
mybatchendpoint
inwestus2
.Maak het eindpunt:
Als u een nieuw eindpunt wilt maken, maakt u een
YAML
configuratie zoals hieronder:endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: heart-classifier-batch description: A heart condition classifier for batch inference auth_mode: aad_token
Maak vervolgens het eindpunt met de volgende opdracht:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Nu gaan we de implementatie maken. Voor MLflow-modellen hoeft u geen omgeving of een scorescript aan te geven bij het maken van de implementaties terwijl deze voor u worden gemaakt. U kunt deze echter opgeven als u wilt aanpassen hoe de implementatie deductie uitvoert.
Als u een nieuwe implementatie wilt maken onder het gemaakte eindpunt, maakt u een
YAML
configuratie zoals hieronder. U kunt het YAML-schema voor het volledige batcheindpunt controleren op extra eigenschappen.implementatie eenvoudig/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: heart-classifier-batch name: classifier-xgboost-mlflow description: A heart condition classifier based on XGBoost type: model model: azureml:heart-classifier-mlflow@latest compute: azureml:batch-cluster resources: instance_count: 2 settings: max_concurrency_per_instance: 2 mini_batch_size: 2 output_action: append_row output_file_name: predictions.csv retry_settings: max_retries: 3 timeout: 300 error_threshold: -1 logging_level: info
Maak vervolgens de implementatie met de volgende opdracht:
az ml batch-deployment create --file deployment-simple/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
Belangrijk
Configureer
timeout
in uw implementatie op basis van hoe lang het duurt voordat uw model deductie uitvoert op één batch. Hoe groter de batchgrootte hoe langer deze waarde moet zijn. Remeber diemini_batch_size
het aantal bestanden in een batch aangeeft, niet het aantal steekproeven. Wanneer u met tabelgegevens werkt, kan elk bestand meerdere rijen bevatten, waardoor de tijd die het duurt voordat het batcheindpunt elk bestand verwerkt, toeneemt. Gebruik hoge waarden voor deze gevallen om time-outfouten te voorkomen.Hoewel u een specifieke implementatie binnen een eindpunt kunt aanroepen, wilt u meestal het eindpunt zelf aanroepen en het eindpunt laten bepalen welke implementatie moet worden gebruikt. Deze implementatie heet de standaardimplementatie. Dit biedt u de mogelijkheid om de standaardimplementatie te wijzigen en daarom het model te wijzigen dat de implementatie bedient zonder het contract te wijzigen met de gebruiker die het eindpunt aanroept. Gebruik de volgende instructie om de standaardimplementatie bij te werken:
Op dit moment is ons batcheindpunt gereed om te worden gebruikt.
De implementatie testen
Voor het testen van ons eindpunt gebruiken we een voorbeeld van niet-gelabelde gegevens die zich in deze opslagplaats bevinden en die kunnen worden gebruikt met het model. Batch-eindpunten kunnen alleen gegevens verwerken die zich in de cloud bevinden en die toegankelijk zijn vanuit de Azure Machine Learning-werkruimte. In dit voorbeeld gaan we het uploaden naar een Azure Machine Learning-gegevensarchief. We gaan met name een gegevensasset maken die kan worden gebruikt om het eindpunt aan te roepen voor scoren. U ziet echter dat batcheindpunten gegevens accepteren die op verschillende locaties kunnen worden geplaatst.
Laten we eerst de gegevensasset maken. Deze gegevensasset bestaat uit een map met meerdere CSV-bestanden die we parallel willen verwerken met behulp van batch-eindpunten. U kunt deze stap overslaan, omdat uw gegevens al zijn geregistreerd als gegevensasset of u een ander invoertype wilt gebruiken.
a. Een gegevensassetdefinitie maken in
YAML
:heart-dataset-unlabeled.yml
$schema: https://azuremlschemas.azureedge.net/latest/data.schema.json name: heart-dataset-unlabeled description: An unlabeled dataset for heart classification. type: uri_folder path: data
b. Maak de gegevensasset:
az ml data create -f heart-dataset-unlabeled.yml
Nu de gegevens zijn geüpload en klaar zijn om te worden gebruikt, gaan we het eindpunt aanroepen:
JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:heart-dataset-unlabeled@latest --query name -o tsv)
Notitie
Het hulpprogramma
jq
is mogelijk niet geïnstalleerd op elke installatie. In deze koppeling vindt u installatie-instructies.Tip
U ziet dat de implementatienaam in de aanroepbewerking niet wordt aangegeven. Dat komt doordat het eindpunt de taak automatisch doorstuurt naar de standaardimplementatie. Omdat ons eindpunt slechts één implementatie heeft, is dat de standaardimplementatie. U kunt een specifieke implementatie instellen door het argument/de parameter
deployment_name
aan te geven.Er wordt een batchtaak gestart zodra de opdracht wordt geretourneerd. U kunt de status van de taak controleren totdat deze is voltooid:
De uitvoer analyseren
Uitvoervoorspellingen worden gegenereerd in het predictions.csv
bestand zoals aangegeven in de implementatieconfiguratie. De taak genereert een benoemde uitvoer met de naam score
waar dit bestand wordt geplaatst. Er wordt slechts één bestand per batchtaak gegenereerd.
Het bestand is als volgt gestructureerd:
Er is één rij per gegevenspunt dat naar het model is verzonden. Voor tabelgegevens betekent dit dat het bestand (
predictions.csv
) één rij bevat voor elke rij die aanwezig is in elk van de verwerkte bestanden. Voor andere gegevenstypen (bijvoorbeeld afbeeldingen, audio, tekst), is er één rij per verwerkt bestand.De volgende kolommen bevinden zich in het bestand (in volgorde):
row
(optioneel), de bijbehorende rijindex in het invoergegevensbestand. Dit geldt alleen als de invoergegevens tabellair zijn. Voorspellingen worden geretourneerd in dezelfde volgorde als in het invoerbestand, zodat u kunt vertrouwen op het rijnummer dat overeenkomt met de bijbehorende voorspelling.prediction
, de voorspelling die is gekoppeld aan de invoergegevens. Deze waarde wordt als resultaat gegeven door de functie vanpredict().
het model.file_name
, de bestandsnaam waaruit de gegevens zijn gelezen. Gebruik dit veld in tabelvorm om te weten welke voorspelling hoort bij welke invoergegevens.
U kunt de resultaten van de taak downloaden met behulp van de taaknaam:
Gebruik de volgende opdracht om de voorspellingen te downloaden:
az ml job download --name $JOB_NAME --output-name score --download-path ./
Zodra het bestand is gedownload, kunt u het openen met uw favoriete hulpprogramma. In het volgende voorbeeld worden de voorspellingen geladen met behulp van Pandas
dataframe.
import pandas as pd
score = pd.read_csv(
"named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)
De uitvoer ziet er als volgt uit:
rij | Voorspelling | bestand |
---|---|---|
0 | 0 | heart-unlabeled-0.csv |
1 | 1 | heart-unlabeled-0.csv |
2 | 0 | heart-unlabeled-0.csv |
... | ... | ... |
307 | 0 | heart-unlabeled-3.csv |
Tip
U ziet dat in dit voorbeeld de invoergegevens gegevens in tabelvorm waren en CSV
dat er vier verschillende invoerbestanden (heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv en heart-unlabeled-3.csv) waren.
Overwegingen bij het implementeren naar batchdeductie
Azure Machine Learning biedt ondersteuning voor het implementeren van MLflow-modellen naar batch-eindpunten zonder een scorescript aan te geven. Dit is een handige manier om modellen te implementeren die verwerking van grote hoeveelheden gegevens in batchverwerking vereisen. Azure Machine Learning gebruikt informatie in de MLflow-modelspecificatie om het deductieproces in te delen.
Hoe werk wordt verdeeld over werkrollen
Batch-eindpunten distribueren werk op bestandsniveau voor gestructureerde en ongestructureerde gegevens. Als gevolg hiervan worden alleen URI-bestanden en URI-mappen ondersteund voor deze functie. Elke werkrol verwerkt batches Mini batch size
bestanden tegelijk. Voor tabellaire gegevens houden batcheindpunten geen rekening met het aantal rijen in elk bestand bij het distribueren van het werk.
Waarschuwing
Geneste mapstructuren worden niet verkend tijdens deductie. Als u uw gegevens partitioneert met behulp van mappen, moet u de structuur vooraf platmaken.
Batch-implementaties roepen de predict
functie van het MLflow-model eenmaal per bestand aan. Voor CSV-bestanden met meerdere rijen kan dit een geheugenbelasting in de onderliggende berekening opleggen en kan dit de tijd die het kost voor het model verhogen om één bestand te scoren (speciaal voor dure modellen zoals grote taalmodellen). Als u verschillende uitzonderingen met onvoldoende geheugen of time-outvermeldingen in logboeken tegenkomt, kunt u overwegen om de gegevens in kleinere bestanden met minder rijen te splitsen of batchverwerking op rijniveau in het model-/scorescript te implementeren.
Ondersteuning voor bestandstypen
De volgende gegevenstypen worden ondersteund voor batchdeductie bij het implementeren van MLflow-modellen zonder een omgeving en een scorescript. Als u een ander bestandstype wilt verwerken of deductie wilt uitvoeren op een andere manier die batcheindpunten standaard doen, kunt u de implementatie altijd maken met een scorescript, zoals wordt uitgelegd in MLflow-modellen gebruiken met een scorescript.
Bestandsextensie | Type dat wordt geretourneerd als invoer van het model | Handtekeningvereiste |
---|---|---|
.csv , , .parquet .pqt |
pd.DataFrame |
ColSpec . Als dit niet is opgegeven, wordt het typen van kolommen niet afgedwongen. |
.png , , .jpg .jpeg , .tiff , , , .bmp .gif |
np.ndarray |
TensorSpec . De invoer wordt aangepast aan de vorm van tensors, indien beschikbaar. Als er geen handtekening beschikbaar is, worden de tensors van het type np.uint8 afgeleid. Lees overwegingen voor MLflow-modellen die afbeeldingen verwerken voor aanvullende richtlijnen. |
Waarschuwing
Houd er rekening mee dat een niet-ondersteund bestand dat aanwezig kan zijn in de invoergegevens, ervoor zorgt dat de taak mislukt. U ziet een foutbericht als volgt: 'ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.avro'. Bestandstype 'avro' wordt niet ondersteund.'
Handtekening afdwingen voor MLflow-modellen
De gegevenstypen van invoer worden afgedwongen door batchimplementatietaken terwijl de gegevens worden gelezen met behulp van de beschikbare handtekening van het MLflow-model. Dit betekent dat uw gegevensinvoer moet voldoen aan de typen die zijn aangegeven in de modelhandtekening. Als de gegevens niet kunnen worden geparseerd zoals verwacht, mislukt de taak met een foutbericht dat lijkt op de volgende: 'ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.csv'. Uitzondering: ongeldige letterlijke waarde voor int() met grondtal 10: 'waarde'.
Tip
Handtekeningen in MLflow-modellen zijn optioneel, maar ze worden sterk aangemoedigd omdat ze een handige manier bieden om problemen met gegevenscompatibiliteit vroeg te detecteren. Voor meer informatie over het vastleggen van modellen met handtekeningen leest u Logboekregistratiemodellen met een aangepaste handtekening, omgeving of voorbeelden.
U kunt de modelhandtekening van uw model inspecteren door het MLmodel
bestand te openen dat is gekoppeld aan uw MLflow-model. Zie Handtekeningen in MLflow voor meer informatie over hoe handtekeningen werken in MLflow.
Smaakondersteuning
Batch-implementaties ondersteunen alleen het implementeren van MLflow-modellen met een pyfunc
smaak. Als u een andere smaak wilt implementeren, raadpleegt u MLflow-modellen gebruiken met een scorescript.
Implementaties van MLflow-modellen aanpassen met een scorescript
MLflow-modellen kunnen worden geïmplementeerd op batch-eindpunten zonder een scorescript in de implementatiedefinitie aan te geven. U kunt er echter voor kiezen om dit bestand aan te geven (meestal het batchstuurprogramma genoemd) om aan te passen hoe deductie wordt uitgevoerd.
Doorgaans selecteert u deze werkstroom wanneer:
- U moet een bestandstype verwerken dat niet wordt ondersteund door MLflow-implementaties in batchimplementaties.
- U moet de manier waarop het model wordt uitgevoerd aanpassen, bijvoorbeeld een specifieke smaak gebruiken om het mee
mlflow.<flavor>.load()
te laden. - U moet de verwerking vooraf/pos uitvoeren in uw scoreroutine wanneer dit niet wordt gedaan door het model zelf.
- De uitvoer van het model kan niet mooi worden weergegeven in tabelgegevens. Het is bijvoorbeeld een tensor die een afbeelding vertegenwoordigt.
- U kunt elk bestand niet tegelijk verwerken vanwege geheugenbeperkingen en moet het in segmenten lezen.
Belangrijk
Als u ervoor kiest om een scorescript voor een implementatie van een MLflow-model aan te geven, moet u ook de omgeving opgeven waarin de implementatie wordt uitgevoerd.
Stappen
Gebruik de volgende stappen om een MLflow-model te implementeren met een aangepast scorescript.
Identificeer de map waarin uw MLflow-model is geplaatst.
a. Ga naar de Azure Machine Learning-portal.
b. Ga naar de sectie Modellen.
c. Selecteer het model dat u wilt implementeren en klik op het tabblad Artefacten.
d. Noteer de map die wordt weergegeven. Deze map is aangegeven toen het model werd geregistreerd.
Maak een scorescript. U ziet hoe de mapnaam
model
die u eerder hebt geïdentificeerd, is opgenomen in deinit()
functie.deployment-custom/code/batch_driver.py
# Copyright (c) Microsoft. All rights reserved. # Licensed under the MIT license. import os import glob import mlflow import pandas as pd import logging def init(): global model global model_input_types global model_output_names # AZUREML_MODEL_DIR is an environment variable created during deployment # It is the path to the model folder # Please provide your model's folder name if there's one model_path = glob.glob(os.environ["AZUREML_MODEL_DIR"] + "/*/")[0] # Load the model, it's input types and output names model = mlflow.pyfunc.load(model_path) if model.metadata and model.metadata.signature: if model.metadata.signature.inputs: model_input_types = dict( zip( model.metadata.signature.inputs.input_names(), model.metadata.signature.inputs.pandas_types(), ) ) if model.metadata.signature.outputs: if model.metadata.signature.outputs.has_input_names(): model_output_names = model.metadata.signature.outputs.input_names() elif len(model.metadata.signature.outputs.input_names()) == 1: model_output_names = ["prediction"] else: logging.warning( "Model doesn't contain a signature. Input data types won't be enforced." ) def run(mini_batch): print(f"run method start: {__file__}, run({len(mini_batch)} files)") data = pd.concat( map( lambda fp: pd.read_csv(fp).assign(filename=os.path.basename(fp)), mini_batch ) ) if model_input_types: data = data.astype(model_input_types) # Predict over the input data, minus the column filename which is not part of the model. pred = model.predict(data.drop("filename", axis=1)) if pred is not pd.DataFrame: if not model_output_names: model_output_names = ["pred_col" + str(i) for i in range(pred.shape[1])] pred = pd.DataFrame(pred, columns=model_output_names) return pd.concat([data, pred], axis=1)
We gaan een omgeving maken waarin het scorescript kan worden uitgevoerd. Omdat ons model MLflow is, worden de conda-vereisten ook opgegeven in het modelpakket (zie de MLmodel-indeling voor meer informatie over MLflow-modellen en de bestanden die erin zijn opgenomen). Vervolgens gaan we de omgeving bouwen met behulp van de conda-afhankelijkheden van het bestand. We moeten echter ook het pakket
azureml-core
opnemen dat vereist is voor Batch-implementaties.Tip
Als uw model al is geregistreerd in het modelregister, kunt u het
conda.yml
bestand dat is gekoppeld aan uw model downloaden/kopiëren door naar Azure Machine Learning-studio> Modellen > uw model selecteren in de lijst > Artefacten. Open de hoofdmap in de navigatie en selecteer hetconda.yml
vermelde bestand. Klik op Downloaden of de inhoud ervan kopiëren.Belangrijk
In dit voorbeeld wordt een Conda-omgeving gebruikt die is opgegeven bij
/heart-classifier-mlflow/environment/conda.yaml
. Dit bestand is gemaakt door het oorspronkelijke MLflow conda-afhankelijkhedenbestand te combineren en het pakketazureml-core
toe te voegen. U kunt hetconda.yml
bestand niet rechtstreeks vanuit het model gebruiken.De omgevingsdefinitie wordt opgenomen in de implementatiedefinitie zelf als een anonieme omgeving. U ziet de volgende regels in de implementatie:
environment: name: batch-mlflow-xgboost image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: environment/conda.yaml
De implementatie configureren:
Als u een nieuwe implementatie wilt maken onder het gemaakte eindpunt, maakt u een
YAML
configuratie zoals hieronder. U kunt het YAML-schema voor het volledige batcheindpunt controleren op extra eigenschappen.implementatie-aangepast/deployment.yml
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: heart-classifier-batch name: classifier-xgboost-custom description: A heart condition classifier based on XGBoost type: model model: azureml:heart-classifier-mlflow@latest environment: name: batch-mlflow-xgboost image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: environment/conda.yaml code_configuration: code: code scoring_script: batch_driver.py compute: azureml:batch-cluster resources: instance_count: 2 settings: max_concurrency_per_instance: 2 mini_batch_size: 2 output_action: append_row output_file_name: predictions.csv retry_settings: max_retries: 3 timeout: 300 error_threshold: -1 logging_level: info
We gaan nu de implementatie maken:
Op dit moment is ons batcheindpunt gereed om te worden gebruikt.
Resources opschonen
Voer de volgende code uit om het batch-eindpunt en alle onderliggende implementaties te verwijderen. Batchscoretaken worden niet verwijderd.
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes