Dela via


Så här distribuerar du en pipeline för att utföra batchbedömning med förbearbetning

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 en slutsatsdragningspipeline (eller bedömning) under en batchslutpunkt. Pipelinen utför bedömning över en registrerad modell samtidigt som en förbearbetningskomponent återanvänds från när modellen tränades. Om du återanvänder samma förbearbetningskomponent ser du till att samma förbearbetning tillämpas under bedömning.

Du lär dig att:

  • Skapa en pipeline som återanvänder befintliga komponenter från arbetsytan
  • Distribuera pipelinen till en slutpunkt
  • Använda förutsägelser som genereras av pipelinen

Om det här exemplet

Det här exemplet visar hur du återanvänder förbearbetningskod och de parametrar som du lärde dig under förbearbetningen innan du använder din modell för slutsatsdragning. Genom att återanvända förbearbetningskoden och inlärda parametrar kan vi se till att samma transformeringar (till exempel normalisering och funktionskodning) som tillämpades på indata under träningen också tillämpas under inferensen. Modellen som används för slutsatsdragning utför förutsägelser på tabelldata från datauppsättningen för UCI-hjärtsjukdomar.

En visualisering av pipelinen är följande:

En skärmbild av slutsatsdragningspipelinen som består av en bedömningskomponent tillsammans med utdata och förbered komponenten från en träningspipeline.

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-pipelines/batch-scoring-with-preprocessing

Följ med i Jupyter Notebooks

Du kan följa med i Python SDK-versionen av det här exemplet genom att öppna notebook-filen sdk-deploy-and-test.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. 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>

Skapa slutsatsdragningspipelinen

I det här avsnittet skapar vi alla tillgångar som krävs för vår slutsatsdragningspipeline. Vi börjar med att skapa en miljö som innehåller nödvändiga bibliotek för pipelinens komponenter. Nu ska vi skapa ett beräkningskluster där batchdistributionen ska köras. Efteråt registrerar vi de komponenter, modeller och transformeringar som vi behöver för att skapa vår slutsatsdragningspipeline. Slutligen ska vi skapa och testa pipelinen.

Skapa miljön

Komponenterna i det här exemplet använder en miljö med biblioteken XGBoost och scikit-learn . Filen environment/conda.yml innehåller miljöns konfiguration:

miljö/conda.yml

channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
  - mlflow
  - azureml-mlflow
  - datasets
  - jobtools
  - cloudpickle==1.6.0
  - dask==2023.2.0
  - scikit-learn==1.1.2
  - xgboost==1.3.3
name: mlflow-env

Skapa miljön på följande sätt:

  1. Definiera miljön:

    miljö/xgboost-sklearn-py38.yml

    $schema: https://azuremlschemas.azureedge.net/latest/environment.schema.json
    name: xgboost-sklearn-py38
    image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
    conda_file: conda.yml
    description: An environment for models built with XGBoost and Scikit-learn.
    
  2. Skapa miljön:

    az ml environment create -f environment/xgboost-sklearn-py38.yml
    

Skapa ett beräkningskluster

Batchslutpunkter och distributioner körs på beräkningskluster. De kan köras på valfritt Azure-Mašinsko učenje beräkningskluster som redan finns på arbetsytan. Därför kan flera batchdistributioner dela samma beräkningsinfrastruktur. I det här exemplet ska vi arbeta med ett Azure Mašinsko učenje beräkningskluster med namnet batch-cluster. Nu ska vi kontrollera att beräkningen finns på arbetsytan eller skapa den på annat sätt.

az ml compute create -n batch-cluster --type amlcompute --min-instances 0 --max-instances 5

Registrera komponenter och modeller

Vi ska registrera komponenter, modeller och transformeringar som vi behöver för att bygga vår slutsatsdragningspipeline. Vi kan återanvända några av dessa tillgångar för träningsrutiner.

Dricks

