Zprovoznění trénovacího kanálu pomocí dávkových koncových bodů

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 zprovoznit trénovací kanál v rámci dávkového koncového bodu. Kanál používá více komponent (nebo kroků), které zahrnují trénování modelu, předběžné zpracování dat a vyhodnocení modelu.

Naučíte se:

  • Vytvoření a otestování trénovacího kanálu
  • Nasazení kanálu do dávkového koncového bodu
  • Úprava kanálu a vytvoření nového nasazení ve stejném koncovém bodu
  • Otestujte nové nasazení a nastavte ho jako výchozí nasazení.

O tomto příkladu

Tento příklad nasadí trénovací kanál, který přijímá vstupní trénovací data (označená) a vytvoří prediktivní model spolu s výsledky vyhodnocení a transformacemi použitými během předběžného zpracování. Kanál použije tabulková data ze sady dat UCI Heart Disease Data Set k trénování modelu XGBoost. Komponentu předběžného zpracování dat používáme k předběžnému zpracování dat před odesláním do trénovací komponenty, aby se přizpůsobila a vyhodnotila model.

Vizualizace kanálu je následující:

Snímek obrazovky kanálu znázorňující předzpracování a trénovací komponenty

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, nejprve naklonujte úložiště a pak změňte adresáře do složky:

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

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

Verzi sady Python SDK tohoto příkladu můžete sledovat otevřením poznámkového bloku sdk-deploy-and-test.ipynb v naklonovaném úložišti.

Požadavky

