Så här operationaliserar du en träningspipeline med batchslutpunkter

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 operationaliserar en träningspipeline under en batchslutpunkt. Pipelinen använder flera komponenter (eller steg) som omfattar modellträning, förbearbetning av data och modellutvärdering.

Du lär dig att:

  • Skapa och testa en träningspipeline
  • Distribuera pipelinen till en batchslutpunkt
  • Ändra pipelinen och skapa en ny distribution i samma slutpunkt
  • Testa den nya distributionen och ange den som standarddistribution

Om det här exemplet

Det här exemplet distribuerar en träningspipeline som tar indataträningsdata (märkta) och skapar en förutsägelsemodell, tillsammans med utvärderingsresultaten och de omvandlingar som tillämpas under förbearbetningen. Pipelinen använder tabelldata från UCI Heart Disease Data Set för att träna en XGBoost-modell. Vi använder en dataförbearbetningskomponent för att förbearbeta data innan de skickas till träningskomponenten för att anpassa och utvärdera modellen.

En visualisering av pipelinen är följande:

En skärmbild av pipelinen som visar komponenterna för förbearbetning och träning.

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/training-with-components

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 träningspipelinekomponenten

I det här avsnittet skapar vi alla tillgångar som krävs för vår träningspipeline. Vi börjar med att skapa en miljö som innehåller nödvändiga bibliotek för att träna modellen. Sedan skapar vi ett beräkningskluster som batchdistributionen ska köras på, och slutligen registrerar vi indata som en datatillgång.

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
  - pandas==1.4
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 träningsdata som en datatillgång

Våra träningsdata representeras i CSV-filer. För att efterlikna en mer arbetsbelastning på produktionsnivå ska vi registrera träningsdata i heart.csv filen som en datatillgång på arbetsytan. Den här datatillgången visas senare som indata till slutpunkten.

az ml data create --name heart-classifier-train --type uri_folder --path data/train

Skapa pipelinen

Pipelinen som vi vill operationalisera tar en indata, träningsdata och genererar tre utdata: den tränade modellen, utvärderingsresultaten och de datatransformeringar som tillämpas som förbearbetning. Pipelinen består av två komponenter:

  • preprocess_job: Det här steget läser indata och returnerar förberedda data och tillämpade transformeringar. Steget tar emot tre indata:
    • data: en mapp som innehåller indata för att transformera och poängsätta
    • transformations: (valfritt) Sökväg till de transformeringar som ska tillämpas, om det är tillgängligt. Om sökvägen inte tillhandahålls kommer omvandlingarna att läras från indata. Eftersom indata transformations är valfria kan komponenten preprocess_job användas under träning och bedömning.
    • categorical_encoding: kodningsstrategin för kategoriska funktioner (ordinal eller onehot).
  • train_job: Det här steget tränar en XGBoost-modell baserat på förberedda data och returnerar utvärderingsresultaten och den tränade modellen. Steget tar emot tre indata:
    • data: förbearbetade data.
    • target_column: den kolumn som vi vill förutsäga.
    • eval_size: anger andelen indata som används för utvärdering.

Pipelinekonfigurationen definieras i deployment-ordinal/pipeline.yml filen:

deployment-ordinal/pipeline.yml

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

name: uci-heart-train-pipeline
display_name: uci-heart-train
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.

inputs:
  input_data:
    type: uri_folder

outputs: 
  model:
    type: mlflow_model
    mode: upload
  evaluation_results:
    type: uri_folder
    mode: upload
  prepare_transformations:
    type: uri_folder
    mode: upload

jobs:
  preprocess_job:
    type: command
    component: ../components/prepare/prepare.yml
    inputs:
      data: ${{parent.inputs.input_data}}
      categorical_encoding: ordinal
    outputs:
      prepared_data:
      transformations_output: ${{parent.outputs.prepare_transformations}}
  
  train_job:
    type: command
    component: ../components/train_xgb/train_xgb.yml
    inputs:
      data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
      target_column: target
      register_best_model: false
      eval_size: 0.3
    outputs:
      model: 
        mode: upload
        type: mlflow_model
        path: ${{parent.outputs.model}}
      evaluation_results:
        mode: upload
        type: uri_folder
        path: ${{parent.outputs.evaluation_results}}

Kommentar

pipeline.yml I filen transformations saknas indata från preprocess_job. Därför lär sig skriptet transformeringsparametrarna från indata.

En visualisering av pipelinen är följande:

En bild av pipelinen som visar jobbindata, pipelinekomponenter och utdata i varje steg i pipelinen.

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:

deployment-ordinal/pipeline-job.yml

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

experiment_name: uci-heart-train-pipeline
display_name: uci-heart-train-job
description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.

compute: batch-cluster
component: pipeline.yml
inputs:
  input_data:
    type: uri_folder
outputs: 
  model:
    type: mlflow_model
    mode: upload
  evaluation_results:
    type: uri_folder
    mode: upload
  prepare_transformations:
    mode: upload

Skapa testjobbet:

az ml job create -f deployment-ordinal/pipeline-job.yml --set inputs.input_data.path=azureml:heart-classifier-train@latest

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-train"
    
  2. Konfigurera slutpunkten:

    Filen endpoint.yml innehåller slutpunktens konfiguration.

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: uci-classifier-train
    description: An endpoint to perform training 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-ordinal/deployment.yml innehåller distributionens konfiguration. Du kan kontrollera YAML-schemat för den fullständiga batchslutpunkten för extra egenskaper.

    deployment-ordinal/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json
    name: uci-classifier-train-xgb
    description: A sample deployment that trains an XGBoost model for the UCI dataset.
    endpoint_name: uci-classifier-train
    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-ordinal/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. Vår distribution kräver att vi anger en datainmatning.

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

    inputs.yml

    inputs:
      input_data:
        type: uri_folder
        path: azureml:heart-classifier-train@latest
    

    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
    

