Dostosowywanie danych wyjściowych we wdrożeniach wsadowych
DOTYCZY: Rozszerzenie interfejsu wiersza polecenia platformy Azure w wersji 2 (current)
Zestaw PYTHON SDK azure-ai-ml v2 (bieżąca)
W tym przewodniku wyjaśniono, jak tworzyć wdrożenia, które generują niestandardowe dane wyjściowe i pliki. Czasami potrzebna jest większa kontrola nad danymi zapisanymi jako dane wyjściowe z zadań wnioskowania wsadowego. Te przypadki obejmują następujące sytuacje:
- Musisz kontrolować sposób zapisywania przewidywań w danych wyjściowych. Na przykład chcesz dołączyć przewidywanie do oryginalnych danych, jeśli dane są tabelaryczne.
- Przewidywania należy napisać w innym formacie pliku niż obsługiwane gotowe do użycia wdrożenia wsadowe.
- Model jest modelem generowania, który nie może zapisać danych wyjściowych w formacie tabelarycznym. Na przykład modele, które generują obrazy jako dane wyjściowe.
- Model tworzy wiele plików tabelarycznych zamiast jednego. Na przykład modele, które wykonują prognozowanie, rozważając wiele scenariuszy.
Wdrożenia wsadowe umożliwiają przejęcie kontroli nad danymi wyjściowymi zadań, umożliwiając zapisywanie bezpośrednio w danych wyjściowych zadania wdrażania wsadowego. Z tego samouczka dowiesz się, jak wdrożyć model w celu przeprowadzania wnioskowania wsadowego i zapisywania danych wyjściowych w formacie parquet , dołączając przewidywania do oryginalnych danych wejściowych.
Informacje o tym przykładzie
W tym przykładzie pokazano, jak wdrożyć model w celu przeprowadzenia wnioskowania wsadowego i dostosować sposób zapisywania przewidywań w danych wyjściowych. Model jest oparty na zestawie danych choroby serca UCI. Baza danych zawiera 76 atrybutów, ale w tym przykładzie użyto podzestawu 14 z nich. Model próbuje przewidzieć obecność choroby serca u pacjenta. Jest to liczba całkowita z zakresu od 0 (brak obecności) do 1 (obecność).
Model został wytrenowany przy użyciu XGBBoost
klasyfikatora, a wszystkie wymagane wstępne przetwarzanie zostało spakowane jako potok, dzięki czemu ten model będzie gotowym potokiem scikit-learn
, który przechodzi od nieprzetworzonych danych do przewidywań.
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-models/custom-outputs-parquet
Postępuj zgodnie z instrukcjami w notesie Jupyter
Istnieje notes Jupyter, którego można użyć do naśladowania w tym przykładzie. W sklonowanym repozytorium otwórz notes o nazwie custom-output-batch.ipynb.
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 wdrożenia wsadowego z niestandardowymi danymi wyjściowymi
W tym przykładzie utworzysz wdrożenie, które może zapisywać bezpośrednio w folderze wyjściowym zadania wdrożenia wsadowego. Wdrożenie używa tej funkcji do zapisywania niestandardowych plików parquet.
Rejestrowanie modelu
Zarejestrowane modele można wdrażać tylko przy użyciu punktu końcowego wsadowego. W takim przypadku masz już lokalną kopię modelu w repozytorium, więc wystarczy opublikować model w rejestrze w obszarze roboczym. Ten krok można pominąć, jeśli model, który próbujesz wdrożyć, jest już zarejestrowany.
MODEL_NAME='heart-classifier-sklpipe'
az ml model create --name $MODEL_NAME --type "custom_model" --path "model"
Tworzenie skryptu oceniania
Należy utworzyć skrypt oceniania, który może odczytywać dane wejściowe dostarczone przez wdrożenie wsadowe i zwracać wyniki modelu. Zamierzasz również zapisywać bezpośrednio w folderze wyjściowym zadania. Podsumowując, proponowany skrypt oceniania działa w następujący sposób:
- Odczytuje dane wejściowe jako pliki CSV.
- Uruchamia funkcję modelu
predict
MLflow na danych wejściowych. - Dołącza przewidywania do elementu
pandas.DataFrame
wraz z danymi wejściowymi. - Zapisuje dane w pliku o nazwie jako plik wejściowy, ale w
parquet
formacie.
kod/batch_driver.py
import os
import pickle
import glob
import pandas as pd
from pathlib import Path
from typing import List
def init():
global model
global output_path
# AZUREML_MODEL_DIR is an environment variable created during deployment
# It is the path to the model folder
# Please provide your model's folder name if there's one:
output_path = os.environ["AZUREML_BI_OUTPUT_PATH"]
model_path = os.environ["AZUREML_MODEL_DIR"]
model_file = glob.glob(f"{model_path}/*/*.pkl")[-1]
with open(model_file, "rb") as file:
model = pickle.load(file)
def run(mini_batch: List[str]):
for file_path in mini_batch:
data = pd.read_csv(file_path)
pred = model.predict(data)
data["prediction"] = pred
output_file_name = Path(file_path).stem
output_file_path = os.path.join(output_path, output_file_name + ".parquet")
data.to_parquet(output_file_path)
return mini_batch
Uwagi:
- Zwróć uwagę, że zmienna środowiskowa
AZUREML_BI_OUTPUT_PATH
służy do uzyskiwania dostępu do ścieżki wyjściowej zadania wdrażania. - Funkcja
init()
wypełnia zmienną globalną o nazwieoutput_path
, która może służyć później do poznania miejsca zapisu. - Metoda
run
zwraca listę przetworzonych plików. Funkcja musirun
zwrócićlist
obiekt lubpandas.DataFrame
.
Ostrzeżenie
Należy wziąć pod uwagę, że wszystkie funkcje wykonawcze wsadowe mają jednocześnie dostęp do zapisu do tej ścieżki. Oznacza to, że musisz uwzględnić współbieżność. W takim przypadku upewnij się, że każdy wykonawca zapisuje własny plik przy użyciu nazwy pliku wejściowego jako nazwy folderu wyjściowego.
Tworzenie punktu końcowego
Teraz utworzysz punkt końcowy wsadowy o nazwie heart-classifier-batch
, w którym wdrożono model.
Zdecyduj o nazwie punktu końcowego. Nazwa punktu końcowego jest wyświetlana w identyfikatorze URI skojarzonym z punktem końcowym, dlatego nazwy punktów końcowych partii muszą być unikatowe w regionie świadczenia usługi Azure. Na przykład może istnieć tylko jeden punkt końcowy wsadowy o nazwie
mybatchendpoint
w plikuwestus2
.W takim przypadku umieść nazwę punktu końcowego w zmiennej, aby można było łatwo odwoływać się do niego później.
ENDPOINT_NAME="heart-classifier-custom"
Skonfiguruj punkt końcowy wsadu.
Następujący plik YAML definiuje punkt końcowy partii:
endpoint.yml
$schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json name: heart-classifier-batch description: A heart condition classifier for batch inference auth_mode: aad_token
Utwórz punkt końcowy:
az ml batch-endpoint create -n $ENDPOINT_NAME -f endpoint.yml
Tworzenie wdrożenia
Wykonaj następne kroki, aby utworzyć wdrożenie przy użyciu poprzedniego skryptu oceniania:
Najpierw utwórz środowisko, w którym można wykonać skrypt oceniania:
Dla interfejsu wiersza polecenia usługi Azure Machine Learning nie jest wymagany dodatkowy krok. Definicja środowiska jest zawarta w pliku wdrożenia.
environment: name: batch-mlflow-xgboost image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: environment/conda.yaml
Utwórz wdrożenie. Zwróć uwagę, że
output_action
teraz ustawiono wartośćSUMMARY_ONLY
.Uwaga
W tym przykładzie przyjęto założenie, że masz klaster obliczeniowy o nazwie
batch-cluster
. Zmień tę nazwę odpowiednio.Aby utworzyć nowe wdrożenie w ramach utworzonego punktu końcowego, utwórz konfigurację YAML podobną do poniższej. Możesz sprawdzić pełny schemat YAML punktu końcowego wsadowego pod kątem dodatkowych właściwości.
$schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json endpoint_name: heart-classifier-batch name: classifier-xgboost-custom description: A heart condition classifier based on XGBoost and Scikit-Learn pipelines that append predictions on parquet files. type: model model: azureml:heart-classifier-sklpipe@latest environment: name: batch-mlflow-xgboost image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest conda_file: environment/conda.yaml code_configuration: code: code scoring_script: batch_driver.py compute: azureml:batch-cluster resources: instance_count: 2 settings: max_concurrency_per_instance: 2 mini_batch_size: 2 output_action: summary_only retry_settings: max_retries: 3 timeout: 300 error_threshold: -1 logging_level: info
Następnie utwórz wdrożenie za pomocą następującego polecenia:
az ml batch-deployment create --file deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
W tym momencie nasz punkt końcowy wsadowy jest gotowy do użycia.
Testowanie wdrożenia
Aby przetestować punkt końcowy, użyj przykładu danych bez etykiet znajdujących się w tym repozytorium, które mogą być używane z modelem. Punkty końcowe usługi Batch mogą przetwarzać tylko dane znajdujące się w chmurze i są dostępne z obszaru roboczego usługi Azure Machine Learning. W tym przykładzie przekażesz go do magazynu danych usługi Azure Machine Learning. Utworzysz zasób danych, który może służyć do wywoływania punktu końcowego na potrzeby oceniania. Należy jednak zauważyć, że punkty końcowe wsadowe akceptują dane, które można umieścić w wielu typach lokalizacji.
Wywołaj punkt końcowy z danymi z konta magazynu:
JOB_NAME = $(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/heart-disease-uci/data --query name -o tsv)
Uwaga
jq
Narzędzie może nie być zainstalowane w każdej instalacji. Instrukcje można uzyskać w witrynie GitHub.Zadanie wsadowe jest uruchamiane natychmiast po powrocie polecenia. Stan zadania można monitorować do momentu jego zakończenia:
az ml job show -n $JOB_NAME --web
Analizowanie danych wyjściowych
Zadanie generuje nazwane dane wyjściowe o nazwie o nazwie, score
w której są umieszczane wszystkie wygenerowane pliki. Ponieważ zapisał się bezpośrednio w katalogu, jeden plik na każdy plik wejściowy, można oczekiwać, że będzie miała taką samą liczbę plików. W tym konkretnym przykładzie nazwij pliki wyjściowe tak samo jak dane wejściowe, ale mają rozszerzenie parquet.
Uwaga
Zwróć uwagę, że plik predictions.csv znajduje się również w folderze wyjściowym. Ten plik zawiera podsumowanie przetworzonych plików.
Wyniki zadania można pobrać przy użyciu nazwy zadania:
Aby pobrać przewidywania, użyj następującego polecenia:
az ml job download --name $JOB_NAME --output-name score --download-path ./
Po pobraniu pliku można go otworzyć przy użyciu ulubionego narzędzia. Poniższy przykład ładuje przewidywania przy użyciu Pandas
ramki danych.
import pandas as pd
import glob
output_files = glob.glob("named-outputs/score/*.parquet")
score = pd.concat((pd.read_parquet(f) for f in output_files))
score
Dane wyjściowe wyglądają następująco:
wiek | płeć | ... | thal | przewidywanie |
---|---|---|---|---|
63 | 1 | ... | stały | 0 |
67 | 1 | ... | normalny | 1 |
67 | 1 | ... | odwracalny | 0 |
37 | 1 | ... | normalny | 0 |
Czyszczenie zasobów
Uruchom następujący kod, aby usunąć punkt końcowy wsadowy i wszystkie podstawowe wdrożenia. Zadania oceniania wsadowego nie są usuwane.
az ml batch-endpoint delete --name $ENDPOINT_NAME --yes