Než budete postupovat podle kroků v tomto článku, ujistěte se, že máte následující požadavky:

  • Předplatné Azure. Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet. Vyzkoušejte bezplatnou nebo placenou verzi služby Azure Machine Učení.

  • Pracovní prostor služby Azure Machine Learning. Pokud ho nemáte, vytvořte ho pomocí kroků v článku Správa Učení pracovních prostorů Azure.

  • Ujistěte se, že máte v pracovním prostoru následující oprávnění:

    • Vytváření nebo správa dávkových koncových bodů a nasazení: Použijte roli Vlastník, Přispěvatel nebo Vlastní, která umožňuje Microsoft.MachineLearningServices/workspaces/batchEndpoints/*.

    • Vytvořte nasazení ARM ve skupině prostředků pracovního prostoru: Použijte roli Vlastník, Přispěvatel nebo Vlastní, která umožňuje Microsoft.Resources/deployments/write ve skupině prostředků, ve které je pracovní prostor nasazený.

  • Abyste mohli pracovat se službou Azure Machine Učení, musíte nainstalovat následující software:

    Azure CLI a mlrozšíření pro azure machine Učení.

    az extension add -n ml
    

    Poznámka:

    Nasazení součástí kanálu pro koncové body služby Batch byla zavedena ve verzi 2.7 ml rozšíření pro Azure CLI. Slouží az extension update --name ml k získání poslední verze.

Připojení k pracovnímu prostoru

Pracovní prostor je prostředek nejvyšší úrovně pro Azure Machine Learning, který nabízí centralizované místo, kde můžete pracovat se všemi artefakty, které vytvoříte při použití služby Azure Machine Learning. V této části se připojíme k pracovnímu prostoru, ve kterém budete provádět úlohy nasazení.

Hodnoty ID předplatného, pracovního prostoru, umístění a skupiny prostředků předejte v následujícím kódu:

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

Vytvoření komponenty trénovacího kanálu

V této části vytvoříme všechny prostředky potřebné pro náš trénovací kanál. Začneme vytvořením prostředí, které zahrnuje potřebné knihovny pro trénování modelu. Pak vytvoříme výpočetní cluster, na kterém se bude dávkové nasazení spouštět, a nakonec zaregistrujeme vstupní data jako datový prostředek.

Vytvoření prostředí

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

prostředí/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

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 jakémkoli počítači Azure Učení výpočetním clusteru, 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 Učení s názvem batch-cluster. Pojďme ověřit, jestli výpočetní prostředky v pracovním prostoru existují, nebo je vytvořit jinak.

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

Registrace trénovacích dat jako datového prostředku

Naše trénovací data jsou reprezentována v souborech CSV. Abychom napodobovali více úloh na produkční úrovni, zaregistrujeme trénovací data v heart.csv souboru jako datový prostředek v pracovním prostoru. Tento datový asset se později označí jako vstup do koncového bodu.

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

Vytvoření kanálu

Kanál, který chceme zprovoznit, přijímá jeden vstup, trénovací data a vytváří tři výstupy: trénovaný model, výsledky vyhodnocení a transformace dat použité jako předběžné zpracování. Kanál se skládá ze dvou komponent:

  • preprocess_job: Tento krok přečte vstupní data a vrátí připravená data a použité transformace. Krok přijímá tři vstupy:
    • data: složka obsahující vstupní data pro transformaci a skóre
    • transformations: (volitelné) Cesta k transformacím, které budou použity, pokud jsou k dispozici. Pokud cesta není zadaná, transformace se z vstupních dat naučí. Vzhledem k tomu, že transformations vstup je volitelný, lze komponentu preprocess_job použít během trénování a vyhodnocování.
    • categorical_encoding: strategie kódování pro kategorické funkce (ordinal nebo onehot).
  • train_job: Tento krok vytrénuje model XGBoost na základě připravených dat a vrátí výsledky vyhodnocení a natrénovaný model. Krok přijímá tři vstupy:
    • data: předzpracovaná data.
    • target_column: sloupec, který chceme předpovědět.
    • eval_size: určuje podíl vstupních dat použitých k vyhodnocení.

Konfigurace kanálu je definována deployment-ordinal/pipeline.yml v souboru:

řadový/pipeline.yml nasazení

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

Poznámka:

pipeline.yml V souboru transformations chybí preprocess_jobvstup , a proto skript naučí transformační parametry ze vstupních dat.

Vizualizace kanálu je následující:

Obrázek kanálu znázorňující vstup úlohy, součásti kanálu a výstupy v každém kroku kanálu

Otestování kanálu

Pojďme kanál otestovat pomocí ukázkových dat. K tomu vytvoříme úlohu pomocí kanálu a výpočetního clusteru vytvořeného batch-cluster dříve.

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

pořadí nasazení/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

Vytvořte testovací úlohu:

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

Vytvoření dávkového koncového bodu

  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í identifikátoru URI vyvolá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-train"
    
  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-train
    description: An endpoint to perform training 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 kanálu, 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-ordinal/deployment.yml obsahuje konfiguraci nasazení. Můžete zkontrolovat, jestli schéma YAML celého dávkového koncového bodu obsahuje další vlastnosti.

    řadový/deployment.yml nasazení

    $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. 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-ordinal/deployment.yml --set-default
    

    Tip

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

  3. Vaše nasazení je připravené k použití.

Otestování nasazení

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

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

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

    inputs.yml

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

    Tip

    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. Průběh zobrazení a streamování protokolů můžete sledovat pomocí:

    az ml job stream -n $JOB_NAME
    

Stojí za zmínku, že se v koncovém bodu dávky publikují jenom vstupy kanálu jako vstupy. Je to například categorical_encoding vstup kroku kanálu, ale ne vstup v samotném kanálu. Pomocí této skutečnosti můžete řídit, které vstupy chcete zpřístupnit klientům a které z nich chcete skrýt.

Přístup k výstupům úlohy

Po dokončení úlohy můžeme získat přístup k některým jeho výstupům. Tento kanál vytvoří pro své komponenty následující výstupy:

  • preprocess job: výstup je transformations_output
  • train job: výstupy jsou model a evaluation_results

Přidružené výsledky si můžete stáhnout pomocí:

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

Vytvoření nového nasazení v koncovém bodu

Koncové body můžou hostovat více nasazení najednou a současně ponechat jako výchozí jenom jedno nasazení. Proto můžete iterovat různé modely, nasadit různé modely do koncového bodu a otestovat je a nakonec přepnout výchozí nasazení na nasazení modelu, které je pro vás nejvhodnější.

Pojďme změnit způsob provádění předběžného zpracování v kanálu, abychom zjistili, jestli získáme model, který funguje lépe.

Změna parametru v komponentě předběžného zpracování kanálu

Komponenta předběžného zpracování má vstupní název categorical_encoding, který může mít hodnoty ordinal nebo onehot. Tyto hodnoty odpovídají dvěma různým způsobům kódování kategorických funkcí.

  • ordinal: Zakóduje hodnoty funkcí pomocí číselných hodnot (řadových) z [1:n], kde n je počet kategorií ve funkci. Pořadové kódování znamená, že mezi kategoriemi funkcí je přirozené pořadí.
  • onehot: Neznamená přirozený vztah seřazený podle pořadí, ale představuje problém s dimenzionalitou, pokud je počet kategorií velký.

Ve výchozím nastavení jsme použili ordinal dříve. Teď změníme kategorické kódování tak, aby se používalo onehot , a podívejme se, jak model funguje.

Tip

Případně bychom mohli zpřístupnit categorial_encoding vstup klientům jako vstup pro samotnou úlohu kanálu. Rozhodli jsme se ale změnit hodnotu parametru v kroku předběžného zpracování, abychom mohli skrýt a řídit parametr uvnitř nasazení a využít možnost mít více nasazení ve stejném koncovém bodu.

  1. Upravte kanál. Vypadá takto:

    Konfigurace kanálu je definována deployment-onehot/pipeline.yml v souboru:

    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. Konfigurace nasazení:

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

    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. 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-onehot/deployment.yml
    

    Vaše nasazení je připravené k použití.

  4. Vaše nasazení je připravené k použití.

Testování nedefaultních nasazení

Jakmile se nasazení vytvoří, je připravené přijímat úlohy. Můžeme ho otestovat stejným způsobem jako předtím, ale teď vyvoláme konkrétní nasazení:

  1. Následujícím způsobem spusťte nasazení zadáním parametru nasazení, který aktivuje konkrétní nasazení 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. Průběh zobrazení a streamování protokolů můžete sledovat pomocí:

    az ml job stream -n $JOB_NAME
    

Nakonfigurujte nové nasazení jako výchozí.

Jakmile budeme spokojeni s výkonem nového nasazení, můžeme tuto novou nastavit jako výchozí:

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

Odstranění starého nasazení

Jakmile budete hotovi, můžete staré nasazení odstranit, pokud už ho nepotřebujete:

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

Vyčiště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