Distribuera MLflow-modeller i batchdistributioner
GÄLLER FÖR:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (aktuell)
I den här artikeln får du lära dig hur du distribuerar MLflow-modeller till Azure Machine Learning för båda batchslutpunkterna. När du distribuerar MLflow-modeller till batchslutpunkter, Azure Machine Learning:
- Tillhandahåller en MLflow-basavbildning/kuraterad miljö som innehåller de beroenden som krävs för att köra ett Azure Machine Learning Batch-jobb.
- Skapar en batchjobbpipeline med ett bedömningsskript åt dig som kan användas för att bearbeta data med hjälp av parallellisering.
Kommentar
Mer information om vilka indatafiltyper som stöds och information om hur MLflow-modellen fungerar finns i Överväganden vid distribution till batchinferens.
Om det här exemplet
Det här exemplet visar hur du kan distribuera en MLflow-modell till en batchslutpunkt för att utföra batchförutsägelser. I det här exemplet används en MLflow-modell baserat på datamängden UCI Heart Disease. Databasen innehåller 76 attribut, men vi använder en delmängd av 14 av dem. Modellen försöker förutsäga förekomsten av hjärtsjukdomar hos en patient. Det är heltalsvärde från 0 (ingen närvaro) till 1 (närvaro).
Modellen har tränats med en XGBBoost
klassificerare och all nödvändig förbearbetning har paketerats 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/klistra in YAML och andra filer klonar du först lagringsplatsen och ändrar sedan kataloger till mappen:
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/heart-classifier-mlflow
Följ med i Jupyter Notebooks
Du kan följa det här exemplet i följande notebook-filer. Öppna notebook-filen mlflow-for-batch-tabular.ipynb på den klonade lagringsplatsen.
Förutsättningar
Innan du följer stegen i den här artikeln kontrollerar du att du har följande förutsättningar:
En Azure-prenumeration. Om du inte har någon Azure-prenumeration kan du skapa ett kostnadsfritt konto innan du börjar. Prova den kostnadsfria eller betalda versionen av Azure Machine Learning.
En Azure Machine Learning-arbetsyta. Om du inte har någon använder du stegen i artikeln Hantera Azure Machine Learning-arbetsytor för att skapa en.
Kontrollera att du har följande behörigheter på arbetsytan:
Skapa eller hantera batchslutpunkter och distributioner: Använd en ägare, deltagare eller anpassad roll som tillåter
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
.Skapa ARM-distributioner i arbetsytans resursgrupp: Använd en roll som ägare, deltagare eller anpassad som tillåter
Microsoft.Resources/deployments/write
i den resursgrupp där arbetsytan distribueras.
Du måste installera följande programvara för att arbeta med Azure Machine Learning:
Azure CLI och
ml
tillägget för Azure Machine Learning.az extension add -n ml
Kommentar
Distributioner av pipelinekomponenter för Batch-slutpunkter introducerades i version 2.7 av
ml
tillägget för Azure CLI. Användaz extension update --name ml
för att hämta den senaste versionen av den.
Anslut till din arbetsyta
Arbetsytan är resursen på den översta nivån i Azure Machine Learning, och är en central plats där du kan arbeta med alla artefakter du skapar när du använder Azure Machine Learning. I det här avsnittet ansluter vi till arbetsytan där du ska utföra distributionsuppgifter.
Skicka in värdena för ditt prenumerations-ID, arbetsyta, plats och resursgrupp i följande kod:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Steg
Följ dessa steg för att distribuera en MLflow-modell till en batchslutpunkt för att köra batchinferens över nya data:
Batch-slutpunkten kan bara distribuera registrerade modeller. I det här fallet har vi redan en lokal kopia av modellen på lagringsplatsen, så vi 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.
Innan vi går vidare måste vi se till att de batchdistributioner som vi ska skapa kan köras på viss infrastruktur (beräkning). Batchdistributioner kan köras på valfri Azure Machine Learning-beräkning som redan finns på arbetsytan. Det innebär att flera batchdistributioner kan dela samma beräkningsinfrastruktur. I det här exemplet ska vi arbeta med ett Azure Machine Learning-beräkningskluster med namnet
cpu-cluster
. Nu ska vi kontrollera att beräkningen finns på arbetsytan eller skapa den på annat sätt.Nu är det dags att skapa batchslutpunkten och distributionen. Vi börjar med slutpunkten först. Slutpunkter kräver bara att ett namn och en beskrivning skapas. Namnet på slutpunkten hamnar i den URI som är associerad med slutpunkten. Därför måste batchslutpunktsnamn vara unika i en Azure-region. Det kan till exempel bara finnas en batchslutpunkt med namnet
mybatchendpoint
iwestus2
.Skapa slutpunkten:
Skapa en ny slutpunkt genom att skapa en
YAML
konfiguration som liknar följande: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
Skapa sedan slutpunkten med följande kommando:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Nu ska vi skapa distributionen. MLflow-modeller kräver inte att du anger en miljö eller ett bedömningsskript när du skapar distributionerna när de skapas åt dig. Du kan dock ange dem om du vill anpassa hur distributionen gör slutsatsdragning.
Om du vill skapa en ny distribution under den skapade slutpunkten skapar du en
YAML
konfiguration som följande. Du kan kontrollera YAML-schemat för den fullständiga batchslutpunkten för extra egenskaper.deployment-simple/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
Skapa sedan distributionen med följande kommando:
az ml batch-deployment create --file deployment-simple/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
Viktigt!
Konfigurera
timeout
i distributionen baserat på hur lång tid det tar för din modell att köra slutsatsdragning på en enda batch. Ju större batchstorlek desto längre måste det här värdet vara. Remeber sommini_batch_size
anger antalet filer i en batch, inte antalet exempel. När du arbetar med tabelldata kan varje fil innehålla flera rader, vilket ökar tiden det tar för batchslutpunkten att bearbeta varje fil. Använd höga värden i dessa fall för att undvika timeout-fel.Även om du kan anropa en specifik distribution i en slutpunkt, vill du vanligtvis anropa själva slutpunkten och låta slutpunkten bestämma vilken distribution som ska användas. En sådan distribution heter "standard"-distributionen. Detta ger dig möjlighet att ändra standarddistributionen och därmed ändra modellen som betjänar distributionen utan att ändra kontraktet med användaren som anropar slutpunkten. Använd följande instruktion för att uppdatera standarddistributionen:
Nu är vår batchslutpunkt redo att användas.
Testa distributionen
För att testa slutpunkten ska vi använda ett exempel på omärkta data som finns på den här lagringsplatsen och 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 ska vi ladda upp det till ett Azure Machine Learning-datalager. I synnerhet ska vi 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å olika platser.
Nu ska vi skapa datatillgången först. Den här datatillgången består av en mapp med flera CSV-filer som vi vill bearbeta parallellt med batchslutpunkter. Du kan hoppa över det här steget om dina data redan är registrerade som en datatillgång eller att du vill använda en annan indatatyp.
a. Skapa en datatillgångsdefinition i
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. Skapa datatillgången:
az ml data create -f heart-dataset-unlabeled.yml
Nu när data har laddats upp och är redo att användas ska vi anropa slutpunkten:
JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input azureml:heart-dataset-unlabeled@latest --query name -o tsv)
Kommentar
Verktyget
jq
kanske inte installeras på varje installation. Du kan få installationsinstruktioner i den här länken.Dricks
Observera att vi inte anger distributionsnamnet i anropsåtgärden. Det beror på att slutpunkten automatiskt dirigerar jobbet till standarddistributionen. Eftersom vår slutpunkt bara har en distribution är den standard. Du kan rikta en specifik distribution genom att ange argumentet/parametern
deployment_name
.Ett batchjobb startas så snart kommandot returnerar. Du kan övervaka statusen för jobbet tills det har slutförts:
Analysera utdata
Utdataförutsägelser genereras i predictions.csv
filen enligt beskrivningen i distributionskonfigurationen. Jobbet genererar ett namngivet utdata som heter score
där den här filen placeras. Endast en fil genereras per batchjobb.
Filen är strukturerad på följande sätt:
Det finns en rad per varje datapunkt som skickades till modellen. För tabelldata innebär det att filen (
predictions.csv
) innehåller en rad för varje rad som finns i var och en av de bearbetade filerna. För andra datatyper (t.ex. bilder, ljud, text) finns det en rad per bearbetad fil.Följande kolumner finns i filen (i ordning):
row
(valfritt), motsvarande radindex i indatafilen. Detta gäller endast om indata är tabellbaserade. Förutsägelser returneras i samma ordning som de visas i indatafilen så att du kan lita på att radnumret matchar motsvarande förutsägelse.prediction
, förutsägelsen som är associerad med indata. Det här värdet returneras "som det är" som det tillhandahölls av modellenspredict().
funktion.file_name
, filnamnet där data lästes från. I tabelldata använder du det här fältet för att veta vilken förutsägelse som tillhör vilka indata.
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
score = pd.read_csv(
"named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)
Utdata ser ut så här:
rad | Prognos | fil |
---|---|---|
0 | 0 | heart-unlabeled-0.csv |
1 | 1 | heart-unlabeled-0.csv |
2 | 0 | heart-unlabeled-0.csv |
... | ... | ... |
307 | 0 | heart-unlabeled-3.csv |
Dricks
Observera att indata i det här exemplet var tabelldata i CSV
format och att det fanns 4 olika indatafiler (heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv och heart-unlabeled-3.csv).
Överväganden vid distribution till batchinferens
Azure Machine Learning stöder distribution av MLflow-modeller till batchslutpunkter utan att ange ett bedömningsskript. Detta är ett praktiskt sätt att distribuera modeller som kräver bearbetning av stora mängder data på ett batchbaserat sätt. Azure Machine Learning använder information i MLflow-modellspecifikationen för att samordna slutsatsdragningsprocessen.
Så här distribueras arbete på arbetare
Batch-slutpunkter distribuerar arbete på filnivå för både strukturerade och ostrukturerade data. Därför stöds endast URI-filer och URI-mappar för den här funktionen. Varje arbetare bearbetar batchar med Mini batch size
filer i taget. För tabelldata tar batchslutpunkter inte hänsyn till antalet rader i varje fil när arbetet distribueras.
Varning
Kapslade mappstrukturer utforskas inte under slutsatsdragningen. Om du partitionerar dina data med hjälp av mappar, se till att platta ut strukturen i förväg.
Batchdistributioner anropar funktionen för predict
MLflow-modellen en gång per fil. För CSV-filer som innehåller flera rader kan detta medföra ett minnestryck i den underliggande beräkningen och kan öka den tid det tar för modellen att poängsätta en enskild fil (särskilt för dyra modeller som stora språkmodeller). Om du stöter på flera out-of-memory-undantag eller timeout-poster i loggar kan du överväga att dela upp data i mindre filer med färre rader eller implementera batchbearbetning på radnivå inuti modell-/bedömningsskriptet.
Stöd för filtyper
Följande datatyper stöds för batchinferens när du distribuerar MLflow-modeller utan en miljö och ett bedömningsskript. Om du vill bearbeta en annan filtyp eller köra slutsatsdragning på ett annat sätt som batchslutpunkter gör som standard kan du alltid skapa distributionen med ett bedömningsskript enligt beskrivningen i Använda MLflow-modeller med ett bedömningsskript.
Filnamnstillägg | Typ som returneras som modellens indata | Krav för signatur |
---|---|---|
.csv , , .parquet .pqt |
pd.DataFrame |
ColSpec . Om det inte anges tillämpas inte kolumner som skriver. |
.png , .jpg , .jpeg , .tiff , , , .bmp .gif |
np.ndarray |
TensorSpec . Indata omformas för att matcha tensorsformen om den är tillgänglig. Om ingen signatur är tillgänglig härleds tensorer av typen np.uint8 . Mer information finns i Överväganden för MLflow-modeller som bearbetar bilder. |
Varning
Observera att alla filer som inte stöds som kan finnas i indata gör att jobbet misslyckas. Du ser en felpost på följande sätt: "ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.avro'. Filtypen "avro" stöds inte."
Signaturframtvingande för MLflow-modeller
Indatas datatyper framtvingas av batchdistributionsjobb när data läss med hjälp av den tillgängliga MLflow-modellsignaturen. Det innebär att dina dataindata ska överensstämma med de typer som anges i modellsignaturen. Om data inte kan parsas som förväntat misslyckas jobbet med ett felmeddelande som liknar följande: "ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.csv'. Undantag: ogiltig literal för int() med bas 10: "värde".
Dricks
Signaturer i MLflow-modeller är valfria, men de rekommenderas starkt eftersom de är ett bekvämt sätt att tidigt identifiera datakompatibilitetsproblem. Mer information om hur du loggar modeller med signaturer finns i Loggningsmodeller med en anpassad signatur, miljö eller exempel.
Du kan kontrollera modellens modellsignatur genom att öppna MLmodel
filen som är associerad med MLflow-modellen. Mer information om hur signaturer fungerar i MLflow finns i Signaturer i MLflow.
Smakstöd
Batchdistributioner stöder endast distribution av MLflow-modeller med en pyfunc
smak. Om du behöver distribuera en annan smak kan du läsa Använda MLflow-modeller med ett bedömningsskript.
Anpassa MLflow-modelldistributioner med ett bedömningsskript
MLflow-modeller kan distribueras till batchslutpunkter utan att ange ett bedömningsskript i distributionsdefinitionen. Du kan dock välja att ange den här filen (kallas vanligtvis batchdrivrutinen) för att anpassa hur slutsatsdragningen körs.
Du väljer vanligtvis det här arbetsflödet när:
- Du måste bearbeta en filtyp som inte stöds av batchdistributioner av MLflow-distributioner.
- Du måste anpassa hur modellen körs, till exempel använda en specifik smak för att läsa in den med
mlflow.<flavor>.load()
. - Du måste utföra för-/pos-bearbetning i din bedömningsrutin när det inte görs av själva modellen.
- Modellens utdata kan inte representeras på ett bra sätt i tabelldata. Till exempel är det en tensor som representerar en bild.
- Du kan inte bearbeta varje fil samtidigt på grund av minnesbegränsningar och den måste läsa den i segment.
Viktigt!
Om du väljer att ange ett bedömningsskript för en MLflow-modelldistribution måste du också ange den miljö där distributionen ska köras.
Steg
Använd följande steg för att distribuera en MLflow-modell med ett anpassat bedömningsskript.
Identifiera mappen där MLflow-modellen finns.
a. Gå till Azure Machine Learning-portalen.
b. Gå till avsnittet Modeller.
c. Välj den modell som du försöker distribuera och klicka på fliken Artefakter.
d. Anteckna mappen som visas. Den här mappen angavs när modellen registrerades.
Skapa ett bedömningsskript. Observera att mappnamnet
model
som du identifierade tidigare har inkluderats iinit()
funktionen.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)
Nu ska vi skapa en miljö där bedömningsskriptet kan köras. Eftersom vår modell är MLflow anges även conda-kraven i modellpaketet (mer information om MLflow-modeller och filerna som ingår i den finns i MLmodel-formatet). Sedan ska vi skapa miljön med hjälp av conda-beroendena från filen. Men vi måste också inkludera det paket
azureml-core
som krävs för Batch-distributioner.Dricks
Om din modell redan är registrerad i modellregistret kan du ladda ned/kopiera
conda.yml
filen som är associerad med din modell genom att gå till Azure Machine Learning-studio> Modeller > Välj din modell i listan > Artefakter. Öppna rotmappen i navigeringen och välj den fil somconda.yml
visas. Klicka på Ladda ned eller kopiera dess innehåll.Viktigt!
I det här exemplet används en conda-miljö som anges på
/heart-classifier-mlflow/environment/conda.yaml
. Den här filen skapades genom att kombinera den ursprungliga MLflow conda-beroendefilen och lägga till paketetazureml-core
. Du kan inte användaconda.yml
filen direkt från modellen.Konfigurera distributionen:
Om du vill skapa en ny distribution under den skapade slutpunkten skapar du en
YAML
konfiguration som följande. Du kan kontrollera YAML-schemat för den fullständiga batchslutpunkten för extra egenskaper.deployment-custom/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
Nu ska vi skapa distributionen:
Nu är vår batchslutpunkt redo att användas.
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