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

  1. Placera namnet på slutpunkten i en variabel för enkel referens senare:

    Kör följande kommando:

    ENDPOINT_NAME="heart-classifier"
    
  2. Skapa slutpunkten:

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

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

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

    1. 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
      
    2. Skapa datatillgången:

      az ml data create -f heart-dataset-unlabeled.yml
      
  2. 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/parametern deployment_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.

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

    Kör följande kommando:

    az ml job show -n $JOB_NAME --web
    

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

  1. Identifiera mappen där MLflow-modellen finns.

    1. I Azure Mašinsko učenje-portalen bläddrar du till Modeller.

    2. Välj den modell som ska distribueras och välj sedan fliken Artefakter.

    3. Anteckna den mapp 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 hur det tidigare mappnamnet model ingår 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. 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 rotmappen conda.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 till azureml-core paketet. Du kan inte använda conda.yml filen direkt från modellen.

    Miljödefinitionen ingår 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:

    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
    
  5. Skapa distributionen:

    Kör följande kod:

    az ml batch-deployment create --file deployment-custom/deployment.yml --endpoint-name $ENDPOINT_NAME
    

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.