Prototypowanie do produkcji: uzyskiwanie prognoz z niestandardowo wytrenowanych modeli

1. Omówienie

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

Ten moduł należy do serii filmów Prototyp – produkcja. Zanim przejdziesz do tego modułu, ukończ poprzedni moduł laboratoryjny. Aby dowiedzieć się więcej, możesz obejrzeć film:

.

Czego się nauczysz

Poznasz takie zagadnienia jak:

  • Przesyłanie modeli do Vertex AI Model Registry
  • Wdrażanie modelu w punkcie końcowym
  • Uzyskiwanie prognoz online i zbiorczych za pomocą interfejsu użytkownika i SDK

Łączny koszt przeprowadzenia tego laboratorium w Google Cloud wynosi około 1 USD.

2. Wprowadzenie do Vertex AI

Ten moduł wykorzystuje najnowszą ofertę usług AI dostępną w Google Cloud. Vertex AI integruje rozwiązania ML w Google Cloud, zapewniając bezproblemowe środowisko programistyczne. Wcześniej modele wytrenowane za pomocą AutoML i modele niestandardowe były dostępne za pomocą oddzielnych usług. Nowa oferta łączy oba te interfejsy API z innymi nowymi usługami. Możesz też przenieść istniejące projekty do Vertex AI.

Vertex AI zawiera wiele różnych usług, które obsługują kompleksowe przepływy pracy ML. W tym module skupimy się na usługach wymienionych poniżej: PredictionsWorkbench.

Omówienie usługi Vertex

3. Konfigurowanie środowiska

Aby skonfigurować środowisko, wykonaj czynności opisane w laboratorium Trenowanie niestandardowych modeli za pomocą Vertex AI.

4. Przesyłanie modelu do rejestru

Zanim użyjemy modelu do uzyskiwania prognoz, musimy go przesłać do rejestru modeli Vertex AI, czyli repozytorium, w którym można 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 zapiszesz artefakty modelu w zasobniku Cloud Storage. Tę opcję użyjemy w tym module.

W konsoli przejdź do sekcji Modele.

model menu

Kliknij Importuj.

import_model

Kliknij Zaimportuj jako nowy model, a następnie podaj nazwę modelu.

new_model

W sekcji Ustawienia modelu zaimportuj model za pomocą gotowego kontenera i użyj TensorFlow 2.8. Pełną listę wstępnie utworzonych 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 on 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ą.

Po zaimportowaniu modelu 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 ze swojego 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. Wdrażanie modelu w punkcie końcowym

W Vertex AI możemy wykonywać 2 rodzaje zadań prognozowania: zbiorcze i online.

Prognoza zbiorcza to żądanie asynchroniczne. Przydaje się to, gdy nie potrzebujesz natychmiastowej odpowiedzi i chcesz przetworzyć zgromadzone dane w jednym żądaniu.

Jeśli natomiast chcesz uzyskać prognozy z minimalnym opóźnieniem na podstawie danych przekazywanych do modelu w bieżącym czasie, użyj prognozowania online.

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

Jeśli jednak chcemy otrzymywać prognozy online, musimy wdrożyć model w punkcie końcowym. Spowoduje to powiązanie zapisanych artefaktów modelu z zasobami fizycznymi na potrzeby przewidywań o krótkim czasie oczekiwania.

Aby wdrożyć model na punkcie końcowym, kliknij 3 kropki w prawym górnym rogu modelu, a potem wybierz Wdróż na punkcie końcowym.

deploy_model

Nadaj punktowi końcowemu nazwę, a pozostałe ustawienia pozostaw bez zmian i kliknij DALEJ.

endpoint_name

Punkty końcowe obsługują autoskalowanie, co oznacza, że możesz ustawić minimalną i maksymalną liczbę węzłów obliczeniowych, a te będą się skalować, aby zaspokoić zapotrzebowanie na ruch w ramach tych wartości.

Ponieważ ten moduł ma charakter demonstracyjny i nie będziemy używać tego punktu końcowego do obsługi dużego ruchu, możesz ustawić Maksymalną liczbę obliczeń na 1, a jako Typ maszyny wybrać n1-standard-4.

endpoint_compute

Pomijamy temat monitorowania modelu, ale jeśli chcesz dowiedzieć się więcej o tej funkcji, zapoznaj się z dokumentacją.

Następnie kliknij WDRÓŻ.

Wdrożenie zajmie kilka minut. Gdy się zakończy, zobaczysz, że stan wdrożenia modelu zmienił się na Wdrożono w Vertex AI.

Jeśli chcesz wdrożyć model za pomocą pakietu SDK, uruchom podane niżej 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.

Na potrzeby demonstracji wywołamy ten punkt końcowy z Workbench.

Wróć do notatnika utworzonego w poprzednim module. W menu utwórz nowy notatnik TensorFlow 2.

tf_kernel

Zaimportuj pakiet Vertex AI SDK dla Pythona, 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.

test_image

Najpierw określ 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 jest to inny identyfikator niż identyfikator projektu.

project_number

Poniższy kod otwiera obraz i zmienia jego rozmiar za pomocą biblioteki PIL.

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

Następnie przekonwertuj dane numpy na typ float32 i na listę. Przekształcamy je na listę, ponieważ danych numpy nie można serializować w formacie JSON, więc nie możemy ich wysyłać w ciele żądania.

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

Na koniec zadzwoń pod numer endpoint.predict.

endpoint.predict(instances=x_test).predictions

Wynik to dane wyjściowe modelu, czyli warstwa softmax z 5 jednostkami. Jeśli chcesz zastosować logikę niestandardową, aby zwracać etykietę ciągu znaków zamiast indeksu, możesz użyć rutyn niestandardowych prognozowania.

Prognozy zbiorcze

Dane do prognozowania zbiorczego można formatować na różne sposoby. Dla uproszczenia zapiszemy dane numpy w 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. Jest to podobne do definiowania punktu końcowego, z tym że zamiast elementu ENDPOINT_ID należy podać element MODEL_ID.

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

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

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ę serwowania TensorFlow, aby dekodowała bajty obrazu. Wymaga to nieco więcej pracy, ale znacznie usprawnia tworzenie większych obrazów i aplikacji. Przykład znajdziesz w tym notatniku.

🎉 Gratulacje! 🎉

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

  • Przesyłanie modeli do rejestru modeli Vertex AI
  • Uzyskiwanie 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ć, wycofaj je z punktu końcowego. Możesz też całkowicie usunąć punkt końcowy. W razie potrzeby możesz w każdej chwili ponownie wdrożyć model w punkcie końcowym.

undeploy_model

Notebooki zarządzane przez Workbench są automatycznie wyłączane po 180 minutach bezczynności, więc nie musisz się martwić o wyłączanie instancji. Jeśli chcesz ręcznie wyłączyć instancję, w konsoli Vertex AI Workbench kliknij przycisk Zatrzymaj. Jeśli chcesz całkowicie usunąć zeszyt, kliknij przycisk Usuń.

Zatrzymaj instancję

Aby usunąć zasobnik Cloud Storage, w menu nawigacyjnym konsoli Cloud przejdź do usługi Storage, wybierz zasobnik i kliknij Usuń:

Usuń miejsce na dane