Nasazení kanálu pro dávkové vyhodnocování pomocí předběžného zpracování

PLATÍ PRO:Rozšíření Azure CLI ml v2 (aktuální)Python SDK azure-ai-ml v2 (aktuální)

V tomto článku se dozvíte, jak nasadit inference (nebo scoring) pipeline v rámci dávkového koncového bodu. Kanál provádí vyhodnocení nad registrovaným modelem a zároveň opakovaně používá komponentu předběžného zpracování použitou během trénování modelu. Opětovné použití stejné součásti předběžného zpracování zajišťuje, že se během vyhodnocování použije stejné předběžné zpracování.

Naučíte se:

  • Vytvořte pipeline, který znovu použije existující komponenty z pracovního prostoru
  • Nasazení kanálu do koncového bodu
  • Využívání předpovědí vygenerovaných datovým tokem

O tomto příkladu

Tento příklad ukazuje, jak znovu použít předzpracování kódu a parametry získané během předběžného zpracování, než použijete model k odvozování. Opětovným použitím kódu předzpracování a naučených parametrů můžeme zajistit, aby se během odvozování použily stejné transformace (například normalizace a kódování funkcí), které byly použity na vstupní data během trénování. Model použitý k odvozování provede předpovědi na tabulkových datech ze sady dat UCI Heart Disease.

Zobrazení pipeline je následující:

Snímek obrazovky s potrubím inference zahrnujícím bodovací komponentu spolu s výstupy a přípravnou komponentou z tréninkového potrubí.

Příklad v tomto článku vychází z ukázek kódu obsažených v úložišti azureml-examples . Pokud chcete příkazy spustit místně, aniž byste museli kopírovat nebo vkládat YAML a další soubory, naklonujte úložiště pomocí následujících příkazů a přejděte do složky pro váš kódovací jazyk:

git clone https://github.com/Azure/azureml-examples --depth 1
cd azureml-examples/cli

Soubory pro tento příklad jsou v:

cd endpoints/batch/deploy-pipelines/batch-scoring-with-preprocessing

Sledování v poznámkových blocích Jupyter

Verzi sady Python SDK tohoto příkladu můžete prohlížet otevřením notebooku sdk-deploy-and-test.ipynb v naklonovaném úložišti.

Požadavky

  • Předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si bezplatný účet.

  • Pracovní prostor služby Azure Machine Learning. Pokud chcete vytvořit pracovní prostor, přečtěte si téma Správa pracovních prostorů Služby Azure Machine Learning.

  • Následující oprávnění v pracovním prostoru Azure Machine Learning:

    • Pro vytvoření nebo správu dávkových koncových bodů a nasazení použijte roli vlastníka, přispěvatele nebo vlastní roli, která má oprávnění Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.
    • Pro vytváření nasazení v Azure Resource Manageru ve skupině prostředků pracovního prostoru použijte roli Vlastník, Přispěvatel nebo Vlastní role, která má Microsoft.Resources/deployments/write oprávnění ve skupině prostředků, kde je pracovní prostor nasazený.
  • Azure Machine Learning CLI nebo sada Azure Machine Learning SDK pro Python:

    Spuštěním následujícího příkazu nainstalujte Azure CLI a mlrozšíření pro Azure Machine Learning:

    az extension add -n ml
    

    Nasazení komponent kanálu pro dávkové koncové body vyžadují rozšíření ml pro Azure CLI ve verzi 2.7 nebo novější (aktuální verze: 2.37.0). az extension update --name ml Pomocí příkazu získejte nejnovější verzi.


Připojení k pracovnímu prostoru

Pracovní prostor je prostředek nejvyšší úrovně pro Azure Machine Learning. Poskytuje centralizované místo pro práci se všemi artefakty, které vytvoříte při použití služby Azure Machine Learning. V této části se připojíte k pracovnímu prostoru, kde provádíte úkony související s nasazením.

V následujícím příkazu zadejte ID předplatného, název pracovního prostoru, název skupiny prostředků a umístění:

az account set --subscription <subscription>
az configure --defaults workspace=<workspace> group=<resource-group> location=<location>

Vytvoření kanálu odvozování

