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/wklejania kodu YAML i innych plików, najpierw sklonuj repozytorium, a następnie zmień katalogi na folder:

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

Przed wykonaniem kroków opisanych w tym artykule upewnij się, że masz następujące wymagania wstępne:

  • Subskrypcja platformy Azure. Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto. Wypróbuj bezpłatną lub płatną wersję usługi Azure Machine Edukacja.

  • Obszar roboczy usługi Azure Machine Learning. Jeśli go nie masz, wykonaj kroki opisane w artykule Manage Azure Machine Edukacja workspaces (Zarządzanie obszarami roboczymi usługi Azure Machine Edukacja), aby je utworzyć.

  • Upewnij się, że masz następujące uprawnienia w obszarze roboczym:

    • Tworzenie punktów końcowych i wdrożeń wsadowych lub zarządzanie nimi: użyj roli właściciela, współautora lub niestandardowej, która zezwala na Microsoft.MachineLearningServices/workspaces/batchEndpoints/*usługę .

    • Tworzenie wdrożeń usługi ARM w grupie zasobów obszaru roboczego: użyj roli Właściciel, Współautor lub Niestandardowy, która umożliwia Microsoft.Resources/deployments/write korzystanie z grupy zasobów, w której wdrożono obszar roboczy.

  • Aby pracować z usługą Azure Machine Edukacja, należy zainstalować następujące oprogramowanie:

    Interfejs wiersza polecenia platformy mlAzure i rozszerzenie usługi Azure Machine Edukacja.

    az extension add -n ml
    

    Uwaga

    Wdrożenia składników potoku dla punktów końcowych usługi Batch zostały wprowadzone w wersji 2.7 rozszerzenia dla interfejsu ml wiersza polecenia platformy Azure. Użyj az extension update --name ml polecenia , aby pobrać ostatnią wersję.

Nawiązywanie połączenia z obszarem roboczym

Obszar roboczy jest zasobem najwyższego poziomu dla usługi Azure Machine Learning, który udostępnia scentralizowane miejsce do pracy z wszystkimi tworzonymi podczas korzystania usługi Azure Machine Learning artefaktami. W tej sekcji połączymy się z obszarem roboczym, w którym wykonasz zadania wdrażania.

Przekaż wartości identyfikatora subskrypcji, obszaru roboczego, lokalizacji i grupy zasobów w następującym kodzie:

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:

  1. Odczytuje dane wejściowe jako pliki CSV.
  2. Uruchamia funkcję modelu predict MLflow na danych wejściowych.
  3. Dołącza przewidywania do elementu pandas.DataFrame wraz z danymi wejściowymi.
  4. 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 nazwie output_path , która może służyć później do poznania miejsca zapisu.
  • Metoda run zwraca listę przetworzonych plików. Funkcja musi run zwrócić list obiekt lub pandas.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.

  1. 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 pliku westus2.

    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"
    
  2. 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
    
  3. 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:

  1. Najpierw utwórz środowisko, w którym można wykonać skrypt oceniania:

    W przypadku interfejsu wiersza polecenia usługi Azure Machine Edukacja 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
    
  2. 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
    
  3. 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 Edukacja. W tym przykładzie przekażesz go do magazynu danych usługi Azure Machine Edukacja. 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.

  1. 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.

  2. 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 Seks ... Thal Przewidywania
63 1 ... Stałe 0
67 1 ... Normalne 1
67 1 ... Odwracalne 0
37 1 ... Normalne 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