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_only
jest ).
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:
Przejdź do portalu usługi Azure Machine Learning.
Przejdź do sekcji Modele.
Wybierz model, który chcesz wdrożyć, a następnie wybierz kartę Artefakty .
Zanotuj wyświetlony folder. Ten folder został wskazany podczas rejestrowania 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)