Udostępnij za pośrednictwem


Jak operacjonalizować potok trenowania przy użyciu punktów końcowych wsadowych

DOTYCZY: Rozszerzenie interfejsu wiersza polecenia platformy Azure w wersji 2 (current)Zestaw PYTHON SDK azure-ai-ml v2 (bieżąca)

W tym artykule dowiesz się, jak operacjonalizować potok trenowania w punkcie końcowym wsadowym. Potok używa wielu składników (lub kroków), które obejmują trenowanie modelu, wstępne przetwarzanie danych i ocenę modelu.

Dowiesz się, jak wykonywać następujące czynności:

  • Tworzenie i testowanie potoku trenowania
  • Wdrażanie potoku w punkcie końcowym wsadowym
  • Modyfikowanie potoku i tworzenie nowego wdrożenia w tym samym punkcie końcowym
  • Testowanie nowego wdrożenia i ustawianie go jako domyślnego wdrożenia

Informacje o tym przykładzie

W tym przykładzie wdrożono potok trenowania, który pobiera wejściowe dane szkoleniowe (oznaczone etykietą) i tworzy model predykcyjny wraz z wynikami oceny i przekształceniami zastosowanymi podczas wstępnego przetwarzania. Potok będzie używać danych tabelarycznych z zestawu danych choroby serca UCI do trenowania modelu XGBoost. Używamy składnika przetwarzania wstępnego danych do wstępnego przetwarzania danych przed wysłaniem ich do składnika trenowania w celu dopasowania i oceny modelu.

Wizualizacja potoku jest następująca:

Zrzut ekranu potoku przedstawiający składniki przetwarzania wstępnego i trenowania.

Przykład w tym artykule jest oparty na przykładach kodu zawartych w repozytorium azureml-examples . Aby uruchomić polecenia lokalnie bez konieczności kopiowania lub wklejania kodu YAML i innych plików, użyj następujących poleceń, aby sklonować repozytorium i przejść do folderu dla języka kodowania:

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

Pliki dla tego przykładu znajdują się w następujących elementach:

cd endpoints/batch/deploy-pipelines/training-with-components

Postępuj zgodnie z instrukcjami w notesach Jupyter

Następnie możesz skorzystać z wersji zestawu SDK języka Python w tym przykładzie, otwierając notes sdk-deploy-and-test.ipynb w sklonowanym repozytorium.

