Tworzenie skryptów oceniania dla wdrożeń 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 umożliwiają wdrażanie modeli, które wykonują długotrwałe wnioskowanie na dużą skalę. Podczas wdrażania modeli należy utworzyć i określić skrypt oceniania (znany również jako skrypt sterownika wsadowego), aby wskazać, jak używać go na danych wejściowych do tworzenia przewidywań. W tym artykule dowiesz się, jak używać skryptów oceniania we wdrożeniach modelu w różnych scenariuszach. Poznasz również najlepsze rozwiązania dotyczące punktów końcowych wsadowych.

Napiwek

Modele MLflow nie wymagają skryptu oceniania. Jest to automatycznie generowane dla Ciebie. Aby uzyskać więcej informacji na temat sposobu pracy punktów końcowych wsadowych z modelami MLflow, odwiedź dedykowany samouczek Używanie modeli MLflow we wdrożeniach wsadowych .

Ostrzeżenie

Aby wdrożyć model zautomatyzowanego uczenia maszynowego w punkcie końcowym wsadowym, należy pamiętać, że funkcja Automated ML udostępnia skrypt oceniania, który działa tylko dla punktów końcowych online. Ten skrypt oceniania nie jest przeznaczony do wykonywania wsadowego. Postępuj zgodnie z tymi wytycznymi, aby uzyskać więcej informacji na temat tworzenia skryptu oceniania dostosowanego do działania modelu.

Opis skryptu oceniania

Skrypt oceniania to plik języka Python (.py), który określa sposób uruchamiania modelu i odczytuje dane wejściowe przesyłane przez funkcję wykonawcy wdrożenia wsadowego. Każde wdrożenie modelu udostępnia skrypt oceniania (wraz ze wszystkimi innymi wymaganymi zależnościami) w czasie tworzenia. Skrypt oceniania zwykle wygląda następująco:

deployment.yml

code_configuration:
  code: code
  scoring_script: batch_driver.py

Skrypt oceniania musi zawierać dwie metody:

Metoda init

init() Użyj metody dla każdego kosztownego lub wspólnego przygotowania. Na przykład użyj go do załadowania modelu do pamięci. Początek całego zadania wsadowego wywołuje tę funkcję jednorazowo. Pliki modelu są dostępne w ścieżce określonej przez zmienną środowiskową AZUREML_MODEL_DIR. W zależności od tego, jak model został zarejestrowany, jego pliki mogą znajdować się w folderze. W następnym przykładzie model ma kilka plików w folderze o nazwie model. Aby uzyskać więcej informacji, odwiedź stronę , w jaki sposób można określić folder używany przez model.

def init():
    global model

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    # The path "model" is the name of the registered model's folder
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")

    # load the model
    model = load_model(model_path)

W tym przykładzie umieszczamy model w zmiennej globalnej model. Aby udostępnić zasoby wymagane do wnioskowania w funkcji oceniania, użyj zmiennych globalnych.

Metoda run

run(mini_batch: List[str]) -> Union[List[Any], pandas.DataFrame] Użyj metody , aby obsłużyć ocenianie każdej minisadowej partii generowanej przez wdrożenie wsadowe. Ta metoda jest wywoływana raz dla każdego mini_batch wygenerowanego dla danych wejściowych. Wdrożenia wsadowe odczytują dane w partiach zgodnie z konfiguracją wdrożenia.

import pandas as pd
from typing import List, Any, Union

def run(mini_batch: List[str]) -> Union[List[Any], pd.DataFrame]:
    results = []

    for file in mini_batch:
        (...)

    return pd.DataFrame(results)

Metoda odbiera listę ścieżek plików jako parametr (mini_batch). Tej listy można używać do iterowania i pojedynczego przetwarzania każdego pliku lub odczytywania całej partii i przetwarzania jej naraz. Najlepsza opcja zależy od pamięci obliczeniowej i przepływności potrzebnej do osiągnięcia. Przykład przedstawiający sposób odczytywania całych partii danych jednocześnie można znaleźć w artykule Wdrożenia o wysokiej przepływności.

Uwaga

Jak działa dystrybucja?

Wdrożenia wsadowe dystrybuują pracę na poziomie pliku, co oznacza, że folder zawierający 100 plików z minisadami 10 plików generuje 10 partii z 10 plików. Należy pamiętać, że rozmiary odpowiednich plików nie mają znaczenia. W przypadku plików zbyt dużych do przetworzenia w dużych minisadach zalecamy 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ę. W tej chwili wdrożenie wsadowe nie może uwzględniać niesymetryczności w dystrybucji rozmiaru pliku.

Metoda run() powinna zwracać bibliotekę Pandas DataFrame lub tablicę/listę. Każdy zwrócony element wyjściowy wskazuje jeden pomyślny przebieg elementu wejściowego w danych wejściowych mini_batch. W przypadku zasobów danych plików lub folderów każdy zwrócony wiersz/element reprezentuje przetworzony pojedynczy plik. W przypadku zasobu danych tabelarycznych każdy zwrócony wiersz/element reprezentuje wiersz w przetworzonym pliku.

