Udostępnij przez


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ć modelu na danych wejściowych do tworzenia przewidywań. Z tego artykułu 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. Usługa automatycznie je generuje. 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 zautomatyzowane uczenie maszynowe udostępnia skrypt oceniania, który działa tylko dla punktów końcowych online. Ten skrypt oceniania nie jest przeznaczony do wykonywania wsadowego. Aby uzyskać więcej informacji na temat tworzenia skryptu oceniania dostosowanego do działania modelu, zobacz poniższe wskazówki.

Opis skryptu oceniania

Skrypt oceniania to plik Python (.py), który określa, jak uruchomić model i odczytywać dane wejściowe przesłane przez wykonawcę 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 sposobu rejestrowania modelu 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 model jest umieszczany 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 przetwarzają dane wsadowo 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 przetwarzania w dużych minisadach podziel pliki na mniejsze pliki, aby osiągnąć wyższy poziom równoległości lub zmniejszyć liczbę 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?

Wszystko, co run() zwraca funkcja, jest dołączane do pliku prognoz wyjściowych generowanych 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 biblioteki pandas może zawierać nazwy kolumn, plik wyjściowy nie zawiera tych nazw.

Aby zapisywać przewidywania w inny sposób, możesz 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 są przekształcane na ciągi i stają 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ć jeden 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 służących do oceniania wskaż środowiska dla każdego wdrożenia. 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

Aby uzyskać więcej informacji, zobacz Dostosowywanie danych wyjściowych we wdrożeniach wsadowych.

Kontrola źródła skryptów oceniania

Umieść skrypty 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. Ta dystrybucja oznacza, ż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 podziel pliki na mniejsze pliki, aby osiągnąć wyższy poziom równoległości lub zmniejszyć liczbę 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. Ta konfiguracja ma znaczenie, gdy zdecydujesz, czy odczytywać całą mini-partię do przeprowadzenia wnioskowania, przeprowadzać wnioskowanie plik po pliku, czy przeprowadzać wnioskowanie wiersz po wierszu (dla tabelarycznego). Aby uzyskać więcej informacji, zobacz Running inference at the mini-batch, file, or row level (Uruchamianie wnioskowania na poziomie mini-batch, pliku lub wiersza).

Podczas uruchamiania wielu procesów roboczych w tym samym wystąpieniu należy pamiętać, że wszyscy pracownicy współdzielą pamięć. Jeśli zwiększysz liczbę pracowników na węzeł, zazwyczaj należy zmniejszyć rozmiar miniserii lub zmienić strategię oceny, jeśli rozmiar danych i SKU obliczeniowe pozostaną 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

Zazwyczaj wnioskowanie jest uruchamiane w całej partii, aby osiągnąć wysoką przepływność w procesie oceniania wsadowego. Takie podejście działa dobrze, jeśli uruchamiasz wnioskowanie na procesorze graficznym (GPU), w którym chcesz maksymalnie wykorzystać urządzenie 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, takie jak ładowarki danych TensorFlow lub PyTorch. W takich przypadkach uruchamiasz inferencję na 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 iterowanie po wszystkich plikach w mini-partii, a następnie uruchomienie modelu dla każdego pliku. W niektórych przypadkach, takich jak przetwarzanie obrazów, to podejście działa dobrze. W przypadku danych tabelarycznych należy oszacować liczbę wierszy w każdym pliku. To oszacowanie pokazuje, 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 jego 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, które są zbyt duże, aby odczytać jednocześnie wiele mniejszych plików, aby poprawić 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 odczytujesz jeden plik, jeden wiersz naraz. Takie podejście może 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. Funkcja init() 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 uwzględnienie tej struktury podczas ich ładowania. Możesz zidentyfikować strukturę folderów modelu, jak pokazano poniżej:

  1. Przejdź do portalu usługi Azure Machine Learning.

  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 jest wskazywany 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