Udostępnij za pośrednictwem


Wdrażanie modeli oceniania w punktach końcowych wsadowych

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

Punkty końcowe usługi Batch zapewniają wygodny sposób wdrażania modeli, które uruchamiają wnioskowanie na dużych ilościach danych. Te punkty końcowe upraszczają proces hostowania modeli na potrzeby oceniania wsadowego, dzięki czemu koncentrujesz się na uczeniu maszynowym, a nie na infrastrukturze.

Użyj punktów końcowych wsadowych do wdrażania modelu, gdy:

  • Masz kosztowne modele, które wymagają dłuższego czasu na wnioskowanie.
  • Należy przeprowadzić wnioskowanie na dużych ilościach danych, które są dystrybuowane w wielu plikach.
  • Nie masz wymagań dotyczących małych opóźnień.
  • Możesz skorzystać z równoległości.

W tym artykule użyjesz punktu końcowego wsadowego do wdrożenia modelu uczenia maszynowego, który rozwiązuje klasyczny problem rozpoznawania cyfr MNIST (zmodyfikowany Narodowy Instytut Standardów i Technologii). Wdrożony model wykonuje następnie wnioskowanie wsadowe na dużych ilościach danych — w tym przypadku pliki obrazów. Zacznij od utworzenia wdrożenia wsadowego modelu, który został utworzony przy użyciu platformy Torch. To wdrożenie staje się domyślne w punkcie końcowym. Później utworzysz drugie wdrożenie trybu, który został utworzony za pomocą biblioteki TensorFlow (Keras), przetestujesz drugie wdrożenie, a następnie ustawisz je jako domyślne wdrożenie punktu końcowego.

Aby postępować zgodnie z przykładami kodu i plikami wymaganymi do uruchamiania poleceń w tym artykule lokalnie, zobacz sekcję Klonowanie repozytorium przykładów. Przykłady kodu i pliki znajdują się w repozytorium azureml-examples .

Wymagania wstępne

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

Klonowanie repozytorium przykładów

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/endpoints/batch/deploy-models/mnist-classifier

Przygotowywanie systemu

Nawiązywanie połączenia z obszarem roboczym

Najpierw połącz się z obszarem roboczym usługi Azure Machine Learning, w którym będziesz pracować.

Jeśli nie ustawiono jeszcze ustawień domyślnych dla interfejsu wiersza polecenia platformy Azure, zapisz ustawienia domyślne. Aby uniknąć wielokrotnego przekazywania wartości dla subskrypcji, obszaru roboczego, grupy zasobów i lokalizacji, uruchom następujący kod:

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

Tworzenie zasobów obliczeniowych

Punkty końcowe usługi Batch działają w klastrach obliczeniowych i obsługują klastry obliczeniowe usługi Azure Machine Learning (AmlCompute) i klastry Kubernetes. Klastry są zasobem udostępnionym, dlatego jeden klaster może hostować jedno lub wiele wdrożeń wsadowych (wraz z innymi obciążeniami, jeśli jest to konieczne).

Utwórz obliczenia o nazwie batch-cluster, jak pokazano w poniższym kodzie. Możesz dostosować je zgodnie z potrzebami i odwołać się do zasobów obliczeniowych przy użyciu polecenia azureml:<your-compute-name>.

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

Uwaga

W tym momencie nie są naliczane opłaty za obliczenia, ponieważ klaster pozostaje w 0 węzłach do momentu wywołania punktu końcowego wsadowego i przesłania zadania oceniania wsadowego. Aby uzyskać więcej informacji na temat kosztów obliczeń, zobacz Zarządzanie kosztami i optymalizowanie kosztów dla usługi AmlCompute.

Tworzenie punktu końcowego wsadowego

Punkt końcowy wsadowy to punkt końcowy HTTPS, który klienci mogą wywoływać w celu wyzwolenia zadania oceniania wsadowego. Zadanie oceniania wsadowego to zadanie , które ocenia wiele danych wejściowych. Wdrożenie wsadowe to zestaw zasobów obliczeniowych hostujących model, który wykonuje rzeczywiste ocenianie wsadowe (lub wnioskowanie wsadowe). Jeden punkt końcowy wsadowy może mieć wiele wdrożeń wsadowych. Aby uzyskać więcej informacji na temat punktów końcowych wsadowych, zobacz Co to są punkty końcowe wsadowe?.

Napiwek

Jedno z wdrożeń wsadowych służy jako domyślne wdrożenie punktu końcowego. Po wywołaniu punktu końcowego domyślne wdrożenie wykonuje rzeczywiste ocenianie wsadowe. Aby uzyskać więcej informacji na temat punktów końcowych i wdrożeń wsadowych, zobacz batch endpoints and batch deployment (Punkty końcowe wsadowe i wdrażanie wsadowe).

  1. Nadaj punktowi końcowego nazwę. Nazwa punktu końcowego musi być unikatowa w regionie świadczenia usługi Azure, ponieważ nazwa jest uwzględniona w identyfikatorze URI punktu końcowego. Na przykład może istnieć tylko jeden punkt końcowy wsadowy o nazwie mybatchendpoint w pliku westus2.

    Umieść nazwę punktu końcowego w zmiennej, aby można było łatwo odwoływać się do niej później.

    ENDPOINT_NAME="mnist-batch"
    
  2. Konfigurowanie punktu końcowego wsadowego

    Poniższy plik YAML definiuje punkt końcowy wsadowy. Tego pliku można użyć z poleceniem interfejsu wiersza polecenia na potrzeby tworzenia punktu końcowego wsadowego.

    endpoint.yml

    $schema: https://azuremlschemas.azureedge.net/latest/batchEndpoint.schema.json
    name: mnist-batch
    description: A batch endpoint for scoring images from the MNIST dataset.
    tags:
      type: deep-learning
    

    W poniższej tabeli opisano kluczowe właściwości punktu końcowego. Aby uzyskać pełny schemat YAML punktu końcowego wsadowego, zobacz Schemat YAML punktu końcowego wsadowego interfejsu wiersza polecenia (wersja 2).

    Key opis
    name Nazwa punktu końcowego partii. Musi być unikatowa na poziomie regionu świadczenia usługi Azure.
    description Opis punktu końcowego wsadowego. Ta właściwość jest opcjonalna.
    tags Tagi do uwzględnienia w punkcie końcowym. Ta właściwość jest opcjonalna.
  3. Utwórz punkt końcowy:

    Uruchom następujący kod, aby utworzyć punkt końcowy wsadowy.

    az ml batch-endpoint create --file endpoint.yml  --name $ENDPOINT_NAME
    

Tworzenie wdrożenia wsadowego

Wdrożenie modelu to zestaw zasobów wymaganych do hostowania modelu, który wykonuje rzeczywiste wnioskowanie. Do utworzenia wdrożenia modelu wsadowego potrzebne są następujące elementy:

  • Zarejestrowany model w obszarze roboczym
  • Kod oceniania modelu
  • Środowisko z zainstalowanymi zależnościami modelu
  • Wstępnie utworzone ustawienia zasobów i zasobów obliczeniowych
  1. Zacznij od zarejestrowania modelu, który ma zostać wdrożony — modelu Torch dla popularnego problemu z rozpoznawaniem cyfr (MNIST). Wdrożenia usługi Batch mogą wdrażać tylko modele zarejestrowane w obszarze roboczym. Ten krok można pominąć, jeśli model, który chcesz wdrożyć, jest już zarejestrowany.

    Napiwek

    Modele są skojarzone z wdrożeniem, a nie z punktem końcowym. Oznacza to, że pojedynczy punkt końcowy może obsługiwać różne modele (lub wersje modelu) w ramach tego samego punktu końcowego, pod warunkiem, że różne modele (lub wersje modelu) są wdrażane w różnych wdrożeniach.

    MODEL_NAME='mnist-classifier-torch'
    az ml model create --name $MODEL_NAME --type "custom_model" --path "deployment-torch/model"
    
  2. Teraz nadszedł czas, aby utworzyć skrypt oceniania. Wdrożenia wsadowe wymagają skryptu oceniania wskazującego sposób wykonywania danego modelu i sposób przetwarzania danych wejściowych. Punkty końcowe usługi Batch obsługują skrypty utworzone w języku Python. W tym przypadku wdrożysz model, który odczytuje pliki obrazów reprezentujące cyfry i dane wyjściowe odpowiadającej mu cyfry. Skrypt oceniania wygląda następująco:

    Uwaga

    W przypadku modeli MLflow usługa Azure Machine Learning automatycznie generuje skrypt oceniania, więc nie musisz go podawać. Jeśli model jest modelem MLflow, możesz pominąć ten krok. Aby uzyskać więcej informacji na temat sposobu pracy punktów końcowych wsadowych z modelami MLflow, zobacz artykuł Using MLflow models in batch deployments (Używanie modeli MLflow we wdrożeniach wsadowych).

    Ostrzeżenie

    Jeśli wdrażasz model zautomatyzowanego uczenia maszynowego (AutoML) w punkcie końcowym wsadowym, pamiętaj, że skrypt oceniania, który zapewnia rozwiązanie AutoML, działa tylko dla punktów końcowych online i nie jest przeznaczony do wykonywania wsadowego. Aby uzyskać informacje na temat tworzenia skryptu oceniania dla wdrożenia wsadowego, zobacz Tworzenie skryptów oceniania dla wdrożeń wsadowych.

    deployment-torch/code/batch_driver.py

    import os
    import pandas as pd
    import torch
    import torchvision
    import glob
    from os.path import basename
    from mnist_classifier import MnistClassifier
    from typing import List
    
    
    def init():
        global model
        global device
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        # It is the path to the model folder
        model_path = os.environ["AZUREML_MODEL_DIR"]
        model_file = glob.glob(f"{model_path}/*/*.pt")[-1]
    
        model = MnistClassifier()
        model.load_state_dict(torch.load(model_file))
        model.eval()
    
        device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
    
    
    def run(mini_batch: List[str]) -> pd.DataFrame:
        print(f"Executing run method over batch of {len(mini_batch)} files.")
    
        results = []
        with torch.no_grad():
            for image_path in mini_batch:
                image_data = torchvision.io.read_image(image_path).float()
                batch_data = image_data.expand(1, -1, -1, -1)
                input = batch_data.to(device)
    
                # perform inference
                predict_logits = model(input)
    
                # Compute probabilities, classes and labels
                predictions = torch.nn.Softmax(dim=-1)(predict_logits)
                predicted_prob, predicted_class = torch.max(predictions, axis=-1)
    
                results.append(
                    {
                        "file": basename(image_path),
                        "class": predicted_class.numpy()[0],
                        "probability": predicted_prob.numpy()[0],
                    }
                )
    
        return pd.DataFrame(results)
    
  3. Utwórz środowisko, w którym zostanie uruchomione wdrożenie wsadowe. Środowisko powinno zawierać pakiety azureml-core i azureml-dataset-runtime[fuse], które są wymagane przez punkty końcowe wsadowe, a także wszelkie zależności wymagane przez kod do uruchomienia. W takim przypadku zależności zostały przechwycone w conda.yaml pliku:

    deployment-torch/environment/conda.yaml

    name: mnist-env
    channels:
      - conda-forge
    dependencies:
      - python=3.8.5
      - pip<22.0
      - pip:
        - torch==1.13.0
        - torchvision==0.14.0
        - pytorch-lightning
        - pandas
        - azureml-core
        - azureml-dataset-runtime[fuse]
    

    Ważne

    Pakiety azureml-core i azureml-dataset-runtime[fuse] są wymagane przez wdrożenia wsadowe i powinny być uwzględnione w zależnościach środowiska.

    Określ środowisko w następujący sposób:

    Definicja środowiska zostanie uwzględniona w definicji wdrożenia jako środowisko anonimowe. W ramach wdrożenia zobaczysz następujące wiersze:

    environment:
      name: batch-torch-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    

    Ostrzeżenie

    Nadzorowane środowiska nie są obsługiwane we wdrożeniach wsadowych. Musisz określić własne środowisko. W celu uproszczenia procesu zawsze można użyć obrazu podstawowego środowiska wyselekcjonowanego.

  4. Tworzenie definicji wdrożenia

    torch/deployment.yml wdrożenia

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    name: mnist-torch-dpl
    description: A deployment using Torch to solve the MNIST classification dataset.
    endpoint_name: mnist-batch
    type: model
    model:
      name: mnist-classifier-torch
      path: model
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    environment:
      name: batch-torch-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    compute: azureml:batch-cluster
    resources:
      instance_count: 1
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 10
      output_action: append_row
      output_file_name: predictions.csv
      retry_settings:
        max_retries: 3
        timeout: 30
      error_threshold: -1
      logging_level: info
    

    W poniższej tabeli opisano kluczowe właściwości wdrożenia wsadowego. Aby zapoznać się ze schematem YAML pełnego wdrożenia wsadowego, zobacz Schemat YAML wdrożenia wsadowego (CLI, v2).

    Key opis
    name Nazwa wdrożenia.
    endpoint_name Nazwa punktu końcowego do utworzenia wdrożenia w obszarze.
    model Model, który ma być używany do oceniania wsadowego. W przykładzie zdefiniowano wbudowany model przy użyciu polecenia path. Ta definicja umożliwia automatyczne przekazywanie i zarejestrowanie plików modelu przy użyciu automatycznie wygenerowanej nazwy i wersji. Aby uzyskać więcej opcji, zobacz schemat modelu. Najlepszym rozwiązaniem dla scenariuszy produkcyjnych jest utworzenie modelu oddzielnie i odwołanie do niego w tym miejscu. Aby odwołać się do istniejącego modelu, użyj azureml:<model-name>:<model-version> składni .
    code_configuration.code Katalog lokalny zawierający cały kod źródłowy języka Python do oceny modelu.
    code_configuration.scoring_script Plik języka Python w code_configuration.code katalogu . Ten plik musi mieć init() funkcję i run() funkcję. init() Użyj funkcji dla każdego kosztownego lub wspólnego przygotowania (na przykład do załadowania modelu w pamięci). init() zostanie wywołana tylko raz na początku procesu. Służy run(mini_batch) do oceniania każdego wpisu; wartość mini_batch jest listą ścieżek plików. Funkcja run() powinna zwrócić ramkę danych biblioteki pandas lub tablicę. Każdy zwrócony element wskazuje jeden pomyślny przebieg elementu wejściowego w elemecie mini_batch. Aby uzyskać więcej informacji na temat tworzenia skryptu oceniania, zobacz Opis skryptu oceniania.
    environment Środowisko do oceny modelu. W przykładzie zdefiniowano wbudowane środowisko przy użyciu elementów conda_file i image. Zależności conda_file zostaną zainstalowane na podstawie .image Środowisko zostanie automatycznie zarejestrowane przy użyciu automatycznie wygenerowanej nazwy i wersji. Aby uzyskać więcej opcji, zobacz Schemat środowiska. Najlepszym rozwiązaniem dla scenariuszy produkcyjnych jest utworzenie środowiska oddzielnie i odwołanie do niego w tym miejscu. Aby odwołać się do istniejącego środowiska, użyj azureml:<environment-name>:<environment-version> składni .
    compute Obliczenia do uruchamiania oceniania wsadowego. W przykładzie użyto utworzonego batch-cluster na początku elementu i odwołuje się do niego przy użyciu azureml:<compute-name> składni .
    resources.instance_count Liczba wystąpień, które mają być używane dla każdego zadania oceniania wsadowego.
    settings.max_concurrency_per_instance Maksymalna liczba przebiegów równoległych scoring_script na wystąpienie.
    settings.mini_batch_size Liczba plików, które scoring_script mogą przetwarzać w jednym run() wywołaniu.
    settings.output_action Sposób organizowania danych wyjściowych w pliku wyjściowym. append_row Scali wszystkie run() zwrócone wyniki wyjściowe w jeden plik o nazwie output_file_name. summary_only nie scali wyników wyjściowych i obliczy tylko error_thresholdwartość .
    settings.output_file_name Nazwa pliku wyjściowego oceniania wsadowego dla .append_row output_action
    settings.retry_settings.max_retries Liczba prób maksymalnej liczby nieudanych scoring_script run()prób.
    settings.retry_settings.timeout Limit czasu w sekundach dla oceny scoring_script run() minisadowej.
    settings.error_threshold Liczba błędów oceniania pliku wejściowego, które powinny być ignorowane. Jeśli liczba błędów dla całego danych wejściowych przekroczy tę wartość, zadanie oceniania wsadowego zostanie zakończone. W przykładzie użyto -1metody , która wskazuje, że dowolna liczba niepowodzeń jest dozwolona bez kończenia zadania oceniania wsadowego.
    settings.logging_level Czasownik dziennika. Wartości zwiększające szczegółowość to: OSTRZEŻENIE, INFORMACJE i DEBUGOWANIE.
    settings.environment_variables Słownik par nazwa-wartość zmiennej środowiskowej do ustawienia dla każdego zadania oceniania wsadowego.
  5. 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 --file deployment-torch/deployment.yml --endpoint-name $ENDPOINT_NAME --set-default
    

    Napiwek

    Parametr --set-default ustawia nowo utworzone wdrożenie jako domyślne wdrożenie punktu końcowego. Jest to wygodny sposób tworzenia nowego domyślnego wdrożenia punktu końcowego, szczególnie w przypadku pierwszego utworzenia wdrożenia. Najlepszym rozwiązaniem dla scenariuszy produkcyjnych może być utworzenie nowego wdrożenia bez ustawiania go jako domyślnego. Sprawdź, czy wdrożenie działa zgodnie z oczekiwaniami, a następnie zaktualizuj domyślne wdrożenie później. Aby uzyskać więcej informacji na temat implementowania tego procesu, zobacz sekcję Wdrażanie nowego modelu .

  6. Sprawdź szczegóły punktu końcowego i wdrożenia wsadowego.

    Użyj polecenia show , aby sprawdzić szczegóły punktu końcowego i wdrożenia. Aby sprawdzić wdrożenie wsadowe, uruchom następujący kod:

    DEPLOYMENT_NAME="mnist-torch-dpl"
    az ml batch-deployment show --name $DEPLOYMENT_NAME --endpoint-name $ENDPOINT_NAME
    