I den här självstudien återanvänder vi modellen och förbearbetningskomponenten från en tidigare träningspipeline. Du kan se hur de skapades genom att följa exemplet Så här distribuerar du en träningspipeline med batchslutpunkter.

  1. Registrera modellen som ska användas för förutsägelse:

    az ml model create --name heart-classifier --type mlflow_model --path model
    
  2. Den registrerade modellen tränades inte direkt på indata. I stället förbearbetades indata (eller transformerades) före träningen med hjälp av en förberedelsekomponent. Vi måste också registrera den här komponenten. Registrera förberedelsekomponenten:

    az ml component create -f components/prepare/prepare.yml
    

    Dricks

    När du har registrerat förberedelsekomponenten kan du nu referera till den från arbetsytan. Till exempel azureml:uci_heart_prepare@latest hämtar den sista versionen av förberedelsekomponenten.

  3. Som en del av datatransformeringarna i förberedelsekomponenten normaliserades indata för att centrera prediktorerna och begränsa deras värden i intervallet [-1, 1]. Transformeringsparametrarna hämtades i en scikit-learn-transformering som vi också kan registrera för att tillämpas senare när vi har nya data. Registrera omvandlingen på följande sätt:

    az ml model create --name heart-classifier-transforms --type custom_model --path transformations
    
  4. Vi ska utföra slutsatsdragning för den registrerade modellen med hjälp av en annan komponent med namnet score som beräknar förutsägelserna för en viss modell. Vi refererar till komponenten direkt från dess definition.

    Dricks

    Bästa praxis är att registrera komponenten och referera till den från pipelinen. I det här exemplet ska vi dock referera till komponenten direkt från dess definition för att hjälpa dig att se vilka komponenter som återanvänds från träningspipelinen och vilka som är nya.

Skapa pipelinen

Nu är det dags att binda samman alla element. Den slutsatsdragningspipeline som vi distribuerar har två komponenter (steg):

  • preprocess_job: Det här steget läser indata och returnerar förberedda data och tillämpade transformeringar. Steget tar emot två indata:
    • data: en mapp som innehåller de indata som ska poängsättas
    • transformations: (valfritt) Sökväg till de transformeringar som ska tillämpas, om det är tillgängligt. När de tillhandahålls läss transformeringarna från modellen som anges på sökvägen. Men om sökvägen inte tillhandahålls kommer transformeringarna att läras från indata. För slutsatsdragning kan du dock inte lära dig transformeringsparametrarna (i det här exemplet normaliseringskoefficienterna) från indata eftersom du behöver använda samma parametervärden som lärdes under träningen. Eftersom den här indatan är valfri kan komponenten preprocess_job användas under träning och bedömning.
  • score_job: Det här steget kommer att utföra slutsatsdragning på transformerade data med hjälp av indatamodellen. Observera att komponenten använder en MLflow-modell för att utföra slutsatsdragning. Slutligen skrivs poängen tillbaka i samma format som de lästes.

Pipelinekonfigurationen definieras i pipeline.yml filen:

pipeline.yml

$schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
type: pipeline

name: batch_scoring_uci_heart
display_name: Batch Scoring for UCI heart
description: This pipeline demonstrates how to make batch inference using a model from the Heart Disease Data Set problem, where pre and post processing is required as steps. The pre and post processing steps can be components reusable from the training pipeline.

inputs:
  input_data:
    type: uri_folder
  score_mode:
    type: string
    default: append

outputs: 
  scores:
    type: uri_folder
    mode: upload

jobs:
  preprocess_job:
    type: command
    component: azureml:uci_heart_prepare@latest
    inputs:
      data: ${{parent.inputs.input_data}}
      transformations: 
        path: azureml:heart-classifier-transforms@latest
        type: custom_model
    outputs:
      prepared_data:
  
  score_job:
    type: command
    component: components/score/score.yml
    inputs:
      data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
      model:
        path: azureml:heart-classifier@latest
        type: mlflow_model
      score_mode: ${{parent.inputs.score_mode}}
    outputs:
      scores: 
        mode: upload
        path: ${{parent.outputs.scores}}

En visualisering av pipelinen är följande:

En skärmbild av slutsatsdragningspipelinen som visar batchbedömning med förbearbetning.

Testa pipelinen

Nu ska vi testa pipelinen med några exempeldata. För att göra det skapar vi ett jobb med hjälp av pipelinen och batch-cluster beräkningsklustret som skapades tidigare.

Följande pipeline-job.yml fil innehåller konfigurationen för pipelinejobbet:

pipeline-job.yml

$schema: https://azuremlschemas.azureedge.net/latest/pipelineJob.schema.json
type: pipeline

display_name: uci-classifier-score-job
description: |-
  This pipeline demonstrate how to make batch inference using a model from the Heart \
  Disease Data Set problem, where pre and post processing is required as steps. The \
  pre and post processing steps can be components reused from the training pipeline.

compute: batch-cluster
component: pipeline.yml
inputs:
  input_data:
    type: uri_folder
  score_mode: append
outputs: 
  scores:
    mode: upload

Skapa testjobbet:

az ml job create -f pipeline-job.yml --set inputs.input_data.path=data/unlabeled

Skapa en batchslutpunkt

  1. Ange ett namn för slutpunkten. Namnet på en batchslutpunkt måste vara unikt i varje region eftersom namnet används för att konstruera anrops-URI:n. För att säkerställa unikhet lägger du till eventuella avslutande tecken i det namn som anges i följande kod.

    ENDPOINT_NAME="uci-classifier-score"
    
  2. Konfigurera slutpunkten:

    Filen endpoint.yml innehåller slutpunktens konfiguration.

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: uci-classifier-score
    description: Batch scoring endpoint of the Heart Disease Data Set prediction task.
    auth_mode: aad_token
    
  3. Skapa slutpunkten:

    az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
    
  4. Fråga slutpunkts-URI:n:

    az ml batch-endpoint show --name $ENDPOINT_NAME
    

Distribuera pipelinekomponenten

För att distribuera pipelinekomponenten måste vi skapa en batchdistribution. En distribution är en uppsättning resurser som krävs för att vara värd för den tillgång som utför det faktiska arbetet.

  1. Konfigurera distributionen

    Filen deployment.yml innehåller distributionens konfiguration. Du kan kontrollera YAML-schemat för den fullständiga batchslutpunkten för extra egenskaper.

    deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json
    name: uci-classifier-prepros-xgb
    endpoint_name: uci-classifier-batch
    type: pipeline
    component: pipeline.yml
    settings:
        continue_on_step_failure: false
        default_compute: batch-cluster
    
  2. Skapa distributionen

    Kör följande kod för att skapa en batchdistribution under batchslutpunkten och ange den som standarddistribution.

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment.yml --set-default
    

    Dricks

    Observera att flaggan används --set-default för att ange att den nya distributionen nu är standard.

  3. Distributionen är klar för användning.

Testa distributionen

När distributionen har skapats är den redo att ta emot jobb. Följ dessa steg för att testa det:

  1. Distributionen kräver att vi anger en datainmatning och en literalinmatning.

    Filen inputs.yml innehåller definitionen för indatatillgången:

    inputs.yml

    inputs:
      input_data:
        type: uri_folder
        path: data/unlabeled
      score_mode:
        type: string
        default: append
    outputs:
      scores:
        type: uri_folder
        mode: upload
    

    Dricks

    Mer information om hur du anger indata finns i Skapa jobb och indata för batchslutpunkter.

  2. Du kan anropa standarddistributionen på följande sätt:

    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
    
  3. Du kan övervaka förloppet för showen och strömma loggarna med hjälp av:

    az ml job stream -n $JOB_NAME
    

Få åtkomst till jobbutdata

När jobbet har slutförts kan vi komma åt dess utdata. Det här jobbet innehåller bara ett utdata med namnet scores:

Du kan ladda ned de associerade resultaten med hjälp av az ml job download.

az ml job download --name $JOB_NAME --output-name scores

Läs poängsatta data:

import pandas as pd
import glob

output_files = glob.glob("named-outputs/scores/*.csv")
score = pd.concat((pd.read_csv(f) for f in output_files))
score

Utdata ser ut så här:

ålder Sex ... thal prognos
0.9338 1 ... 2 0
1.3782 1 ... 3 1
1.3782 1 ... 4 0
-1.954 1 ... 3 0

Utdata innehåller förutsägelserna plus de data som angavs för poängkomponenten , som var förbearbetad. Kolumnen age har till exempel normaliserats och kolumnen thal innehåller ursprungliga kodningsvärden. I praktiken vill du förmodligen bara mata ut förutsägelsen och sedan sammanfoga den med de ursprungliga värdena. Det här arbetet har lämnats till läsaren.

Rensa resurser

När du är klar tar du bort de associerade resurserna från arbetsytan:

Kör följande kod för att ta bort batchslutpunkten och dess underliggande distribution. --yes används för att bekräfta borttagningen.

az ml batch-endpoint delete -n $ENDPOINT_NAME --yes

(Valfritt) Ta bort beräkning, såvida du inte planerar att återanvända beräkningsklustret med senare distributioner.

az ml compute delete -n batch-cluster

Nästa steg