Ważne

Jak pisać przewidywania?

run() Wszystkie zwracane funkcje zostaną dołączone do pliku przewidywania wyjściowego generowanego przez zadanie wsadowe. Ważne jest, aby zwrócić odpowiedni typ danych z tej funkcji. Zwraca tablice , gdy konieczne jest wyprowadzenie pojedynczego przewidywania. Zwracanie ramek danych biblioteki pandas, gdy trzeba zwrócić wiele informacji. Na przykład w przypadku danych tabelarycznych możesz dołączyć przewidywania do oryginalnego rekordu. W tym celu użyj ramki danych pandas. Mimo że ramka danych pandas może zawierać nazwy kolumn, plik wyjściowy nie zawiera tych nazw.

aby zapisywać przewidywania w inny sposób, można dostosować dane wyjściowe we wdrożeniach wsadowych.

Ostrzeżenie

run W funkcji nie wyświetlaj złożonych typów danych (ani list złożonych typów danych) zamiast pandas.DataFrame. Te dane wyjściowe zostaną przekształcone w ciągi i staną się trudne do odczytania.

Wynikowa ramka danych lub tablica jest dołączana do wskazanego pliku wyjściowego. Nie ma potrzeby kardynalności wyników. Jeden plik może wygenerować 1 lub wiele wierszy/elementów w danych wyjściowych. Wszystkie elementy w wynikowej ramce danych lub tablicy są zapisywane w pliku wyjściowym zgodnie z rzeczywistym użyciem (biorąc pod uwagę, że output_action element nie summary_onlyjest ).

Pakiety języka Python do oceniania

Musisz wskazać dowolną bibliotekę, której skrypt oceniania wymaga uruchomienia w środowisku, w którym jest uruchamiane wdrożenie wsadowe. W przypadku skryptów oceniania środowiska są wskazywane na wdrożenie. Zazwyczaj wymagania są wskazywane przy użyciu conda.yml pliku zależności, który może wyglądać następująco:

mnist/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]

Odwiedź stronę Tworzenie wdrożenia wsadowego, aby uzyskać więcej informacji na temat sposobu wskazywania środowiska dla modelu.

Pisanie przewidywań w inny sposób

Domyślnie wdrożenie wsadowe zapisuje przewidywania modelu w jednym pliku, jak wskazano we wdrożeniu. Jednak w niektórych przypadkach należy napisać przewidywania w wielu plikach. Na przykład w przypadku partycjonowanych danych wejściowych prawdopodobnie chcesz również wygenerować partycjonowane dane wyjściowe. W takich przypadkach można dostosować dane wyjściowe we wdrożeniach wsadowych , aby wskazać:

  • Format pliku (CSV, parquet, json itp.) używany do zapisywania przewidywań
  • Sposób partycjonowania danych w danych wyjściowych

Odwiedź stronę Dostosowywanie danych wyjściowych we wdrożeniach wsadowych , aby uzyskać więcej informacji na temat sposobu ich osiągnięcia.

Kontrola źródła skryptów oceniania

Zdecydowanie zaleca się umieszczenie skryptów oceniania pod kontrolą źródła.

Najlepsze rozwiązania dotyczące pisania skryptów oceniania

Podczas pisania skryptów oceniania obsługujących duże ilości danych należy wziąć pod uwagę kilka czynników, w tym

  • Rozmiar każdego pliku
  • Ilość danych w każdym pliku
  • Ilość pamięci wymaganej do odczytania każdego pliku
  • Ilość pamięci wymaganej do odczytu całej partii plików
  • Ślad pamięci modelu
  • Zużycie pamięci modelu podczas uruchamiania danych wejściowych
  • Dostępna pamięć w obliczeniach

Wdrożenia wsadowe dystrybuują pracę na poziomie pliku. Oznacza to, że folder zawierający 100 plików w minisadach 10 plików generuje 10 partii 10 plików każdy (niezależnie od rozmiaru zaangażowanych plików). W przypadku plików zbyt dużych do przetwarzania w dużych minisadach zalecamy 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ę. W tej chwili wdrożenie wsadowe nie może uwzględniać niesymetryczności w dystrybucji rozmiaru pliku.

Relacja między stopniem równoległości a skryptem oceniania

Konfiguracja wdrożenia kontroluje zarówno rozmiar każdej minisady, jak i liczbę procesów roboczych w każdym węźle. Staje się to ważne, gdy decydujesz, czy odczytywać całą minisadę do wnioskowania, uruchamiać plik wnioskowania według pliku, czy uruchamiać wiersz wnioskowania według wiersza (dla tabelarycznego). Aby uzyskać więcej informacji, odwiedź stronę Running inference at the mini-batch, file or the row level (Uruchamianie wnioskowania w minisadowym pliku lub na poziomie wiersza).