Uruchamianie punktów końcowych wsadowych i uzyskiwanie dostępu do wyników

Wywoływanie punktu końcowego wsadowego wyzwala zadanie oceniania wsadowego. Zadanie name jest zwracane z odpowiedzi wywołania i może służyć do śledzenia postępu oceniania wsadowego. Podczas uruchamiania modeli oceniania w punktach końcowych wsadowych należy określić ścieżkę do danych wejściowych, aby punkty końcowe mogły znaleźć dane, które chcesz ocenić. W poniższym przykładzie pokazano, jak uruchomić nowe zadanie względem przykładowych danych zestawu danych MNIST przechowywanego na koncie usługi Azure Storage.

Punkt końcowy usługi Batch można uruchamiać i wywoływać przy użyciu interfejsu wiersza polecenia platformy Azure, zestawu Azure Machine Learning SDK lub punktów końcowych REST. Aby uzyskać więcej informacji na temat tych opcji, zobacz Tworzenie zadań i danych wejściowych dla punktów końcowych wsadowych.

Uwaga

Jak działa równoległe przetwarzanie?

Wdrożenia wsadowe dystrybuują pracę na poziomie pliku, co oznacza, że folder zawierający 100 plików z minisadami 10 plików spowoduje wygenerowanie 10 partii 10 plików. Zwróć uwagę, że dzieje się tak niezależnie od rozmiaru zaangażowanych plików. Jeśli pliki są zbyt duże do przetworzenia w dużych minisadach, sugerujemy podzielenie plików na mniejsze pliki w celu osiągnięcia wyższego poziomu równoległości lub zmniejszenie liczby plików na minisadę. Obecnie wdrożenia wsadowe nie mogą uwzględniać niesymetryczności w dystrybucji rozmiaru pliku.

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --input-type uri_folder --query name -o tsv)