Det är värt att nämna att endast pipelinens indata publiceras som indata i batchslutpunkten. Till exempel categorical_encoding är en indata för ett steg i pipelinen, men inte en indata i själva pipelinen. Använd det här faktumet för att styra vilka indata som du vill exponera för dina klienter och vilka som du vill dölja.

Få åtkomst till jobbutdata

När jobbet har slutförts kan vi komma åt några av dess utdata. Den här pipelinen genererar följande utdata för komponenterna:

  • preprocess job: utdata är transformations_output
  • train job: utdata är model och evaluation_results

Du kan ladda ned de associerade resultaten med hjälp av:

az ml job download --name $JOB_NAME --output-name transformations
az ml job download --name $JOB_NAME --output-name model
az ml job download --name $JOB_NAME --output-name evaluation_results

Skapa en ny distribution i slutpunkten

Slutpunkter kan vara värdar för flera distributioner samtidigt, samtidigt som endast en distribution hålls som standard. Därför kan du iterera över dina olika modeller, distribuera de olika modellerna till slutpunkten och testa dem och slutligen växla standarddistributionen till den modelldistribution som passar dig bäst.

Nu ska vi ändra hur förbearbetningen görs i pipelinen för att se om vi får en modell som presterar bättre.

Ändra en parameter i pipelinens förbearbetningskomponent

Förbearbetningskomponenten har en indata som heter categorical_encoding, som kan ha värden ordinal eller onehot. Dessa värden motsvarar två olika sätt att koda kategoriska funktioner.

  • ordinal: Kodar funktionsvärdena med numeriska värden (ordningstal) från [1:n], där n är antalet kategorier i funktionen. Ordningsföljdskodning innebär att det finns en naturlig rangordning bland funktionskategorierna.
  • onehot: Innebär inte en naturlig rangordningsordning, men introducerar ett dimensionsproblem om antalet kategorier är stort.

Som standard använde ordinal vi tidigare. Nu ska vi ändra den kategoriska kodningen så att den används onehot och se hur modellen fungerar.

Dricks

Alternativt kan vi ha exponerat categorial_encoding indata för klienter som indata för själva pipelinejobbet. Vi valde dock att ändra parametervärdet i förbearbetningssteget så att vi kan dölja och kontrollera parametern i distributionen och dra nytta av möjligheten att ha flera distributioner under samma slutpunkt.

  1. Ändra pipelinen. Det ser ut så här:

    Pipelinekonfigurationen definieras i deployment-onehot/pipeline.yml filen:

    deployment-onehot/pipeline.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponent.schema.json
    type: pipeline
    
    name: uci-heart-train-pipeline
    display_name: uci-heart-train
    description: This pipeline demonstrates how to train a machine learning classifier over the UCI heart dataset.
    
    inputs:
      input_data:
        type: uri_folder
    
    outputs: 
      model:
        type: mlflow_model
        mode: upload
      evaluation_results:
        type: uri_folder
        mode: upload
      prepare_transformations:
        type: uri_folder
        mode: upload
    
    jobs:
      preprocess_job:
        type: command
        component: ../components/prepare/prepare.yml
        inputs:
          data: ${{parent.inputs.input_data}}
          categorical_encoding: onehot
        outputs:
          prepared_data:
          transformations_output: ${{parent.outputs.prepare_transformations}}
      
      train_job:
        type: command
        component: ../components/train_xgb/train_xgb.yml
        inputs:
          data: ${{parent.jobs.preprocess_job.outputs.prepared_data}}
          target_column: target
          eval_size: 0.3
        outputs:
          model: 
            type: mlflow_model
            path: ${{parent.outputs.model}}
          evaluation_results:
            type: uri_folder
            path: ${{parent.outputs.evaluation_results}}
    
  2. Konfigurera distributionen:

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

    deployment-onehot/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/pipelineComponentBatchDeployment.schema.json
    name: uci-classifier-train-onehot
    description: A sample deployment that trains an XGBoost model for the UCI dataset using onehot encoding for variables.
    endpoint_name: uci-classifier-train
    type: pipeline
    component: pipeline.yml
    settings:
        continue_on_step_failure: false
        default_compute: batch-cluster
    
  3. 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-onehot/deployment.yml
    

    Distributionen är klar för användning.

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

Testa en nondefault-distribution

När distributionen har skapats är den redo att ta emot jobb. Vi kan testa det på samma sätt som tidigare, men nu anropar vi en specifik distribution:

  1. Anropa distributionen på följande sätt och ange distributionsparametern för att utlösa den specifika distributionen uci-classifier-train-onehot:

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

    az ml job stream -n $JOB_NAME
    

Konfigurera den nya distributionen som standard

När vi är nöjda med den nya distributionens prestanda kan vi ange den här nya som standard:

az ml batch-endpoint update --name $ENDPOINT_NAME --set defaults.deployment_name=$DEPLOYMENT_NAME

Ta bort den gamla distributionen

När du är klar kan du ta bort den gamla distributionen om du inte behöver den längre:

az ml batch-deployment delete --name uci-classifier-train-xgb --endpoint-name $ENDPOINT_NAME --yes

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