W przypadku uruchamiania wielu procesów roboczych w tym samym wystąpieniu należy uwzględnić fakt, że pamięć jest współdzielona przez wszystkich procesów roboczych. Zwiększenie liczby procesów roboczych na węzeł powinno zwykle towarzyszyć zmniejszeniu rozmiaru mini-partii lub przez zmianę strategii oceniania, jeśli rozmiar danych i jednostka SKU obliczeniowa pozostają takie same.

Uruchamianie wnioskowania na poziomie mini-batch, pliku lub wiersza

Punkty końcowe usługi Batch wywołają run() funkcję w skryfcie oceniania raz na minisadę. Można jednak zdecydować, czy chcesz uruchomić wnioskowanie w całej partii, w jednym pliku naraz, czy w jednym wierszu naraz dla danych tabelarycznych.

Poziom mini-partii

Zwykle należy uruchamiać wnioskowanie w partii jednocześnie, aby osiągnąć wysoką przepływność w procesie oceniania wsadowego. Dzieje się tak, jeśli uruchamiasz wnioskowanie na procesorze GPU, w którym chcesz osiągnąć nasycenie urządzenia wnioskowania. Możesz również polegać na module ładującym dane, który może obsługiwać przetwarzanie wsadowe, jeśli dane nie mieszczą się w pamięci, na przykład TensorFlow lub PyTorch moduły ładujące dane. W takich przypadkach możesz chcieć uruchomić wnioskowanie w całej partii.

Ostrzeżenie

Uruchamianie wnioskowania na poziomie partii może wymagać ścisłej kontroli nad rozmiarem danych wejściowych, aby poprawnie uwzględnić wymagania dotyczące pamięci i uniknąć wyjątków braku pamięci. Niezależnie od tego, czy można załadować całą minisadę w pamięci, zależy od rozmiaru mini-partii, rozmiaru wystąpień w klastrze, liczby procesów roboczych w każdym węźle oraz rozmiaru mini-partii.

Odwiedź stronę Wdrożenia o wysokiej przepływności, aby dowiedzieć się, jak to osiągnąć. Ten przykład przetwarza całą partię plików jednocześnie.

Poziom pliku

Jednym z najprostszych sposobów wnioskowania jest iteracja we wszystkich plikach w minisadowej partii, a następnie uruchomienie modelu nad nim. W niektórych przypadkach na przykład przetwarzanie obrazów może być dobrym pomysłem. W przypadku danych tabelarycznych może być konieczne dokonanie dobrego oszacowania liczby wierszy w każdym pliku. To oszacowanie może pokazać, czy model może obsłużyć wymagania dotyczące pamięci, aby załadować całe dane do pamięci i przeprowadzić wnioskowanie na ich podstawie. Niektóre modele (zwłaszcza te oparte na cyklicznych sieciach neuronowych) rozwijają się i przedstawiają ślad pamięci z potencjalnie nieliniową liczbą wierszy. W przypadku modelu z wysokim kosztem pamięci rozważ uruchomienie wnioskowania na poziomie wiersza.

Napiwek

Rozważ podzielenie plików za dużych, aby odczytać jednocześnie wiele mniejszych plików, aby uwzględnić lepszą równoległość.

Odwiedź stronę Przetwarzanie obrazów przy użyciu wdrożeń wsadowych , aby dowiedzieć się, jak to zrobić. Ten przykład przetwarza plik naraz.

Poziom wiersza (tabelaryczny)

W przypadku modeli, które stanowią wyzwania związane z rozmiarami danych wejściowych, możesz chcieć uruchomić wnioskowanie na poziomie wiersza. Wdrożenie wsadowe nadal udostępnia skrypt oceniania z minisadową partią plików. Jednak odczytasz jeden plik, jeden wiersz naraz. Może to wydawać się nieefektywne, ale w przypadku niektórych modeli uczenia głębokiego może to być jedyny sposób wnioskowania bez skalowania zasobów sprzętowych.

Odwiedź stronę Przetwarzanie tekstu przy użyciu wdrożeń wsadowych , aby dowiedzieć się, jak to zrobić. Ten przykład przetwarza wiersz w danym momencie.

Używanie modeli, które są folderami

Zmienna AZUREML_MODEL_DIR środowiskowa zawiera ścieżkę do wybranej lokalizacji modelu, a init() funkcja zwykle używa jej do załadowania modelu do pamięci. Jednak niektóre modele mogą zawierać pliki w folderze i może być konieczne ich uwzględnienie podczas ich ładowania. Możesz zidentyfikować strukturę folderów modelu, jak pokazano poniżej:

  1. Przejdź do witryny Azure Machine Edukacja Portal.

  2. Przejdź do sekcji Modele.

  3. Wybierz model, który chcesz wdrożyć, a następnie wybierz kartę Artefakty .

  4. Zanotuj wyświetlony folder. Ten folder został wskazany podczas rejestrowania modelu.

    Zrzut ekranu przedstawiający folder, w którym znajdują się artefakty modelu.

Użyj tej ścieżki, aby załadować model:

def init():
    global model

    # AZUREML_MODEL_DIR is an environment variable created during deployment
    # The path "model" is the name of the registered model's folder
    model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")

    model = load_model(model_path)

Następne kroki