Punkty końcowe usługi Batch obsługują odczytywanie plików lub folderów znajdujących się w różnych lokalizacjach. Aby dowiedzieć się więcej o obsługiwanych typach i sposobach ich określania, zobacz Uzyskiwanie dostępu do danych z zadań punktów końcowych wsadowych.

Monitorowanie postępu wykonywania zadania wsadowego

Zadania oceniania wsadowego zwykle zajmują trochę czasu, aby przetworzyć cały zestaw danych wejściowych.

Poniższy kod sprawdza stan zadania i generuje link do usługi Azure Machine Learning Studio, aby uzyskać więcej szczegółów.

az ml job show -n $JOB_NAME --web

Sprawdzanie wyników oceniania wsadowego

Dane wyjściowe zadania są przechowywane w magazynie w chmurze w domyślnym magazynie obiektów blob obszaru roboczego lub określonym magazynie. Aby dowiedzieć się, jak zmienić ustawienia domyślne, zobacz Konfigurowanie lokalizacji wyjściowej. Poniższe kroki umożliwiają wyświetlenie wyników oceniania w Eksplorator usługi Azure Storage po zakończeniu zadania:

  1. Uruchom następujący kod, aby otworzyć zadanie oceniania wsadowego w usłudze Azure Machine Learning Studio. Link do programu Job Studio jest również uwzględniony w odpowiedzi elementu invoke, jako wartość interactionEndpoints.Studio.endpoint.

    az ml job show -n $JOB_NAME --web
    
  2. Na wykresie zadania wybierz batchscoring krok.

  3. Wybierz kartę Dane wyjściowe i dzienniki , a następnie wybierz pozycję Pokaż dane wyjściowe.

  4. W obszarze Dane wyjściowe wybierz ikonę, aby otworzyć Eksplorator usługi Storage.

    Zrzut ekranu programu Studio przedstawiający lokalizację danych wyjściowych widoku.

    Wyniki oceniania w Eksplorator usługi Storage są podobne do następującej przykładowej strony:

    Zrzut ekranu przedstawiający dane wyjściowe oceniania.

