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 mltillä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änd az 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:

  1. 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.

    MODEL_NAME='heart-classifier-mlflow'
    az ml model create --name $MODEL_NAME --type "mlflow_model" --path "model"
    
  2. 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.

    Skapa ett beräkningskluster på följande sätt:

    az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5
    
  3. 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 i westus2.

    I det här fallet placerar vi namnet på slutpunkten i en variabel så att vi enkelt kan referera till den senare.

    ENDPOINT_NAME="heart-classifier"
    
  4. 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
    
  5. 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 som mini_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.

  6. Ä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:

    DEPLOYMENT_NAME="classifier-xgboost-mlflow"
    az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME
    
  7. 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.

  1. 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
    
  2. 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.

  3. Ett batchjobb startas så snart kommandot returnerar. Du kan övervaka statusen för jobbet tills det har slutförts:

    az ml job show -n $JOB_NAME --web
    

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 modellens predict(). 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.

  1. 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.

    Skärmbild som visar mappen där modellartefakterna placeras.

  2. Skapa ett bedömningsskript. Observera att mappnamnet model som du identifierade tidigare har inkluderats i init() 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)
    
  3. 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 som conda.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 paketet azureml-core. Du kan inte använda conda.yml filen direkt från modellen.

    Miljödefinitionen tas med i själva distributionsdefinitionen som en anonym miljö. Du ser följande rader i distributionen:

    environment:
      name: batch-mlflow-xgboost
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    
  4. 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
    
  5. Nu ska vi skapa distributionen:

    az ml batch-deployment create --file deployment-custom/deployment.yml --endpoint-name $ENDPOINT_NAME
    
  6. 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

Nästa steg