Jak wdrożyć potok w celu przeprowadzania oceniania wsadowego przy użyciu przetwarzania wstępnego
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 wdrożyć potok wnioskowania (lub oceniania) w punkcie końcowym wsadowym. Potok wykonuje ocenianie zarejestrowanego modelu, a także ponowne używanie składnika przetwarzania wstępnego z momentu wytrenowania modelu. Ponowne używanie tego samego składnika przetwarzania wstępnego gwarantuje, że podczas oceniania jest stosowane to samo wstępne przetwarzanie.
Dowiesz się, jak wykonywać następujące czynności:
- Tworzenie potoku, który ponownie używa istniejących składników z obszaru roboczego
- Wdrażanie potoku w punkcie końcowym
- Korzystanie z przewidywań generowanych przez potok
Informacje o tym przykładzie
W tym przykładzie pokazano, jak ponownie używać kodu przetwarzania wstępnego i parametrów poznanych podczas przetwarzania wstępnego przed użyciem modelu do wnioskowania. Dzięki ponownemu użyciu kodu wstępnego przetwarzania i poznanych parametrów możemy zapewnić, że te same przekształcenia (takie jak normalizacja i kodowanie cech), które zostały zastosowane do danych wejściowych podczas trenowania, są również stosowane podczas wnioskowania. Model używany do wnioskowania przeprowadzi przewidywania na danych tabelarycznych z zestawu danych dotyczących chorób serca UCI.
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/batch-scoring-with-preprocessing
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 potoku wnioskowania
W tej sekcji utworzymy wszystkie zasoby wymagane dla potoku wnioskowania. Zaczniemy od utworzenia środowiska zawierającego niezbędne biblioteki dla składników potoku. Następnie utworzymy klaster obliczeniowy, na którym zostanie uruchomione wdrożenie wsadowe. Następnie zarejestrujemy składniki, modele i przekształcenia, które musimy utworzyć w potoku wnioskowania. Na koniec skompilujemy i przetestujemy potok.
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
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 składników i modeli
Zarejestrujemy składniki, modele i przekształcenia, które musimy utworzyć w potoku wnioskowania. Niektóre z tych zasobów można użyć ponownie na potrzeby procedur szkoleniowych.
Napiwek
W tym samouczku użyjemy ponownie modelu i składnika przetwarzania wstępnego z wcześniejszego potoku trenowania. Możesz zobaczyć, jak zostały utworzone, postępując zgodnie z przykładem Jak wdrożyć potok trenowania z punktami końcowymi wsadowymi.
Zarejestruj model do użycia na potrzeby przewidywania:
az ml model create --name heart-classifier --type mlflow_model --path model
Zarejestrowany model nie został wytrenowany bezpośrednio na danych wejściowych. Zamiast tego dane wejściowe zostały wstępnie przetworzone (lub przekształcone) przed rozpoczęciem trenowania przy użyciu składnika prepare. Musimy również zarejestrować ten składnik. Zarejestruj składnik prepare:
az ml component create -f components/prepare/prepare.yml
Napiwek
Po zarejestrowaniu składnika prepare możesz teraz odwołać się do niego z obszaru roboczego. Na przykład
azureml:uci_heart_prepare@latest
zostanie pobrana ostatnia wersja składnika prepare.W ramach przekształceń danych w składniku przygotowywania dane wejściowe zostały znormalizowane w celu wyśrodkowania predyktorów i ograniczenia ich wartości w zakresie [-1, 1]. Parametry transformacji zostały przechwycone w transformacji scikit-learn, którą możemy również zarejestrować w celu zastosowania później, gdy mamy nowe dane. Zarejestruj przekształcenie w następujący sposób:
az ml model create --name heart-classifier-transforms --type custom_model --path transformations
Przeprowadzimy wnioskowanie dla zarejestrowanego modelu przy użyciu innego składnika o nazwie
score
, który oblicza przewidywania dla danego modelu. Odwołujemy się do składnika bezpośrednio z jego definicji.Napiwek
Najlepszym rozwiązaniem byłoby zarejestrowanie składnika i odwołanie do niego z potoku. Jednak w tym przykładzie odwołujemy się do składnika bezpośrednio z jego definicji, aby ułatwić sprawdzenie, które składniki są ponownie używane z potoku trenowania i które z nich są nowe.
Kompilowanie potoku
Teraz nadszedł czas, aby powiązać wszystkie elementy razem. Potok wnioskowania, który wdrożymy, ma dwa składniki (kroki):
preprocess_job
: ten krok odczytuje dane wejściowe i zwraca przygotowane dane oraz zastosowane przekształcenia. Krok odbiera dwa dane wejściowe:data
: folder zawierający dane wejściowe do ocenytransformations
: (opcjonalnie) Ścieżka do przekształceń, które zostaną zastosowane, jeśli są dostępne. Po podaniu przekształcenia są odczytywane z modelu wskazanego na ścieżce. Jeśli jednak ścieżka nie zostanie podana, przekształcenia zostaną poznane na podstawie danych wejściowych. W przypadku wnioskowania nie można jednak nauczyć się parametrów transformacji (w tym przykładzie współczynników normalizacji) z danych wejściowych, ponieważ należy użyć tych samych wartości parametrów, które zostały poznane podczas trenowania. Ponieważ te dane wejściowe są opcjonalne,preprocess_job
składnik może być używany podczas trenowania i oceniania.
score_job
: ten krok przeprowadzi wnioskowanie na przekształconych danych przy użyciu modelu wejściowego. Zwróć uwagę, że składnik używa modelu MLflow do wnioskowania. Na koniec wyniki są zapisywane w tym samym formacie, w jakim zostały odczytane.
Konfiguracja potoku jest zdefiniowana pipeline.yml
w pliku:
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}}
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:
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
Utwórz zadanie testowe:
az ml job create -f pipeline-job.yml --set inputs.input_data.path=data/unlabeled
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-score"
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-score description: Batch scoring endpoint 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.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.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
Tworzenie wdrożenia
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.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 i jednego wejściowego literału.
Plik
inputs.yml
zawiera definicję zasobu danych wejściowych:inputs.yml
inputs: input_data: type: uri_folder path: data/unlabeled score_mode: type: string default: append outputs: scores: type: uri_folder mode: upload
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
Uzyskiwanie dostępu do danych wyjściowych zadania
Po zakończeniu zadania możemy uzyskać dostęp do jego danych wyjściowych. To zadanie zawiera tylko jedno dane wyjściowe o nazwie scores
:
Skojarzone wyniki można pobrać przy użyciu polecenia az ml job download
.
az ml job download --name $JOB_NAME --output-name scores
Odczytywanie ocenianych danych:
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
Dane wyjściowe wyglądają następująco:
wiek | płeć | ... | thal | przewidywanie |
---|---|---|---|---|
0.9338 | 1 | ... | 2 | 0 |
1.3782 | 1 | ... | 3 | 1 |
1.3782 | 1 | ... | 100 | 0 |
-1.954 | 1 | ... | 3 | 0 |
Dane wyjściowe zawierają przewidywania oraz dane dostarczone do składnika score , który został wstępnie przetworzony. Na przykład kolumna age
została znormalizowana, a kolumna thal
zawiera oryginalne wartości kodowania. W praktyce prawdopodobnie chcesz wygenerować tylko przewidywanie, a następnie połączyć je z oryginalnymi wartościami. Ta praca została pozostawiona czytelnikowi.
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