Uitvoer in batchimplementaties aanpassen
VAN TOEPASSING OP:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (current)
In deze handleiding wordt uitgelegd hoe u implementaties maakt waarmee aangepaste uitvoer en bestanden worden gegenereerd. Soms hebt u meer controle over wat is geschreven als uitvoer van batchdeductietaken. Deze gevallen omvatten de volgende situaties:
- U moet bepalen hoe voorspellingen in de uitvoer worden geschreven. U wilt bijvoorbeeld de voorspelling toevoegen aan de oorspronkelijke gegevens als de gegevens in tabelvorm zijn.
- U moet uw voorspellingen schrijven in een andere bestandsindeling dan de bestandsindeling die standaard wordt ondersteund door batchimplementaties.
- Uw model is een generatief model dat de uitvoer niet in tabelvorm kan schrijven. Modellen die bijvoorbeeld afbeeldingen produceren als uitvoer.
- Uw model produceert meerdere tabellaire bestanden in plaats van één bestand. Bijvoorbeeld modellen die prognoses uitvoeren door meerdere scenario's te overwegen.
Met Batch-implementaties kunt u de controle over de uitvoer van de taken overnemen door u rechtstreeks naar de uitvoer van de batch-implementatietaak te laten schrijven. In deze zelfstudie leert u hoe u een model implementeert om batchdeductie uit te voeren en de uitvoer in parquet-indeling te schrijven door de voorspellingen toe te voegen aan de oorspronkelijke invoergegevens.
Over dit voorbeeld
In dit voorbeeld ziet u hoe u een model kunt implementeren om batchdeductie uit te voeren en hoe uw voorspellingen in de uitvoer worden geschreven. Het model is gebaseerd op de UCI Heart Disease-gegevensset. De database bevat 76 kenmerken, maar in dit voorbeeld wordt een subset van 14 kenmerken gebruikt. 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 pijplijn scikit-learn
, 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/custom-outputs-parquet
Volgen in een Jupyter-notebook
Er is een Jupyter-notebook waarmee u dit voorbeeld kunt volgen. Open in de gekloonde opslagplaats het notebook met de naam custom-output-batch.ipynb.
Vereisten
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. Zie Azure Machine Learning-werkruimten beheren om een werkruimte te maken.
Zorg ervoor dat u de volgende machtigingen hebt in de Machine Learning-werkruimte:
- Batch-eindpunten en -implementaties maken of beheren: gebruik een eigenaar, inzender of aangepaste rol die dit toestaat
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
. - Azure Resource Manager-implementaties maken in de werkruimteresourcegroep: gebruik een eigenaar, inzender of aangepaste rol waarmee de resourcegroep waarin de werkruimte is geïmplementeerd, is toegestaan
Microsoft.Resources/deployments/write
.
- Batch-eindpunten en -implementaties maken of beheren: gebruik een eigenaar, inzender of aangepaste rol die dit toestaat
Installeer de volgende software om te werken met Machine Learning:
Voer de volgende opdracht uit om de Azure CLI en de
ml
extensie voor Azure Machine Learning te installeren:az extension add -n ml
Implementaties van pijplijnonderdelen voor Batch-eindpunten worden geïntroduceerd in versie 2.7 van de
ml
extensie voor de Azure CLI. Gebruik deaz extension update --name ml
opdracht om de nieuwste versie op te halen.
Verbinding maken met uw werkruimte
De werkruimte is de resource op het hoogste niveau voor Machine Learning. Het biedt een centrale plek om te werken met alle artefacten die u maakt wanneer u Machine Learning gebruikt. In deze sectie maakt u verbinding met de werkruimte waar u uw implementatietaken uitvoert.
Voer in de volgende opdracht de waarden in voor uw abonnements-id, werkruimte, locatie en resourcegroep:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Een batchimplementatie maken met een aangepaste uitvoer
In dit voorbeeld maakt u een implementatie die rechtstreeks naar de uitvoermap van de batch-implementatietaak kan schrijven. De implementatie gebruikt deze functie om aangepaste Parquet-bestanden te schrijven.
Het model registreren
U kunt geregistreerde modellen alleen implementeren met behulp van een batch-eindpunt. In dit geval hebt u al een lokale kopie van het model in de opslagplaats, dus u hoeft 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.
MODEL_NAME='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"
Een scorescript maken
U moet een scorescript maken waarmee de invoergegevens van de batchimplementatie kunnen worden gelezen en de scores van het model kunnen worden geretourneerd. U gaat ook rechtstreeks naar de uitvoermap van de taak schrijven. Kortom, het voorgestelde scorescript doet het volgende:
- Leest de invoergegevens als CSV-bestanden.
- Voert een MLflow-modelfunctie
predict
uit op de invoergegevens. - Voegt de voorspellingen toe aan een
pandas.DataFrame
samen met de invoergegevens. - Hiermee schrijft u de gegevens in een bestand met de naam het invoerbestand, maar in
parquet
indeling.
code/batch_driver.py
import os
import pickle
import glob
import pandas as pd
from pathlib import Path
from typing import List
def init():
global model
global output_path
# 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:
output_path = os.environ["AZUREML_BI_OUTPUT_PATH"]
model_path = os.environ["AZUREML_MODEL_DIR"]
model_file = glob.glob(f"{model_path}/*/*.pkl")[-1]
with open(model_file, "rb") as file:
model = pickle.load(file)
def run(mini_batch: List[str]):
for file_path in mini_batch:
data = pd.read_csv(file_path)
pred = model.predict(data)
data["prediction"] = pred
output_file_name = Path(file_path).stem
output_file_path = os.path.join(output_path, output_file_name + ".parquet")
data.to_parquet(output_file_path)
return mini_batch
Opmerkingen:
- U ziet hoe de omgevingsvariabele
AZUREML_BI_OUTPUT_PATH
wordt gebruikt om toegang te krijgen tot het uitvoerpad van de implementatietaak. - De
init()
functie vult een globale variabeleoutput_path
in die later kan worden gebruikt om te weten waar u moet schrijven. - De
run
methode retourneert een lijst met de verwerkte bestanden. Het is vereist dat derun
functie eenlist
of eenpandas.DataFrame
object retourneert.
Waarschuwing
Houd er rekening mee dat alle batchexecutors tegelijkertijd schrijftoegang tot dit pad hebben. Dit betekent dat u rekening moet houden met gelijktijdigheid. Zorg er in dit geval voor dat elke uitvoerder een eigen bestand schrijft met behulp van de naam van het invoerbestand als de naam van de uitvoermap.
Het eindpunt maken
U maakt nu een batch-eindpunt met de naam heart-classifier-batch
waar het model is geïmplementeerd.
Bepaal de naam van het eindpunt. De naam van het eindpunt wordt weergegeven in de URI die is gekoppeld aan uw eindpunt, zodat namen van batcheindpunten uniek moeten zijn binnen een Azure-regio. Er kan bijvoorbeeld slechts één batcheindpunt zijn met de naam
mybatchendpoint
inwestus2
.Configureer uw batch-eindpunt.
Maak het eindpunt:
De implementatie maken
Volg de volgende stappen om een implementatie te maken met behulp van het vorige scorescript:
Maak eerst een omgeving waarin het scorescript kan worden uitgevoerd:
Maak de implementatie. U ziet dat
output_action
nu is ingesteld opSUMMARY_ONLY
.Notitie
In dit voorbeeld wordt ervan uitgegaan dat u een rekencluster met de naam
batch-cluster
hebt. Wijzig die naam dienovereenkomstig.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.
$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 and Scikit-Learn pipelines that append predictions on parquet files. type: model model: azureml:heart-classifier-sklpipe@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: summary_only 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.yml --endpoint-name $ENDPOINT_NAME --set-default
Op dit moment is ons batcheindpunt gereed om te worden gebruikt.
De implementatie testen
Als u uw eindpunt wilt testen, gebruikt u een voorbeeld van niet-gelabelde gegevens in deze opslagplaats, die met het model kunnen worden gebruikt. Batch-eindpunten kunnen alleen gegevens verwerken die zich in de cloud bevinden en toegankelijk zijn vanuit de Azure Machine Learning-werkruimte. In dit voorbeeld uploadt u deze naar een Azure Machine Learning-gegevensarchief. U gaat een gegevensasset maken die kan worden gebruikt om het eindpunt aan te roepen voor scoren. U ziet echter dat batcheindpunten gegevens accepteren die op meerdere typen locaties kunnen worden geplaatst.
Roep het eindpunt aan met gegevens uit een opslagaccount:
JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data --query name -o tsv)
Notitie
Het hulpprogramma
jq
is mogelijk niet geïnstalleerd bij elke installatie. U kunt instructies op GitHub krijgen.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
De taak genereert een benoemde uitvoer die wordt aangeroepen score
waar alle gegenereerde bestanden worden geplaatst. Omdat u rechtstreeks in de map hebt geschreven, één bestand per invoerbestand, kunt u verwachten dat u hetzelfde aantal bestanden hebt. Geef in dit specifieke voorbeeld de uitvoerbestanden dezelfde naam als de invoer, maar ze hebben een Parquet-extensie.
Notitie
U ziet dat een bestand predictions.csv ook is opgenomen in de uitvoermap. Dit bestand bevat de samenvatting van de verwerkte bestanden.
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
import glob
output_files = glob.glob("named-outputs/score/*.parquet")
score = pd.concat((pd.read_parquet(f) for f in output_files))
score
De uitvoer ziet er als volgt uit:
leeftijd | geslacht | ... | thal | voorspelling |
---|---|---|---|---|
63 | 1 | ... | vast | 0 |
67 | 1 | ... | normaal | 1 |
67 | 1 | ... | omkeerbaar | 0 |
37 | 1 | ... | normaal | 0 |
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