V této části vytvoříme všechny prostředky potřebné pro náš kanál odvozování. Začneme vytvořením prostředí, které zahrnuje potřebné knihovny pro komponenty kanálu. V dalším kroku vytvoříme výpočetní cluster, na kterém se bude dávkové nasazení spouštět. Potom zaregistrujeme komponenty, modely a transformace, které potřebujeme k vytvoření kanálu odvozování. Nakonec kanál sestavíme a otestujeme.

Vytvoření prostředí

Komponenty v tomto příkladu budou používat prostředí s knihovnami XGBoost a scikit-learn. Soubor environment/conda.yml obsahuje konfiguraci prostředí:

environment/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

Vytvořte prostředí následujícím způsobem:

  1. Definujte prostředí:

    prostředí/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. Vytvořte prostředí:

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

Vytvoření výpočetního clusteru

Koncové body a nasazení služby Batch běží na výpočetních clusterech. Můžou běžet na libovolném výpočetním clusteru Azure Machine Learning, který už v pracovním prostoru existuje. Proto může několik dávkových nasazení sdílet stejnou výpočetní infrastrukturu. V tomto příkladu budeme pracovat na výpočetním clusteru Azure Machine Learning s názvem batch-cluster. Ověřme, zda výpočetní zdroje existují v pracovním prostoru, nebo je jinak vytvoříme.

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

Registrace komponent a modelů

Zaregistrujeme komponenty, modely a transformace, které potřebujeme k vytvoření kanálu odvozování. Některé z těchto prostředků můžeme znovu použít pro tréninkové rutiny.

Návod

V tomto tutoriálu znovu použijeme model a komponentu předzpracování z dřívějšího trénovacího procesu. Podle příkladu Jak nasadit tréninkovou pipeline s batch endpointy můžete zjistit, jak byly vytvořeny.

  1. Zaregistrujte model, který se má použít k predikci:

    az ml model create --name heart-classifier --type mlflow_model --path model
    
  2. Registrovaný model nebyl vytrénován přímo na vstupní data. Místo toho byla vstupní data předzpracována (nebo transformována) před trénováním pomocí komponenty pro přípravu. Tuto komponentu budeme také muset zaregistrovat. Zaregistrujte součást přípravy:

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

    Návod

    Po registraci komponenty přípravy na ni teď můžete odkazovat z pracovního prostoru. Například azureml:uci_heart_prepare@latest získá poslední verzi přípravné komponenty.

  3. V rámci datových transformací v komponentě pro přípravu byla vstupní data normalizována, aby se prediktory zacentrovaly a jejich hodnoty byly omezeny na rozsah [-1, 1]. Parametry transformace byly zachyceny v transformaci scikit-learn, kterou můžeme zaregistrovat i později, když máme nová data. Následujícím způsobem zaregistrujte transformaci:

    az ml model create --name heart-classifier-transforms --type custom_model --path transformations
    
  4. Pro zaregistrovaný model provedeme odvozování pomocí jiné komponenty s názvem score , která vypočítá predikce pro daný model. Na komponentu budeme odkazovat přímo z její definice.

    Návod

    Osvědčeným postupem je zaregistrovat komponentu a odkazovat na ni z pipeline. V tomto příkladu ale budeme odkazovat přímo na komponentu z její definice, abychom zjistili, které komponenty se znovu používají z trénovacího kanálu a které z nich jsou nové.

Sestavení kanálu

Teď je čas svázat všechny prvky dohromady. Kanál odvozování, který nasadíme, má dvě komponenty (kroky):

  • preprocess_job: Tento krok přečte vstupní data a vrátí připravená data a použité transformace. Krok přijímá dva vstupy:
    • data: složka obsahující vstupní data pro určení skóre
    • transformations: (volitelné) Cesta k transformacím, které budou použity, pokud jsou k dispozici. Pokud je k dispozici, transformace se čtou z modelu, který je uveden v cestě. Pokud ale není zadána cesta, transformace se naučí ze vstupních dat. Pro odvozování ale nemůžete zjistit parametry transformace (v tomto příkladu normalizační koeficienty) ze vstupních dat, protože potřebujete použít stejné hodnoty parametrů, které jste se naučili během trénování. Vzhledem k tomu, že tento vstup je volitelný, lze komponentu preprocess_job použít během trénování a vyhodnocování.
  • score_job: Tento krok provede odvozování transformovaných dat pomocí vstupního modelu. Všimněte si, že komponenta používá k odvozování model MLflow. Nakonec se skóre zapisují ve stejném formátu jako přečtené.