Konfigurowanie lokalizacji wyjściowej

Domyślnie wyniki oceniania wsadowego są przechowywane w domyślnym magazynie obiektów blob obszaru roboczego w folderze o nazwie według nazwy zadania (identyfikator GUID generowany przez system). Możesz skonfigurować miejsce przechowywania danych wyjściowych oceniania podczas wywoływania punktu końcowego wsadowego.

Służy output-path do konfigurowania dowolnego folderu w zarejestrowanym magazynie danych usługi Azure Machine Learning. Składnia elementu --output-path jest taka sama jak --input w przypadku określania folderu , azureml://datastores/<datastore-name>/paths/<path-on-datastore>/czyli . Użyj --set output_file_name=<your-file-name> polecenia , aby skonfigurować nową nazwę pliku wyjściowego.

OUTPUT_FILE_NAME=predictions_`echo $RANDOM`.csv
OUTPUT_PATH="azureml://datastores/workspaceblobstore/paths/$ENDPOINT_NAME"

JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --output-path $OUTPUT_PATH --set output_file_name=$OUTPUT_FILE_NAME --query name -o tsv)

Ostrzeżenie

Musisz użyć unikatowej lokalizacji wyjściowej. Jeśli plik wyjściowy istnieje, zadanie oceniania wsadowego zakończy się niepowodzeniem.

