Anpassa utdata i batchdistributioner
GÄLLER FÖR:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (aktuell)
Den här guiden beskriver hur du skapar distributioner som genererar anpassade utdata och filer. Ibland behöver du mer kontroll över vad som skrivs som utdata från batchinferensjobb. Dessa fall omfattar följande situationer:
- Du måste styra hur förutsägelser skrivs i utdata. Du vill till exempel lägga till förutsägelsen till de ursprungliga data om data är tabellbaserade.
- Du måste skriva dina förutsägelser i ett annat filformat än det som stöds direkt av batchdistributioner.
- Din modell är en generativ modell som inte kan skriva utdata i tabellformat. Till exempel modeller som producerar bilder som utdata.
- Din modell skapar flera tabellfiler i stället för en enda. Till exempel modeller som utför prognostisering genom att överväga flera scenarier.
Med batchdistributioner kan du ta kontroll över jobbens utdata genom att låta dig skriva direkt till utdata från batchdistributionsjobbet. I den här självstudien får du lära dig hur du distribuerar en modell för att utföra batchinferens och skriva utdata i parquet-format genom att lägga till förutsägelserna till de ursprungliga indata.
Om det här exemplet
Det här exemplet visar hur du kan distribuera en modell för att utföra batchinferens och anpassa hur dina förutsägelser skrivs i utdata. Modellen är baserad på datamängden UCI Heart Disease. Databasen innehåller 76 attribut, men i det här exemplet används en delmängd av 14 av dem. Modellen försöker förutsäga förekomsten av hjärtsjukdomar hos en patient. Det är heltal som värderas från 0 (ingen närvaro) till 1 (närvaro).
Modellen tränades med en XGBBoost
klassificerare och all nödvändig förbearbetning paketerades som en scikit-learn
pipeline, vilket gör den här modellen till en pipeline från slutpunkt till slutpunkt som går från rådata till förutsägelser.
Exemplet i den här artikeln baseras på kodexempel som finns på lagringsplatsen azureml-examples . Om du vill köra kommandona lokalt utan att behöva kopiera eller klistra in YAML och andra filer använder du följande kommandon för att klona lagringsplatsen och gå till mappen för kodningsspråket:
git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli
Filerna för det här exemplet finns i:
cd endpoints/batch/deploy-models/custom-outputs-parquet
Följ med i en Jupyter-anteckningsbok
Det finns en Jupyter-anteckningsbok som du kan använda för att följa det här exemplet. Öppna notebook-filen custom-output-batch.ipynb på den klonade lagringsplatsen.
Förutsättningar
En Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar.
En Azure Machine Learning-arbetsyta. Information om hur du skapar en arbetsyta finns i Hantera Azure Machine Learning-arbetsytor.
Följande behörigheter på Azure Machine Learning-arbetsytan:
- För att skapa eller hantera batchslutpunkter och distributioner: Använd en ägare, deltagare eller anpassad roll som har tilldelats behörigheterna
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
. - För att skapa Azure Resource Manager-distributioner i arbetsytans resursgrupp: Använd en ägare, deltagare eller anpassad roll som har tilldelats behörigheten
Microsoft.Resources/deployments/write
i resursgruppen där arbetsytan distribueras.
- För att skapa eller hantera batchslutpunkter och distributioner: Använd en ägare, deltagare eller anpassad roll som har tilldelats behörigheterna
Azure Machine Learning CLI eller Azure Machine Learning SDK för Python:
Kör följande kommando för att installera Azure CLI och
ml
tillägget för Azure Machine Learning:az extension add -n ml
Distributioner av pipelinekomponenter för batchslutpunkter introduceras i version 2.7 av
ml
tillägget för Azure CLI.az extension update --name ml
Använd kommandot för att hämta den senaste versionen.
Anslut till din arbetsyta
Arbetsytan är resursen på den översta nivån för Azure Machine Learning. Det är en central plats där du kan arbeta med alla artefakter som du skapar när du använder Azure Machine Learning. I det här avsnittet ansluter du till arbetsytan där du utför dina distributionsuppgifter.
I följande kommando anger du ditt prenumerations-ID, arbetsytans namn, resursgruppsnamn och plats:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Skapa en batchdistribution med anpassade utdata
I det här exemplet skapar du en distribution som kan skriva direkt till utdatamappen för batchdistributionsjobbet. Distributionen använder den här funktionen för att skriva anpassade parquet-filer.
Registrera modellen
Du kan bara distribuera registrerade modeller med hjälp av en batchslutpunkt. I det här fallet har du redan en lokal kopia av modellen på lagringsplatsen, så du behöver bara publicera modellen till registret på arbetsytan. Du kan hoppa över det här steget om den modell som du försöker distribuera redan är registrerad.
MODEL_NAME='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"
Skapa ett bedömningsskript
Du måste skapa ett bedömningsskript som kan läsa indata som tillhandahålls av batchdistributionen och returnera poängen för modellen. Du kommer också att skriva direkt till utdatamappen för jobbet. Sammanfattningsvis gör det föreslagna bedömningsskriptet följande:
- Läser indata som CSV-filer.
- Kör en MLflow-modellfunktion
predict
över indata. - Lägger till förutsägelserna i en
pandas.DataFrame
tillsammans med indata. - Skriver data i en fil med namnet som indatafil, men i
parquet
format.
kod/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
Kommentarer:
- Observera hur miljövariabeln
AZUREML_BI_OUTPUT_PATH
används för att få åtkomst till utdatasökvägen för distributionsjobbet. - Funktionen
init()
fyller i en global variabel med namnetoutput_path
som kan användas senare för att veta var du ska skriva. - Metoden
run
returnerar en lista över de bearbetade filerna. Det krävs förrun
att funktionen ska returnera ettlist
eller ettpandas.DataFrame
objekt.
Varning
Ta hänsyn till att alla batchexekutorer har skrivåtkomst till den här sökvägen samtidigt. Det innebär att du måste ta hänsyn till samtidighet. I det här fallet kontrollerar du att varje köre skriver sin egen fil med hjälp av indatafilens namn som namn på utdatamappen.
Skapa slutpunkten
Nu skapar du en batchslutpunkt med namnet heart-classifier-batch
där modellen distribueras.
Bestäm namnet på slutpunkten. Namnet på slutpunkten visas i den URI som är associerad med slutpunkten, så batchslutpunktsnamn måste vara unika i en Azure-region. Det kan till exempel bara finnas en batchslutpunkt med namnet
mybatchendpoint
iwestus2
.Konfigurera batchslutpunkten.
Skapa slutpunkten:
Skapa distributionen
Följ nästa steg för att skapa en distribution med hjälp av föregående bedömningsskript:
Skapa först en miljö där bedömningsskriptet kan köras:
Skapa distributionen. Observera att
output_action
nu är inställt påSUMMARY_ONLY
.Kommentar
Det här exemplet förutsätter att du har ett beräkningskluster med namnet
batch-cluster
. Ändra namnet i enlighet med detta.Skapa en YAML-konfiguration som följande för att skapa en ny distribution under den skapade slutpunkten. Du kan kontrollera YAML-schemat för den fullständiga batchslutpunkten för extra egenskaper.
$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
Skapa sedan distributionen med följande kommando:
az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
Nu är vår batchslutpunkt redo att användas.
Testa distributionen
Om du vill testa slutpunkten använder du ett exempel på omärkta data som finns på den här lagringsplatsen, som kan användas med modellen. Batch-slutpunkter kan bara bearbeta data som finns i molnet och som är tillgängliga från Azure Machine Learning-arbetsytan. I det här exemplet laddar du upp den till ett Azure Machine Learning-datalager. Du ska skapa en datatillgång som kan användas för att anropa slutpunkten för bedömning. Observera dock att batchslutpunkter accepterar data som kan placeras på flera typer av platser.
Anropa slutpunkten med data från ett lagringskonto:
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)
Kommentar
Verktyget
jq
kanske inte installeras på varje installation. Du kan få instruktioner på GitHub.Ett batchjobb startas så snart kommandot returnerar. Du kan övervaka statusen för jobbet tills det har slutförts:
Analysera utdata
Jobbet genererar ett namngivet utdata som heter score
där alla genererade filer placeras. Eftersom du skrev till katalogen direkt, en fil per indatafil, kan du förvänta dig att ha samma antal filer. I det här exemplet namnger du utdatafilerna på samma sätt som indata, men de har ett parquet-tillägg.
Kommentar
Observera att en fil predictions.csv också ingår i utdatamappen. Den här filen innehåller sammanfattningen av de bearbetade filerna.
Du kan ladda ned resultatet av jobbet med hjälp av jobbnamnet:
Om du vill ladda ned förutsägelserna använder du följande kommando:
az ml job download --name $JOB_NAME --output-name score --download-path ./
När filen har laddats ned kan du öppna den med hjälp av ditt favoritverktyg. I följande exempel läses förutsägelserna in med hjälp av Pandas
dataramen.
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
Utdata ser ut så här:
ålder | Sex | ... | thal | prognos |
---|---|---|---|---|
63 | 1 | ... | fast | 0 |
67 | 1 | ... | normal | 1 |
67 | 1 | ... | vändbar | 0 |
37 | 1 | ... | normal | 0 |
Rensa resurser
Kör följande kod för att ta bort batchslutpunkten och alla underliggande distributioner. Batchbedömningsjobb tas inte bort.
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes