Prototypowanie do produkcji: uzyskiwanie prognoz z niestandardowo wytrenowanych modeli

1. Omówienie

W tym module użyjesz Vertex AI do pobierania prognoz online i zbiorczych z wytrenowanego niestandardowo modelu.

Ten moduł jest częścią serii filmów Prototype to Production. Zanim rozpoczniesz ten moduł, ukończ poprzedni moduł. Aby dowiedzieć się więcej, możesz obejrzeć ten film:

.

Czego się nauczysz

Poznasz takie zagadnienia jak:

  • Przesyłanie modeli do Vertex AI Model Registry
  • Wdrażanie modelu w punkcie końcowym
  • Generuj prognozy online i zbiorcze za pomocą interfejsu użytkownika i pakietu SDK

Całkowity koszt uruchomienia tego modułu w Google Cloud wynosi około 1 USD.

2. Wprowadzenie do Vertex AI

W tym module wykorzystano najnowszą ofertę usług AI dostępną w Google Cloud. Vertex AI integruje ofertę systemów uczących się z całego Google Cloud, tworząc bezproblemowe środowisko programistyczne. Wcześniej modele wytrenowane z użyciem AutoML i modele niestandardowe były dostępne w oddzielnych usługach. Nowa oferta jest łączona w 1 interfejs API wraz z innymi nowymi usługami. Możesz też przenieść istniejące projekty do Vertex AI.

Vertex AI obejmuje wiele różnych usług, które obsługują kompleksowe przepływy pracy ML. W tym module skupimy się na wyróżnionych poniżej usługach: Prognozy i Workbench.

Omówienie usługi Vertex

3. Konfigurowanie środowiska

Wykonaj czynności opisane w module Trenowanie modeli niestandardowych przy użyciu Vertex AI, aby skonfigurować środowisko.

4. Przesyłanie modelu do rejestru

Aby używać naszego modelu do uzyskiwania prognoz, musimy go przesłać do Vertex AI Model Registry, czyli repozytorium, w którym możesz zarządzać cyklem życia modeli ML.

Możesz przesyłać modele podczas konfigurowania niestandardowego zadania trenowania, jak pokazano poniżej.

training_prediction

Możesz też importować modele po zakończeniu zadania trenowania, o ile zapisane artefakty modelu będą przechowywane w zasobniku Cloud Storage. Tę opcję użyjemy w tym module.

Otwórz w konsoli sekcję Modele.

menu modelu

Wybierz IMPORTUJ.

import_model

Wybierz Importuj jako nowy model, a następnie podaj nazwę modelu.

new_model

W sekcji Ustawienia modelu zaimportuj model z gotowym kontenerem i użyj TensorFlow 2.8. Pełną listę gotowych kontenerów prognozowania znajdziesz tutaj.

Następnie podaj ścieżkę do zasobnika Cloud Storage, w którym zostały zapisane artefakty modelu w niestandardowym zadaniu trenowania. Powinien wyglądać mniej więcej tak: gs://{PROJECT_ID}-bucket/model_output

Pominiemy sekcję wyjaśnialności, ale jeśli chcesz dowiedzieć się więcej o Vertex Explainable AI, zapoznaj się z dokumentacją.

Gdy model zostanie zaimportowany, zobaczysz go w rejestrze.

flower_model

Uwaga: jeśli chcesz to zrobić za pomocą pakietu SDK, a nie w interfejsie, możesz przesłać model, uruchamiając podane niżej instrukcje z notatnika Workbench.

from google.cloud import aiplatform

my_model = aiplatform.Model.upload(display_name='flower-model',
                                  artifact_uri='gs://{PROJECT_ID}-bucket/model_output',
                                  serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')

5. Wdróż model w punkcie końcowym

W Vertex AI można uruchomić 2 typy zadań prognozowania: wsadowe i online.

Prognozowanie zbiorcze jest żądaniem asynchronicznym. Przydaje się to, gdy nie potrzebujesz natychmiastowej odpowiedzi i chcesz przetworzyć zgromadzone dane w jednym żądaniu.

Z drugiej strony, jeśli chcesz otrzymywać prognozy o krótkim czasie oczekiwania na podstawie danych przekazywanych do modelu na bieżąco, użyj prognozowania online.

Teraz, gdy model znajduje się w rejestrze, może go używać do prognoz zbiorczych.

Jeśli jednak chcemy uzyskać prognozy online, będziemy musieli wdrożyć model w punkcie końcowym. Powoduje to powiązanie zapisanych artefaktów modelu z zasobami fizycznymi na potrzeby prognoz z krótkim czasem oczekiwania.

Aby wdrożyć model w punkcie końcowym, kliknij 3 kropki z prawej strony modelu, a następnie wybierz Wdróż w punkcie końcowym.

deploy_model

Nazwij punkt końcowy, a następnie pozostaw pozostałe ustawienia bez zmian i kliknij DALEJ.

endpoint_name

Punkty końcowe obsługują autoskalowanie, co oznacza, że możesz ustawić minimalną i maksymalną wartość, a węzły obliczeniowe będą skalowane tak, aby sprostać zapotrzebowaniu na ruch w tych granicach.

Ten moduł służy tylko do demonstracji, a nie będziemy używać tego punktu końcowego do dużego natężenia ruchu, dlatego możesz ustawić Maksymalną liczbę notatek obliczeniowych na 1, a jako Typ maszyny wybrać n1-standard-4.

endpoint_compute

Pominiemy monitorowanie modeli, ale jeśli chcesz dowiedzieć się więcej o tej funkcji, zapoznaj się z dokumentacją.

Następnie kliknij WDRÓŻ.

Wdrażanie może potrwać kilka minut, ale po zakończeniu zobaczysz, że stan wdrożenia modelu zmienił się na Wdrożony w Vertex AI.

Jeśli chcesz wdrożyć model za pomocą pakietu SDK, uruchom poniższe polecenie.

my_model = aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}") 

endpoint = my_model.deploy(
     deployed_model_display_name='my-endpoint',
     traffic_split={"0": 100},
     machine_type="n1-standard-4",
     accelerator_count=0,
     min_replica_count=1,
     max_replica_count=1,
   )

6. Pobieraj prognozy

Prognozy online

Po wdrożeniu modelu w punkcie końcowym możesz go uruchomić tak samo jak każdy inny punkt końcowy spoczynku. Oznacza to, że możesz wywołać go za pomocą funkcji w Cloud Functions, czatbota, aplikacji internetowej itp.

Do celów demonstracyjnych będziemy nazywać ten punkt końcowy z Workbench.

Wróć do notatnika utworzonego w poprzednim module. W programie uruchamiającym utwórz nowy notatnik TensorFlow 2.

tf_kernel

Importowanie pakietu SDK Vertex AI Python, numpy i PIL

from google.cloud import aiplatform

import numpy as np
from PIL import Image

Pobierz poniższy obraz i prześlij go do instancji obszaru roboczego. Przetestujemy model na tym zdjęciu mniszka lekarskiego.

test_image

Najpierw zdefiniuj punkt końcowy. Musisz zastąpić te elementy: {PROJECT_NUMBER} i {ENDPOINT_ID} poniżej.

endpoint = aiplatform.Endpoint(
    endpoint_name="projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")

Identyfikator punktu końcowego (point_id) znajdziesz w sekcji Punkty końcowe w Cloud Console.

endpoint_id

Numer projektu znajdziesz na stronie głównej konsoli. Pamiętaj, że różni się on od identyfikatora projektu.

numer_projektu

Poniższy kod otworzy się i zmieni rozmiar obrazu za pomocą PIL.

IMAGE_PATH = "test-image.jpg"
im = Image.open(IMAGE_PATH)