Ważne

W przeciwieństwie do danych wejściowych dane wyjściowe mogą być przechowywane tylko w magazynach danych usługi Azure Machine Learning uruchamianych na kontach usługi Blob Storage.

Zastępowanie konfiguracji wdrożenia dla każdego zadania

Podczas wywoływania punktu końcowego wsadowego niektóre ustawienia można zastąpić, aby jak najlepiej wykorzystać zasoby obliczeniowe i zwiększyć wydajność. Następujące ustawienia można skonfigurować dla poszczególnych zadań:

  • Liczba wystąpień: użyj tego ustawienia, aby zastąpić liczbę wystąpień do żądania z klastra obliczeniowego. Na przykład w przypadku większej ilości danych wejściowych możesz użyć większej liczby wystąpień, aby przyspieszyć zakończenie oceniania wsadowego.
  • Rozmiar minisadów: użyj tego ustawienia, aby zastąpić liczbę plików do uwzględnienia w każdej minisadowej partii. Liczba minisadów jest określana przez łączną liczbę plików wejściowych i rozmiar mini-partii. Mniejszy rozmiar mini-partii generuje więcej minisadów. Minisady mogą być uruchamiane równolegle, ale mogą istnieć dodatkowe obciążenia związane z planowaniem i wywołaniem.
  • Inne ustawienia, takie jak maksymalna liczba ponownych prób, przekroczenie limitu czasu i próg błędu, można zastąpić. Te ustawienia mogą mieć wpływ na pełny czas oceniania wsadowego dla różnych obciążeń.
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --mini-batch-size 20 --instance-count 5 --query name -o tsv)

Dodawanie wdrożeń do punktu końcowego

Po utworzeniu punktu końcowego wsadowego z wdrożeniem możesz nadal uściślić model i dodawać nowe wdrożenia. Punkty końcowe usługi Batch będą nadal obsługiwać wdrożenie domyślne podczas tworzenia i wdrażania nowych modeli w ramach tego samego punktu końcowego. Wdrożenia nie mają wpływu na siebie.

W tym przykładzie dodasz drugie wdrożenie korzystające z modelu utworzonego za pomocą interfejsu Keras i TensorFlow w celu rozwiązania tego samego problemu MNIST.

