Distribuera MLflow-modeller i batchdistributioner i Azure Mašinsko učenje
GÄLLER FÖR:Azure CLI ml extension v2 (current)Python SDK azure-ai-ml v2 (aktuell)
Den här artikeln beskriver hur du distribuerar MLflow-modeller till Azure Mašinsko učenje för batchinferens med hjälp av batchslutpunkter. När du distribuerar MLflow-modeller till batchslutpunkter slutför Azure Mašinsko učenje följande uppgifter:
- Tillhandahåller en MLflow-basavbildning eller en kuraterad miljö som innehåller de beroenden som krävs för att köra ett Mašinsko učenje batchjobb.
- Skapar en batchjobbpipeline med ett bedömningsskript åt dig som kan användas för att bearbeta data med hjälp av parallellisering.
Mer information om de indatafiltyper som stöds och information om hur MLflow-modellen fungerar finns i Överväganden för distribution till batchinferens.
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 Mašinsko učenje.
En Azure Machine Learning-arbetsyta. Information om hur du skapar en arbetsyta finns i Hantera Azure Mašinsko učenje-arbetsytor.
Kontrollera att du har följande behörigheter på Mašinsko učenje-arbetsytan:
- Skapa eller hantera batchslutpunkter och distributioner: Använd en ägare, deltagare eller anpassad roll som tillåter
Microsoft.MachineLearningServices/workspaces/batchEndpoints/*
. - Skapa Azure Resource Manager-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.
- Skapa eller hantera batchslutpunkter och distributioner: Använd en ägare, deltagare eller anpassad roll som tillåter
Installera följande programvara för att arbeta med Mašinsko učenje:
Kör följande kommando för att installera Azure CLI och
ml
tillägget för Azure Mašinsko učenje:az extension add -n ml
Distributioner av pipelinekomponenter för Batch-slutpunkter 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 Mašinsko učenje. Den ger en central plats där du kan arbeta med alla artefakter som du skapar när du använder Mašinsko učenje. I det här avsnittet ansluter du till arbetsytan där du utför dina distributionsuppgifter.
I följande kommando anger du värdena för ditt prenumerations-ID, arbetsyta, plats och resursgrupp:
az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
Utforska exemplet
Exemplet i den här artikeln visar hur du distribuerar en MLflow-modell till en batchslutpunkt för att utföra batchförutsägelser. MLflow-modellen baseras på datamängden UCI Heart Disease. Databasen innehåller 76 attribut, men i exemplet används endast en delmängd av 14. Modellen försöker förutsäga förekomsten av hjärtsjukdomar hos en patient med ett heltalsvärde från 0 (ingen närvaro) till 1 (närvaro).
Modellen tränas med hjälp av en XGBBoost
klassificerare. All nödvändig förbearbetning paketeras som en scikit-learn
pipeline, vilket gö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 följande mapp:
cd endpoints/batch/deploy-models/heart-classifier-mlflow
Följ med i Jupyter Notebooks
Du kan följa med i det här exemplet med hjälp av en offentlig Jupyter Notebook. Öppna notebook-filen mlflow-for-batch-tabular.ipynb på den klonade lagringsplatsen.
Distribuera MLflow-modellen
I det här avsnittet distribuerar du en MLflow-modell till en batchslutpunkt så att du kan köra batchinferens över nya data. Innan du går vidare med distributionen måste du se till att din modell är registrerad och att det finns ett tillgängligt beräkningskluster på arbetsytan.
Registrera modellen
Batch-slutpunkter kan bara distribuera registrerade modeller. I den här artikeln använder du en lokal kopia av modellen på lagringsplatsen. Därför behöver du bara publicera modellen till registret på arbetsytan.
Kommentar
Om modellen du distribuerar redan är registrerad kan du fortsätta till avsnittet Skapa beräkningskluster .
Registrera modellen genom att köra följande kommando:
MODEL_NAME='heart-classifier-mlflow'
az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
Skapa beräkningskluster
Du måste se till att batchdistributionerna kan köras på någon tillgänglig infrastruktur (beräkning). Batchdistributioner kan köras på valfri Mašinsko učenje beräkning som redan finns på arbetsytan. Flera batchdistributioner kan dela samma beräkningsinfrastruktur.
I den här artikeln arbetar du med ett Mašinsko učenje beräkningskluster med namnet cpu-cluster. I följande exempel verifieras att en beräkning finns på arbetsytan eller skapar en ny beräkning.
Skapa ett beräkningskluster:
az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
Skapa batchslutpunkt
För att skapa en slutpunkt behöver du ett namn och en beskrivning. Slutpunktsnamnet visas i den URI som är associerad med slutpunkten, så den måste vara unik i en Azure-region. Det kan till exempel bara finnas en batchslutpunkt med namnet mybatchendpoint
i regionen WestUS2.
Placera namnet på slutpunkten i en variabel för enkel referens senare:
Skapa slutpunkten:
Skapa en ny slutpunkt genom att skapa en
YAML
konfiguration som följande kod: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 slutpunkten med följande kommando:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Skapa batchdistribution
MLflow-modeller kräver inte att du anger en miljö eller ett bedömningsskript när du skapar distributionen. Miljön eller bedömningsskriptet skapas automatiskt. Du kan dock ange miljö- eller bedömningsskriptet om du vill anpassa hur distributionen härleds.
Skapa en ny distribution under den skapade slutpunkten genom att skapa en
YAML
konfiguration enligt följande kod. 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 distributionen med följande kommando:
az ml batch-deployment create --file deployment-simple/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
Viktigt!
timeout
Konfigurera värdet 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 timeout
värde. Tänk på att mini_batch_size
värdet anger antalet filer i en batch och inte antalet exempel. När du arbetar med tabelldata kan varje fil innehålla flera rader, vilket ökar den tid det tar för batchslutpunkten att bearbeta varje fil. I sådana fall kan du använda höga timeout
värden för att undvika timeout-fel.
Anropa slutpunkten
Även om du kan anropa en specifik distribution i en slutpunkt är det vanligt att anropa själva slutpunkten och låta slutpunkten bestämma vilken distribution som ska användas. Den här typen av distribution heter "standard"-distributionen. Med den här metoden kan du ändra standarddistributionen, vilket gör att du kan ä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:
DEPLOYMENT_NAME="classifier-xgboost-mlflow"
az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
Batchslutpunkten är nu redo att användas.
Testa distributionen
För att 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 Mašinsko učenje arbetsytan. I det här exemplet laddar du upp exemplet till ett Mašinsko učenje datalager. Du skapar en datatillgång som kan användas för att anropa slutpunkten för bedömning. Tänk på att batchslutpunkter accepterar data som kan placeras på olika platser.
Skapa först datatillgången. 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.
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
Skapa datatillgången:
az ml data create -f heart-dataset-unlabeled.yml
När du har laddat upp data anropar du slutpunkten.
Dricks
Observera att distributionsnamnet inte anges i åtgärden
invoke
i följande kommandon. Slutpunkten dirigerar automatiskt jobbet till standarddistributionen eftersom slutpunkten endast har en distribution. Du kan rikta in dig på en specifik distribution genom att ange argumentet/parameterndeployment_name
.Kör följande kommando:
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. Installationsinstruktioner finns i Ladda ned jq.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 filen predictions.csv , enligt beskrivningen i distributionskonfigurationen. Jobbet genererar utdata med namnet score, där den här filen placeras. Endast en fil genereras per batchjobb.
Filen är strukturerad på följande sätt:
En rad per datapunkt som skickas till modellen. För tabelldata innehåller filen predictions.csv en rad för varje rad som finns i varje bearbetad fil. För andra datatyper (bilder, ljud, text) finns det en rad per bearbetad fil.
Följande kolumner finns i filen (i angiven ordning):
row
(valfritt): Motsvarande radindex i indatafilen. Den här kolumnen gäller endast om indata är tabellbaserade. Förutsägelser returneras i samma ordning som de visas i indatafilen. 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, eftersom det tillhandahölls av modellenspredict().
funktion.file_name
: Namnet på filnamnet där data läss. I tabelldata använder du det här fältet för att avgöra vilken förutsägelse som tillhör varje 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 du har laddat ned filen kan du öppna filen med önskat redigeringsverktyg. I följande exempel läses förutsägelserna in med hjälp av en Pandas
dataram.
import pandas as pd
score = pd.read_csv(
"named-outputs/score/predictions.csv", names=["row", "prediction", "file"]
)
Utdata visar en tabell:
Rad | Förutsägelse | 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 innehåller tabelldata i CSV-format. Det finns fyra olika indatafiler: heart-unlabeled-0.csv, heart-unlabeled-1.csv, heart-unlabeled-2.csv och heart-unlabeled-3.csv.
Granska överväganden för batchinferens
Mašinsko učenje stöder distribution av MLflow-modeller till batchslutpunkter utan att ange ett bedömningsskript. Den här metoden är ett bekvämt sätt att distribuera modeller som kräver bearbetning av stora mängder data som liknar batchbearbetning. Mašinsko učenje använder information i MLflow-modellspecifikationen för att samordna slutsatsdragningsprocessen.
Utforska arbetsfördelningen för 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 partitionera dina data med hjälp av mappar, se till att platta ut strukturen innan du fortsätter.
Batchdistributioner anropar funktionen för predict
MLflow-modellen en gång per fil. För CSV-filer med flera rader kan den här åtgärden medföra ett minnestryck i den underliggande beräkningen. Beteendet 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å i modellbedömningsskriptet.
Granska stöd för filtyper
Följande datatyper stöds för batchinferens när du distribuerar MLflow-modeller utan miljö eller bedömningsskript. Om du vill bearbeta en annan filtyp eller köra slutsatsdragning på ett annat sätt kan du skapa distributionen genom att anpassa MLflow-modelldistributionen med ett bedömningsskript.
Filnamnstillägg | Typ som returneras som modellindata | 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 så att de matchar 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
Alla filer som inte stöds som kan finnas i indata gör att jobbet misslyckas. I sådana fall visas ett fel som liknar ERROR:azureml:Error processing input file: '/mnt/batch/tasks/.../a-given-file.avro'. Filtypen "avro" stöds inte.
Förstå signaturframtvingande för MLflow-modeller
Batchdistributionsjobb framtvingar indatatyperna vid läsning av data med hjälp av den tillgängliga MLflow-modellsignaturen. Därför uppfyller dina dataindata de typer som anges i modellsignaturen. Om data inte kan parsas som förväntat misslyckas jobbet med ett fel som liknar 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. De är ett bekvämt sätt för tidig identifiering av problem med datakompatibilitet. 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.
Granska smakstöd
Batchdistributioner stöder distribution av MLflow-modeller med endast en pyfunc
smak. Information om hur du distribuerar en annan smak finns i Anpassa modelldistribution med bedömningsskript.
Anpassa modelldistribution med 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 slutsatsdragningskörningen.
Du väljer vanligtvis det här arbetsflödet för följande scenarier:
- Processfiltyper som inte stöds av batchdistributioner av MLflow-distributioner.
- Anpassa hur modellen körs, till exempel genom att använda en specifik smak för att läsa in den
mlflow.<flavor>.load()
med funktionen. - Slutför för- eller efterbearbetningen i din bedömningsrutin när den inte har slutförts av själva modellen.
- Justera presentationen av en modell som inte är bra för tabelldata, till exempel ett tensordiagram som representerar en bild.
- Tillåt att modellen läser data i segment eftersom den inte kan bearbeta varje fil samtidigt på grund av minnesbegränsningar.
Viktigt!
Om du vill ange ett bedömningsskript för en MLflow-modelldistribution måste du ange den miljö där distributionen körs.
Använda bedömningsskriptet
Använd följande steg för att distribuera en MLflow-modell med ett anpassat bedömningsskript:
Identifiera mappen där MLflow-modellen finns.
I Azure Mašinsko učenje-portalen bläddrar du till Modeller.
Välj den modell som ska distribueras och välj sedan fliken Artefakter.
Anteckna den mapp som visas. Den här mappen angavs när modellen registrerades.
Skapa ett bedömningsskript. Observera hur det tidigare mappnamnet
model
ingår 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)
Skapa en miljö där bedömningsskriptet kan köras. Eftersom modellen i det här exemplet är MLflow anges även conda-kraven i modellpaketet. Mer information om MLflow-modeller och inkluderade filer finns i MLmodel-formatet.
I det här steget skapar du miljön med hjälp av conda-beroendena från filen. Du måste också inkludera
azureml-core
paketet, som krävs för Batch-distributioner.Dricks
Om din modell redan är registrerad i modellregistret kan du ladda ned och kopiera filen
conda.yml
som är associerad med din modell. Filen är tillgänglig i Azure Mašinsko učenje studio under Modeller>Välj din modell i listan>Artefakter. Välj filen i rotmappenconda.yml
och välj sedan 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 tillazureml-core
paketet. Du kan inte användaconda.yml
filen direkt från modellen.Konfigurera distributionen:
Skapa en ny distribution under den skapade slutpunkten genom att skapa en
YAML
konfiguration enligt följande kodfragment. 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
Skapa distributionen:
Batchslutpunkten är nu redo att användas.
Rensa resurser
När du har slutfört övningen tar du bort resurser som inte längre krävs.
Kör följande kod för att ta bort batchslutpunkten och alla underliggande distributioner:
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes
Det här kommandot tar inte bort batchbedömningsjobb.