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:
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.
- 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
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:
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.
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 ocenianiatransformations
: (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
lubonehot
).
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_job
danych 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:
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
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"
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
Utwórz punkt końcowy:
az ml batch-endpoint create --name $ENDPOINT_NAME -f endpoint.yml
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ę.
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
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.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ć:
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.
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)
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 totransformations_output
train job
: dane wyjściowe tomodel
ievaluation_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]
, gdzien
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.
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}}
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
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.
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:
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)
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