Dodawanie drugiego wdrożenia

  1. Utwórz środowisko, w którym zostanie uruchomione wdrożenie wsadowe. Uwzględnij w środowisku dowolną zależność wymaganą przez kod do uruchomienia. Należy również dodać bibliotekę azureml-core, ponieważ jest ona wymagana do pracy wdrożeń wsadowych. Poniższa definicja środowiska zawiera biblioteki wymagane do uruchomienia modelu za pomocą bibliotek TensorFlow.

    Definicja środowiska jest uwzględniana w samej definicji wdrożenia jako środowisko anonimowe.

    environment:
      name: batch-tensorflow-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    

    Użyty plik conda wygląda następująco:

    deployment-keras/environment/conda.yaml

    name: tensorflow-env
    channels:
      - conda-forge
    dependencies:
      - python=3.8.5
      - pip
      - pip:
        - pandas
        - tensorflow
        - pillow
        - azureml-core
        - azureml-dataset-runtime[fuse]
    
  2. Utwórz skrypt oceniania dla modelu:

    deployment-keras/code/batch_driver.py

    import os
    import numpy as np
    import pandas as pd
    import tensorflow as tf
    from typing import List
    from os.path import basename
    from PIL import Image
    from tensorflow.keras.models import load_model
    
    
    def init():
        global model
    
        # AZUREML_MODEL_DIR is an environment variable created during deployment
        model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
    
        # load the model
        model = load_model(model_path)
    
    
    def run(mini_batch: List[str]) -> pd.DataFrame:
        print(f"Executing run method over batch of {len(mini_batch)} files.")
    
        results = []
        for image_path in mini_batch:
            data = Image.open(image_path)
            data = np.array(data)
            data_batch = tf.expand_dims(data, axis=0)
    
            # perform inference
            pred = model.predict(data_batch)
    
            # Compute probabilities, classes and labels
            pred_prob = tf.math.reduce_max(tf.math.softmax(pred, axis=-1)).numpy()
            pred_class = tf.math.argmax(pred, axis=-1).numpy()
    
            results.append(
                {
                    "file": basename(image_path),
                    "class": pred_class[0],
                    "probability": pred_prob,
                }
            )
    
        return pd.DataFrame(results)
    
  3. Tworzenie definicji wdrożenia

    deployment-keras/deployment.yml

    $schema: https://azuremlschemas.azureedge.net/latest/modelBatchDeployment.schema.json
    name: mnist-keras-dpl
    description: A deployment using Keras with TensorFlow to solve the MNIST classification dataset.
    endpoint_name: mnist-batch
    type: model
    model: 
      name: mnist-classifier-keras
      path: model
    code_configuration:
      code: code
      scoring_script: batch_driver.py
    environment:
      name: batch-tensorflow-py38
      image: mcr.microsoft.com/azureml/openmpi4.1.0-ubuntu20.04:latest
      conda_file: environment/conda.yaml
    compute: azureml:batch-cluster
    resources:
      instance_count: 1
    settings:
      max_concurrency_per_instance: 2
      mini_batch_size: 10
      output_action: append_row
      output_file_name: predictions.csv
    
  4. 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 --file deployment-keras/deployment.yml --endpoint-name $ENDPOINT_NAME
    

    Napiwek

    Brak parametru --set-default w tym przypadku. Najlepszym rozwiązaniem dla scenariuszy produkcyjnych jest utworzenie nowego wdrożenia bez ustawiania go jako domyślnego. Następnie zweryfikuj je i zaktualizuj wdrożenie domyślne później.

Testowanie wdrożenia wsadowego innego niż domyślne

Aby przetestować nowe wdrożenie inne niż domyślne, musisz znać nazwę wdrożenia, które chcesz uruchomić.

DEPLOYMENT_NAME="mnist-keras-dpl"
JOB_NAME=$(az ml batch-endpoint invoke --name $ENDPOINT_NAME --deployment-name $DEPLOYMENT_NAME --input https://azuremlexampledata.blob.core.windows.net/data/mnist/sample --input-type uri_folder --query name -o tsv)

Powiadomienie --deployment-name służy do określania wdrożenia do wykonania. Ten parametr umożliwia invoke wdrożenie inne niż domyślne bez aktualizowania domyślnego wdrożenia punktu końcowego wsadowego.

Aktualizowanie domyślnego wdrożenia wsadowego

Chociaż można wywołać określone wdrożenie wewnątrz punktu końcowego, zazwyczaj należy wywołać sam punkt końcowy i pozwolić punktowi końcowemu zdecydować, którego wdrożenia użyć — domyślne wdrożenie. Możesz zmienić domyślne wdrożenie (a w związku z tym zmienić model obsługujący wdrożenie) bez zmiany umowy z użytkownikiem wywołującym punkt końcowy. Użyj następującego kodu, aby zaktualizować wdrożenie domyślne:

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

Usuwanie punktu końcowego wsadowego i wdrożenia

Jeśli nie będziesz używać starego wdrożenia wsadowego, usuń je, uruchamiając następujący kod. --yes służy do potwierdzania usunięcia.

az ml batch-deployment delete --name mnist-torch-dpl --endpoint-name $ENDPOINT_NAME --yes

Uruchom następujący kod, aby usunąć punkt końcowy wsadowy i wszystkie jego podstawowe wdrożenia. Zadania oceniania wsadowego nie zostaną usunięte.

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