Konfigurace kanálu je definována v souboru pipeline.yml:

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}}

Zobrazení pipeline je následující:

Snímek obrazovky s kanálem odvozování zobrazující dávkové bodování s předzpracováním

Otestování kanálu

Otestujme potrubí pomocí ukázkových dat. K tomu vytvoříme úlohu pomocí pipeline a výpočetního clusteru, které byly vytvořeny dříve batch-cluster.

Následující pipeline-job.yml soubor obsahuje konfiguraci pro pipeline úlohu:

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

Vytvořte testovací úlohu:

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

Vytvořte dávkový koncový bod

  1. Zadejte název koncového bodu. Název dávkového koncového bodu musí být v každé oblasti jedinečný, protože se tento název používá k vytvoření URI volání. Pokud chcete zajistit jedinečnost, připojte k názvu zadanému v následujícím kódu všechny koncové znaky.

    ENDPOINT_NAME="uci-classifier-score"
    
  2. Konfigurace koncového bodu:

    Soubor endpoint.yml obsahuje konfiguraci koncového bodu.

    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. Vytvořte koncový bod:

    az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
    
  4. Zadejte dotaz na identifikátor URI koncového bodu:

    az ml batch-endpoint show --name $ENDPOINT_NAME
    

Nasazení komponenty kanálu

Abychom mohli nasadit komponentu pipeline, musíme vytvořit dávkové nasazení. Nasazení je sada prostředků potřebných k hostování prostředku, který provádí skutečnou práci.

  1. Konfigurace nasazení

    Soubor deployment.yml obsahuje konfiguraci nasazení. Můžete zkontrolovat, jestli schéma YAML celého dávkového koncového bodu obsahuje další vlastnosti.

    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. Vytvořte nasazení

    Spuštěním následujícího kódu vytvořte dávkové nasazení v rámci koncového bodu dávky a nastavte ho jako výchozí nasazení.

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

    Návod

    Všimněte si použití příznaku --set-default k označení, že toto nové nasazení je teď výchozí.

  3. Vaše implementace je připraveno k použití.

Testujte nasazení

Jakmile se nasazení vytvoří, je připravené přijímat pracovní úlohy. K otestování postupujte takto:

  1. Naše nasazení vyžaduje, abychom označili jeden vstup dat a jeden textový vstup.

    Soubor inputs.yml obsahuje definici vstupního datového prostředku:

    inputs.yml

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

    Návod

    Další informace o tom, jak označit vstupy, najdete v tématu Vytváření úloh a vstupních dat pro dávkové koncové body.

  2. Výchozí nasazení můžete vyvolat následujícím způsobem:

    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
    
  3. Sledovat můžete průběh aplikace a streamovat protokoly pomocí:

    az ml job stream -n $JOB_NAME
    

Přístup k výstupu úlohy

Po dokončení úlohy můžeme získat přístup k jeho výstupu. Tato úloha obsahuje pouze jeden výstup s názvem scores:

Přidružené výsledky si můžete stáhnout pomocí az ml job download.

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

Přečtěte si ohodnocená 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

Výstup vypadá takto:

stáří Sex ... thal predikce
0.9338 1 ... 2 0
1.3782 1 ... 3 1
1.3782 1 ... 4 0
-1.954 1 ... 3 0

Výstup obsahuje předpovědi a data poskytnutá komponentě skóre , která byla předem zpracována. Například sloupec age byl normalizován a sloupec thal obsahuje původní kódovací hodnoty. V praxi pravděpodobně chcete pouze vyvést predikci a pak ji zřetězit s původními hodnotami. Tato práce byla ponechána čtenáři.

Uvolnění prostředků

Jakmile budete hotovi, odstraňte přidružené prostředky z pracovního prostoru:

Spuštěním následujícího kódu odstraňte koncový bod dávky a jeho základní nasazení. --yes slouží k potvrzení odstranění.

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

(Volitelné) Odstraňte výpočetní prostředky, pokud neplánujete znovu použít výpočetní cluster s pozdějším nasazením.

az ml compute delete -n batch-cluster

Další kroky