Następnie przekonwertuj dane numpy na typ float32 i na listę. Przekształcamy w listę, ponieważ dane numpy nie są serializowalne w formacie JSON, więc nie możemy wysłać ich w treści żądania.

x_test = np.asarray(im).astype(np.float32).tolist()

Na koniec zadzwoń pod numer endpoint.predict.

endpoint.predict(instances=x_test).predictions

Otrzymany wynik to dane wyjściowe modelu, czyli warstwa softmax z 5 jednostkami. Jeśli chcesz napisać niestandardową logikę zwracającą etykietę ciągu zamiast indeksu, możesz użyć niestandardowych procedur prognozowania.

Prognozy zbiorcze

Są różne sposoby formatowania danych na potrzeby prognozowania zbiorczego. Dla uproszczenia skopiujemy dane numpy do pliku json i zapiszemy go w Cloud Storage.

with open('test-data.json', 'w') as fp:
    json.dump(x_test, fp)

!gsutil cp test-data.json gs://{YOUR_BUCKET}

Następnie zdefiniuj model. Przypomina to definiowanie punktu końcowego z tą różnicą, że musisz podać MODEL_ID zamiast ENDPOINT_ID.

my_model=aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}") 

Aby znaleźć identyfikator modelu, wybierz nazwę i wersję modelu w sekcji Modele, a potem kliknij SZCZEGÓŁY WERSJI.

model_id

Na koniec użyj pakietu SDK, aby wywołać zadanie prognozowania zbiorczego, przekazując ścieżkę Cloud Storage zawierającą plik json, w której znajduje się plik json, oraz podając lokalizację w Cloud Storage, w której mają być przechowywane wyniki prognozy.

batch_prediction_job = my_model.batch_predict(
    job_display_name='flower_batch_predict',
    gcs_source='gs://{YOUR_BUCKET}/test-data.json',
    gcs_destination_prefix='gs://{YOUR_BUCKET}/prediction-results',
    machine_type='n1-standard-4',)

Postęp zadania możesz śledzić w sekcji Prognozy zbiorcze w konsoli. Pamiętaj, że uruchomienie zadania prognozowania zbiorczego dla pojedynczego obrazu nie jest wydajne.

batch_pred

Co dalej?

W tym przykładzie przed wywołaniem prognozy przekonwertowaliśmy obraz testowy na kod NumPy. W bardziej realistycznych przypadkach lepiej wysyłać obraz bez potrzeby wczytywania go do NumPy. Aby to zrobić, musisz dostosować funkcję obsługi TensorFlow, tak aby dekodować bajty obrazów. Wymaga to nieco więcej pracy, ale działa znacznie efektywniej w przypadku większych obrazów i tworzenia aplikacji. W tym notatniku znajdziesz przykład.

🎉 Gratulacje! 🎉

Wiesz już, jak używać Vertex AI do:

  • Przesyłanie modeli do rejestru modeli Vertex AI
  • Otrzymywanie prognoz zbiorczych i online

Więcej informacji o różnych częściach Vertex znajdziesz w dokumentacji.

7. Czyszczenie

Jeśli nie zamierzasz ich używać, warto wycofać wdrożenie modeli z punktu końcowego. Możesz też całkowicie usunąć punkt końcowy. W razie potrzeby zawsze możesz ponownie wdrożyć model w punkcie końcowym.

undeploy_model

Limit czasu zarządzanych notatników Workbench automatycznie wygasa po 180 minutach bezczynności, więc nie musisz się martwić o wyłączenie instancji. Jeśli chcesz ręcznie wyłączyć instancję, kliknij przycisk Zatrzymaj w sekcji Vertex AI Workbench w konsoli. Jeśli chcesz całkowicie usunąć notatnik, kliknij przycisk Usuń.

Zatrzymaj instancję

Aby usunąć zasobnik na dane, w menu nawigacyjnym w konsoli Google Cloud otwórz Cloud Storage, wybierz swój zasobnik i kliknij Usuń:

Usuń miejsce na dane