Wymagania wstępne

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.

  • Obszar roboczy usługi Azure Machine Learning. Aby utworzyć obszar roboczy, zobacz Zarządzanie obszarami roboczymi usługi Azure Machine Learning.

  • Następujące uprawnienia w obszarze roboczym usługi Azure Machine Learning:

    • Do tworzenia punktów końcowych i wdrożeń wsadowych lub zarządzania nimi: użyj roli właściciela, współautora lub niestandardowej, która została przypisana Microsoft.MachineLearningServices/workspaces/batchEndpoints/* do uprawnień.
    • Aby utworzyć wdrożenia usługi Azure Resource Manager w grupie zasobów obszaru roboczego: użyj roli właściciel, współautor lub niestandardowa, która została przypisana Microsoft.Resources/deployments/write do uprawnienia w grupie zasobów, w której wdrożono obszar roboczy.
  • Interfejs wiersza polecenia usługi Azure Machine Learning lub zestaw AZURE Machine Learning SDK dla języka Python:

    Uruchom następujące polecenie, aby zainstalować interfejs wiersza polecenia platformy Azure i ml rozszerzenie usługi Azure Machine Learning:

    az extension add -n ml
    

    Wdrożenia składników potoku dla punktów końcowych wsadowych są wprowadzane w wersji 2.7 ml rozszerzenia dla interfejsu wiersza polecenia platformy Azure. Użyj polecenia , az extension update --name ml aby pobrać najnowszą wersję.


Nawiązywanie połączenia z obszarem roboczym

Obszar roboczy to zasób najwyższego poziomu dla usługi Azure Machine Learning. Zapewnia scentralizowane miejsce do pracy ze wszystkimi artefaktami tworzonymi podczas korzystania z usługi Azure Machine Learning. W tej sekcji nawiąż połączenie z obszarem roboczym, w którym wykonujesz zadania wdrażania.

W poniższym poleceniu wprowadź identyfikator subskrypcji, nazwę obszaru roboczego, nazwę grupy zasobów i lokalizację:

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

Tworzenie składnika potoku trenowania

W tej sekcji utworzymy wszystkie zasoby wymagane dla potoku trenowania. Zaczniemy od utworzenia środowiska zawierającego niezbędne biblioteki do wytrenowania modelu. Następnie utworzymy klaster obliczeniowy, w którym zostanie uruchomione wdrożenie wsadowe, a na koniec zarejestrujemy dane wejściowe jako zasób danych.

Tworzenie środowiska

Składniki w tym przykładzie będą używać środowiska z bibliotekami XGBoost i scikit-learn . Plik environment/conda.yml zawiera konfigurację środowiska:

środowisko/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

Utwórz środowisko w następujący sposób:

  1. Zdefiniuj środowisko:

    środowisko/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. Utwórz środowisko:

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

Tworzenie klastra obliczeniowego

Punkty końcowe i wdrożenia usługi Batch są uruchamiane w klastrach obliczeniowych. Mogą one działać w dowolnym klastrze obliczeniowym usługi Azure Machine Learning, który już istnieje w obszarze roboczym. W związku z tym wiele wdrożeń wsadowych może współużytkować tę samą infrastrukturę obliczeniową. W tym przykładzie będziemy pracować nad klastrem obliczeniowym usługi Azure Machine Learning o nazwie batch-cluster. Sprawdźmy, czy środowisko obliczeniowe istnieje w obszarze roboczym lub utwórz je w inny sposób.

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

Rejestrowanie danych treningowych jako zasobu danych

Nasze dane szkoleniowe są reprezentowane w plikach CSV. Aby naśladować bardziej obciążenie na poziomie produkcyjnym, zarejestrujemy dane szkoleniowe w heart.csv pliku jako zasób danych w obszarze roboczym. Ten zasób danych będzie później wskazywany jako dane wejściowe do punktu końcowego.

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

Tworzenie potoku

Potok, który chcemy operacjonalizować, przyjmuje jedno dane wejściowe, dane szkoleniowe i generuje trzy dane wyjściowe: wytrenowany model, wyniki oceny i przekształcenia danych stosowane jako przetwarzanie wstępne. Potok składa się z dwóch składników:

  • preprocess_job: ten krok odczytuje dane wejściowe i zwraca przygotowane dane oraz zastosowane przekształcenia. Krok otrzymuje trzy dane wejściowe:
    • data: folder zawierający dane wejściowe do przekształcania i oceniania
    • transformations: (opcjonalnie) Ścieżka do przekształceń, które zostaną zastosowane, jeśli są dostępne. Jeśli ścieżka nie zostanie podana, przekształcenia zostaną poznane na podstawie danych wejściowych. transformations Ponieważ dane wejściowe są opcjonalne, preprocess_job składnik może być używany podczas trenowania i oceniania.
    • categorical_encoding: strategia kodowania funkcji kategorii (ordinal lub onehot).
  • train_job: Ten krok spowoduje wytrenowanie modelu XGBoost na podstawie przygotowanych danych i zwrócenie wyników oceny i wytrenowanego modelu. Krok otrzymuje trzy dane wejściowe:
    • data: wstępnie przetworzone dane.
    • target_column: kolumna, którą chcemy przewidzieć.
    • eval_size: wskazuje proporcję danych wejściowych używanych do oceny.

Konfiguracja potoku jest zdefiniowana deployment-ordinal/pipeline.yml w pliku:

wdrażanie porządkowe/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}}

Uwaga

pipeline.yml W pliku transformations brakuje preprocess_jobdanych wejściowych z pliku . W związku z tym skrypt nauczy się parametrów transformacji z danych wejściowych.

Wizualizacja potoku jest następująca:

Obraz potoku przedstawiający dane wejściowe zadania, składniki potoku i dane wyjściowe w każdym kroku potoku.

Testowanie potoku

Przetestujmy potok przy użyciu przykładowych danych. W tym celu utworzymy zadanie przy użyciu potoku i utworzonego wcześniej klastra obliczeniowego batch-cluster .

Następujący pipeline-job.yml plik zawiera konfigurację zadania potoku:

wdrażanie porządkowe/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

Utwórz zadanie testowe:

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

Tworzenie punktu końcowego wsadowego

  1. Podaj nazwę punktu końcowego. Nazwa punktu końcowego partii musi być unikatowa w każdym regionie, ponieważ nazwa jest używana do konstruowania identyfikatora URI wywołania. Aby zapewnić unikatowość, dołącz wszystkie końcowe znaki do nazwy określonej w poniższym kodzie.

    ENDPOINT_NAME="uci-classifier-train"
    
  2. Konfigurowanie punktu końcowego:

    Plik endpoint.yml zawiera konfigurację punktu końcowego.

    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. Utwórz punkt końcowy:

    az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
    
  4. Wykonaj zapytanie dotyczące identyfikatora URI punktu końcowego:

    az ml batch-endpoint show --name $ENDPOINT_NAME
    

Wdrażanie składnika potoku

Aby wdrożyć składnik potoku, musimy utworzyć wdrożenie wsadowe. Wdrożenie to zestaw zasobów wymaganych do hostowania zasobu, który wykonuje rzeczywistą pracę.

  1. Konfigurowanie wdrożenia:

    Plik deployment-ordinal/deployment.yml zawiera konfigurację wdrożenia. Możesz sprawdzić pełny schemat YAML punktu końcowego wsadowego pod kątem dodatkowych właściwości.

    wdrażanie porządkowe/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. Utwórz wdrożenie:

    Uruchom następujący kod, aby utworzyć wdrożenie wsadowe w punkcie końcowym wsadowym i ustawić je jako domyślne wdrożenie.

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

    Napiwek

    Zwróć uwagę na użycie flagi --set-default , aby wskazać, że to nowe wdrożenie jest teraz domyślne.

  3. Wdrożenie jest gotowe do użycia.

Testowanie wdrożenia

Po utworzeniu wdrożenia można przystąpić do odbierania zadań. Wykonaj następujące kroki, aby go przetestować:

  1. Nasze wdrożenie wymaga wskazania jednego danych wejściowych.

    Plik inputs.yml zawiera definicję zasobu danych wejściowych:

    inputs.yml

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

    Napiwek

    Aby dowiedzieć się więcej na temat wskazywania danych wejściowych, zobacz Tworzenie zadań i danych wejściowych dla punktów końcowych wsadowych.

  2. Wdrożenie domyślne można wywołać w następujący sposób:

    JOB_NAME=$(az ml batch-endpoint invoke -n $ENDPOINT_NAME --f inputs.yml --query name -o tsv)
    
  3. Możesz monitorować postęp wyświetlania i przesyłać strumieniowo dzienniki przy użyciu:

    az ml job stream -n $JOB_NAME
    

Warto wspomnieć, że tylko dane wejściowe potoku są publikowane jako dane wejściowe w punkcie końcowym wsadowym. Na przykład categorical_encoding jest to dane wejściowe kroku potoku, ale nie dane wejściowe w samym potoku. Ten fakt służy do kontrolowania danych wejściowych, które mają być widoczne dla klientów, oraz tych, które chcesz ukryć.

Uzyskiwanie dostępu do danych wyjściowych zadania

Po zakończeniu zadania możemy uzyskać dostęp do niektórych jego danych wyjściowych. Ten potok generuje następujące dane wyjściowe dla składników:

  • preprocess job: dane wyjściowe to transformations_output
  • train job: dane wyjściowe to model i evaluation_results

Skojarzone wyniki można pobrać przy użyciu:

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

Tworzenie nowego wdrożenia w punkcie końcowym

Punkty końcowe mogą hostować wiele wdrożeń jednocześnie, zachowując jednocześnie tylko jedno wdrożenie jako domyślne. W związku z tym można iterować na różnych modelach, wdrażać różne modele w punkcie końcowym i testować je, a na koniec przełączyć domyślne wdrożenie na wdrożenie modelu, które działa najlepiej.

Zmieńmy sposób wstępnego przetwarzania w potoku, aby sprawdzić, czy uzyskamy model, który działa lepiej.

Zmienianie parametru w składniku przetwarzania wstępnego potoku

Składnik przetwarzania wstępnego ma dane wejściowe o nazwie categorical_encoding, które mogą mieć wartości ordinal lub onehot. Te wartości odpowiadają dwóm różnym sposobom kodowania cech kategorii.

  • ordinal: Koduje wartości funkcji z wartościami liczbowymi (porządkowymi) z [1:n], gdzie n jest liczbą kategorii w funkcji. Kodowanie porządkowe oznacza, że istnieje naturalna kolejność rangi wśród kategorii funkcji.
  • onehot: Nie oznacza naturalnej uporządkowanej rangi relacji, ale wprowadza problem wymiarowości, jeśli liczba kategorii jest duża.

Domyślnie używaliśmy ordinal poprzednio. Teraz zmieńmy kodowanie podzielone na kategorie, aby używać onehot i zobaczyć, jak działa model.

Napiwek

Alternatywnie mogliśmy uwidocznić categorial_encoding dane wejściowe klientom jako dane wejściowe dla samego zadania potoku. Jednak wybraliśmy zmianę wartości parametru w kroku przetwarzania wstępnego, abyśmy mogli ukryć i kontrolować parametr wewnątrz wdrożenia i skorzystać z możliwości posiadania wielu wdrożeń w tym samym punkcie końcowym.

  1. Zmodyfikuj potok. Wygląda to następująco:

    Konfiguracja potoku jest zdefiniowana deployment-onehot/pipeline.yml w pliku:

    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. Konfigurowanie wdrożenia:

    Plik deployment-onehot/deployment.yml zawiera konfigurację wdrożenia. Możesz sprawdzić pełny schemat YAML punktu końcowego wsadowego pod kątem dodatkowych właściwości.

    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. Utwórz wdrożenie:

    Uruchom następujący kod, aby utworzyć wdrożenie wsadowe w punkcie końcowym wsadowym i ustawić je jako domyślne wdrożenie.

    az ml batch-deployment create --endpoint $ENDPOINT_NAME -f deployment-onehot/deployment.yml
    

    Wdrożenie jest gotowe do użycia.

  4. Wdrożenie jest gotowe do użycia.

Testowanie wdrożenia niezdefinicyjnego

Po utworzeniu wdrożenia można przystąpić do odbierania zadań. Możemy przetestować ją w taki sam sposób, jak wcześniej, ale teraz wywołamy określone wdrożenie:

  1. Wywołaj wdrożenie w następujący sposób, określając parametr wdrożenia w celu wyzwolenia określonego wdrożenia 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. Możesz monitorować postęp wyświetlania i przesyłać strumieniowo dzienniki przy użyciu:

    az ml job stream -n $JOB_NAME
    

Konfigurowanie nowego wdrożenia jako domyślnego

Gdy będziemy zadowoleni z wydajności nowego wdrożenia, możemy ustawić ten nowy jako domyślny:

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

Usuwanie starego wdrożenia

Po zakończeniu możesz usunąć stare wdrożenie, jeśli nie jest już potrzebne:

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

Czyszczenie zasobów

Po zakończeniu usuń skojarzone zasoby z obszaru roboczego:

Uruchom następujący kod, aby usunąć punkt końcowy wsadowy i jego bazowe wdrożenie. --yes służy do potwierdzania usunięcia.

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

(Opcjonalnie) Usuń zasoby obliczeniowe, chyba że planujesz ponownie użyć klastra obliczeniowego z późniejszymi wdrożeniami.

az ml compute delete -n batch-cluster

Następne kroki