Prototypowanie modeli w notatnikach AI Platform

1. Omówienie

W tym module poznasz różne narzędzia w notebookach AI Platform, które służą do eksplorowania danych i tworzenia prototypów modeli ML.

Czego się nauczysz

Poznasz takie zagadnienia jak:

  • Tworzenie i dostosowywanie instancji notatników AI Platform
  • Śledź kod swoich notatników za pomocą Gita zintegrowanego bezpośrednio z notatnikami AI Platform
  • Korzystanie z narzędzia What-If w notatniku

Łączny koszt przeprowadzenia tego laboratorium w Google Cloud wynosi około 1 USD. Szczegółowe informacje o cenach notatników AI Platform znajdziesz tutaj.

2. Tworzenie instancji notatników AI Platform

Aby uruchomić to ćwiczenie, musisz mieć projekt Google Cloud Platform z włączonym rozliczeniem. Aby utworzyć projekt, wykonaj te instrukcje.

Krok 2. Włącz interfejs Compute Engine API

Przejdź do Compute Engine i wybierz Włącz, jeśli usługa nie jest jeszcze włączona. Potrzebujesz go do utworzenia instancji notatnika.

Krok 3. Utwórz instancję notatnika

W konsoli Cloud Console otwórz sekcję AI Platform Notebooks i kliknij Nowa instancja. Następnie wybierz najnowszy typ instancji TensorFlow 2 Enterprise bez procesorów graficznych:

9f2bb4dec1ba4f4f.png

Nazwij instancję lub użyj nazwy domyślnej. Następnie przyjrzymy się opcjom dostosowywania. Kliknij przycisk Dostosuj:

63be602ba45ca7c9.png

Notebooki AI Platform mają wiele opcji dostosowywania, takich jak region, w którym jest wdrażana instancja, typ obrazu, rozmiar maszyny, liczba GPU itp. Użyjemy domyślnych ustawień regionu i środowiska. W konfiguracji maszyny użyjemy maszyny n1-standard-8:

27101d232f765a17.png

Nie dodamy żadnych kart graficznych. Użyjemy domyślnych ustawień dysku rozruchowego, sieci i uprawnień. Aby utworzyć instancję, kliknij Utwórz. Ich wykonanie może potrwać kilka minut.

Po utworzeniu instancji w interfejsie Notebooks obok niej pojawi się zielony znacznik wyboru. Kliknij Otwórz JupyterLab, aby otworzyć instancję i rozpocząć tworzenie prototypu:

3598f414887ea9a8.png

Po otwarciu instancji utwórz nowy katalog o nazwie codelab. To katalog, z którego będziemy korzystać w tym laboratorium:

c16a821546acd92.png

Kliknij dwukrotnie nowo utworzony katalog codelab, a następnie w menu wybierz notatnik Python 3:

4390b1614ae8eae4.png

Zmień nazwę notatnika na demo.ipynb lub dowolną inną nazwę.

Krok 4. Zaimportuj pakiety Pythona

Utwórz nową komórkę w notatniku i zaimportuj biblioteki, których użyjemy w tym CodeLab:

import pandas as pd
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense

import numpy as np
import json

from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
from google.cloud import bigquery
from witwidget.notebook.visualization import WitWidget, WitConfigBuilder

3. Łączenie danych BigQuery z notatnikiem

BigQuery, hurtownia danych Google Cloud, udostępniła publicznie wiele zbiorów danych, które możesz eksplorować. Notebooki AI Platform obsługują bezpośrednią integrację z BigQuery bez konieczności uwierzytelniania.

W tym module użyjemy zbioru danych o urodzeniach. Zawiera on dane dotyczące prawie wszystkich urodzeń w Stanach Zjednoczonych w ciągu 40 lat, w tym wagę urodzeniową dziecka i informacje demograficzne o jego rodzicach. Do przewidywania masy urodzeniowej dziecka użyjemy podzbioru funkcji.

Krok 1. Pobierz dane BigQuery do naszego notebooka

Do pobrania danych do obiektu DataFrame w Pandas użyjemy biblioteki klienta BigQuery w Pythonie. Pierwotny zbiór danych ma 21 GB i zawiera 123 mln wierszy. Dla uproszczenia użyjemy tylko 10 tys. wierszy z danych.

Utwórz zapytanie i wyświetl podgląd otrzymanego DataFrame za pomocą tego kodu. Tutaj otrzymujemy 4 cechy z pierwotnego zbioru danych wraz z wagą dziecka (czyli z wartością, którą będzie przewidywać nasz model). Zbiór danych obejmuje wiele lat, ale w przypadku tego modelu użyjemy tylko danych z lat 2000 i późniejszych:

query="""
SELECT
  weight_pounds,
  is_male,
  mother_age,
  plurality,
  gestation_weeks
FROM
  publicdata.samples.natality
WHERE year > 2000
LIMIT 10000
"""
df = bigquery.Client().query(query).to_dataframe()
df.head()

Aby uzyskać podsumowanie parametrów liczbowych w naszym zbiorze danych, uruchom:

df.describe()

W przypadku kolumn liczbowych widać średnią, odchylenie standardowe, minimalną wartość i inne dane. Na koniec sprawdźmy dane z kolumny logicznej określającej płeć dziecka. Możemy to zrobić za pomocą metody Pandas value_counts:

df['is_male'].value_counts()

Wygląda na to, że zbiór danych jest prawie zrównoważony pod względem płci (50/50).

Krok 2. Przygotuj zbiór danych do trenowania

Po pobraniu zbioru danych do notebooka jako DataFrame w bibliotece Pandas możemy przeprowadzić wstępne przetwarzanie i podzielić zbiór na zbiór treningowy i testowy.

Najpierw usuń z danych wiersze z wartościami pustymi i je pomieszaj:

df = df.dropna()
df = shuffle(df, random_state=2)

Następnie wyodrębnij kolumnę etykiety do osobnej zmiennej i utwórz DataFrame tylko z naszych atrybutami. Ponieważ is_male jest wartością logiczną, przekształcimy ją na liczbę całkowitą, aby wszystkie dane wejściowe do modelu były liczbowe:

labels = df['weight_pounds']
data = df.drop(columns=['weight_pounds'])
data['is_male'] = data['is_male'].astype(int)

Jeśli teraz wyświetlisz podgląd naszego zbioru danych, wykonując polecenie data.head(), zobaczysz 4 cechy, których użyjemy do trenowania.

4. Inicjowanie git

Notatniki AI Platform są bezpośrednio zintegrowane z Gita, dzięki czemu możesz zarządzać wersjami bezpośrednio w środowisku notebooka. Umożliwia to akceptowanie kodu bezpośrednio w interfejsie notatnika lub za pomocą terminala dostępnego w JupyterLab. W tej sekcji zainicjujemy repozytorium Git w notatniku i zrealizujemy pierwsze potwierdzenie za pomocą interfejsu użytkownika.

Krok 1. Inicjuj repozytorium Git

W katalogu codelab wybierz Git, a następnie Init na górnym pasku menu w JupyterLab:

d9f1729358f18e58.png

Gdy pojawi się pytanie, czy chcesz, aby ten katalog był repozytorium Git, wybierz Tak. Następnie na pasku bocznym kliknij ikonę Git, aby sprawdzić stan plików i zapisanych zmian:

1648d6828f11a6db.png

Krok 2. Wykonaj pierwsze potwierdzenie

W tym interfejsie możesz dodawać pliki do zatwierdzenia, wyświetlać różnice między plikami (omówimy to później) i zatwierdzać zmiany. Zacznijmy od zacommitowania właśnie dodanego pliku z notatnikiem.

Zaznacz pole obok pliku ze skoropisem demo.ipynb, aby zainicjować go do zatwierdzenia (możesz zignorować katalog .ipynb_checkpoints/). Wpisz wiadomość o zapisu w polu tekstowym, a potem kliknij znacznik wyboru, aby zapisać zmiany:

fe7366522a3a268f.png

Gdy pojawi się taka prośba, wpisz swoje imię i nazwisko oraz adres e-mail. Następnie wróć do karty Historia, aby zobaczyć pierwsze potwierdzenie:

d03567c3592afb77.png

Pamiętaj, że zrzuty ekranu mogą się różnić od Twojego interfejsu z powodu aktualizacji wprowadzonych od czasu opublikowania tego laboratorium.

5. Tworzenie i trenowanie modelu TensorFlow

Aby utworzyć model przewidujący wagę dziecka, użyjemy zbioru danych BigQuery o porodach pobranego do naszego notebooka. W tym module skupimy się na narzędziach notebooka, a nie na dokładności samego modelu.

Krok 1. Podziel dane na zbiory do trenowania i testowania

Przed utworzeniem modelu użyjemy narzędzia Scikit Learn train_test_split do podziału danych:

x,y = data,labels
x_train,x_test,y_train,y_test = train_test_split(x,y)

Teraz możesz utworzyć model TensorFlow.

Krok 2. Utwórz i trenowanie modelu TensorFlow

Ten model będziemy tworzyć za pomocą interfejsu API modelu tf.keras Sequential, który umożliwia zdefiniowanie modelu jako zestawu warstw. Tutaj znajdziesz cały kod potrzebny do zbudowania modelu:

model = Sequential([
    Dense(64, activation='relu', input_shape=(len(x_train.iloc[0]),)),
    Dense(32, activation='relu'),
    Dense(1)]
)

Następnie skompilujemy model, aby go wytrenować. Tutaj wybierzemy optymalizator modelu, funkcję utraty i dane, które mają być rejestrowane przez model podczas trenowania. Ponieważ jest to model regresji (prognozujący wartość liczbową), jako miarę używamy średniego kwadratowego błędu zamiast dokładności:

model.compile(optimizer=tf.keras.optimizers.RMSprop(),
              loss=tf.keras.losses.MeanSquaredError(),
              metrics=['mae', 'mse'])

Aby sprawdzić kształt i liczbę parametrów trenowanych w modelu na poszczególnych warstwach, możesz użyć praktycznej funkcji model.summary() w Keras.

Możemy już wytrenować model. Wystarczy wywołać metodę fit(), przekazując jej dane i etykiety do trenowania. Użyjemy tutaj opcjonalnego parametru validation_split, który będzie przechowywać część danych treningowych, aby weryfikować model na każdym kroku. W idealnej sytuacji obie wartości powinny maleć. Pamiętaj jednak, że w tym przykładzie bardziej skupiamy się na narzędziach do tworzenia modeli i notatek niż na jakości modelu:

model.fit(x_train, y_train, epochs=10, validation_split=0.1)

Krok 3. Wygeneruj prognozy na podstawie przykładów testowych

Aby sprawdzić, jak działa nasz model, wygenerujmy prognozy testowe na podstawie pierwszych 10 przypadków z naszego testowego zbioru danych.

num_examples = 10
predictions = model.predict(x_test[:num_examples])

Następnie przeanalizujemy prognozy modelu, porównując je z rzeczywistymi wartościami:

for i in range(num_examples):
    print('Predicted val: ', predictions[i][0])
    print('Actual val: ',y_test.iloc[i])
    print()

Krok 4. Użyj polecenia git diff i zastosuj zmiany

Teraz, gdy wprowadziłeś/wprowadziłaś już zmiany w notatniku, możesz wypróbować funkcję git diff dostępną w interfejsie Git w notatniku. Notatnik demo.ipynb powinien teraz znajdować się w sekcji „Zmienione” w interfejsie. Najedź kursorem na nazwę pliku i kliknij ikonę różnic:

a370facb3632fb32.png

Powinieneś zobaczyć różnice między wersjami, np. taką:

461c502bd3ab910e.png

Tym razem zrealizujemy zmiany za pomocą wiersza poleceń w terminalu. W menu Git na górnym pasku menu JupyterLab wybierz Polecenie Git w terminalu. Jeśli podczas wykonywania tych poleceń masz otwartą kartę git na pasku bocznym po lewej stronie, zmiany będą widoczne w interfejsie git.

Aby zebrać plik notebooka do zatwierdzenia, w nowej instancji terminala uruchom to polecenie:

git add demo.ipynb

Następnie uruchom te polecenia, aby zatwierdzić zmiany (możesz użyć dowolnego komunikatu zatwierdzenia):

git commit -m "Build and train TF model"

Następnie w historii powinien pojawić się najnowszy commit:

a4b44045e97cb7a7.png

6. Korzystanie z narzędzia What-If bezpośrednio z zeszytu

Narzędzie What-If to interaktywny wizualny interfejs, który pomaga wizualizować zbiory danych i lepiej interpretować wyniki modeli systemów uczących się. Jest to narzędzie open source stworzone przez zespół PAIR w Google. Ta usługa działa z dowolnym typem modelu, ale ma też kilka funkcji stworzonych specjalnie dla Cloud AI Platform.

Narzędzie What-If jest wstępnie zainstalowane w instancjach notatek Cloud AI Platform z TensorFlow. Użyjemy go, aby sprawdzić ogólną skuteczność modelu i sprawdzić jego zachowanie na punktach danych z naszego zbioru testowego.

Krok 1. Przygotuj dane do użycia w narzędziu „Co jeśli?”

Aby w pełni wykorzystać możliwości narzędzia What-If, wyślemy mu przykłady z naszego zbioru testowego wraz z etykietami danych podstawowych (y_test) dla tych przykładów. Dzięki temu będziemy mogli porównać prognozy modelu z danymi rzeczywistymi. Uruchom podany niżej wiersz kodu, aby utworzyć nowy obiekt DataFrame z przykładami testowymi i ich etykietami:

wit_data = pd.concat([x_test, y_test], axis=1)

W tym module połączymy narzędzie What-If z modelem, który właśnie trenowaliśmy w notebooku. Aby to zrobić, musimy napisać funkcję, której narzędzie użyje do uruchomienia tych testowych punktów danych w naszym modelu:

def custom_predict(examples_to_infer):
    preds = model.predict(examples_to_infer)
    return preds

Krok 2. Utwórz instancję narzędzia „Co jeśli?”

Utworzymy instancję narzędzia What-If, przekazując mu 500 przykładów z złączonego zbioru danych testowych oraz etykiet danych podstawowych, które właśnie utworzyliśmy. Tworzymy instancję WitConfigBuilder, aby skonfigurować narzędzie, przekazując mu nasze dane, zdefiniowaną powyżej niestandardową funkcję prognozowania, cel (czyli to, co prognozujemy) oraz typ modelu:

config_builder = (WitConfigBuilder(wit_data[:500].values.tolist(), data.columns.tolist() + ['weight_pounds'])
  .set_custom_predict_fn(custom_predict)
  .set_target_feature('weight_pounds')
  .set_model_type('regression'))
WitWidget(config_builder, height=800)

Gdy narzędzie What-If się wczyta, powinieneś zobaczyć coś takiego:

fcdc1cb7ed8e364e.png

Na osi X widać punkty danych testowych rozłożone według przewidywanej wartości wagi modelu, weight_pounds.

Krok 3. Poznaj działanie modelu za pomocą narzędzia „Co jeśli?”

Za pomocą narzędzia What-If możesz wykonywać wiele ciekawych działań. Tutaj omówimy tylko kilka z nich. Najpierw przyjrzyjmy się edytorowi punktu danych. Możesz wybrać dowolny punkt danych, aby wyświetlić jego cechy i zmienić ich wartości. Najpierw kliknij dowolny punkt danych:

2ba944f16240ff4b.png

Po lewej stronie zobaczysz wartości cech wybranego punktu danych. Możesz też porównać etykietę danych podstawowych (ground truth) z wartością przewidzianą przez model. W panelu bocznym po lewej stronie możesz też zmienić wartości cech i ponownie uruchomić prognozowanie modelu, aby sprawdzić, jaki wpływ na model ma ta zmiana. Możemy na przykład zmienić wartość parametru gestation_weeks na 30, klikając go dwukrotnie i ponownie uruchamiając prognozę:

aaa6a937c66758cf.png

Za pomocą menu w sekcji wykresu w narzędziu „Co jeśli?” możesz tworzyć różnego rodzaju wizualizacje. Oto na przykład wykres z przewidywanym ciężarem modeli na osi X, wiekiem matki na osi Y i punktami pokolorowanymi według błędu wnioskowania (ciemniejsze oznacza większą różnicę między przewidywanym a rzeczywistym ciężarem). Wygląda na to, że wraz ze spadkiem wagi błąd modelu rośnie nieznacznie:

cd2ce527a9044e7b.png

Następnie po lewej stronie kliknij przycisk Wykresy częściowej zależności. Pokazuje, jak poszczególne cechy wpływają na prognozę modelu. Na przykład wraz z długością ciąży rośnie przewidywana masa ciała dziecka według naszego modelu:

1fec2a64fb03f432.png

Aby dowiedzieć się więcej o korzystaniu z narzędzia „Co jeśli?”, kliknij linki na początku tej sekcji.

7. Opcjonalnie: połącz lokalne repozytorium Git z GitHubem

Na koniec dowiesz się, jak połączyć repozytorium Git w naszym wystąpieniu notebooka z repozytorium na naszym koncie GitHub. Jeśli chcesz wykonać ten krok, musisz mieć konto GitHub.

Krok 1. Utwórz nowe repozytorium w GitHub

Utwórz nowe repozytorium na swoim koncie GitHub. Nadaj mu nazwę i opis, zdecyduj, czy ma być publiczny, i wybierz Utwórz repozytorium (nie musisz inicjować go za pomocą pliku README). Na następnej stronie postępuj zgodnie z instrukcjami przesyłania istniejącego repozytorium z poziomu wiersza poleceń.

Otwórz okno terminala i dodaj nowe repozytorium jako repozytorium zdalne. Zastąp username w adresie URL repozytorium poniżej swoją nazwą użytkownika GitHuba, a your-repo – nazwą właśnie utworzonego repozytorium:

git remote add origin git@github.com:username/your-repo.git

Krok 2. Uwierzytelnienie w GitHub w instancji notatnika

Następnie musisz uwierzytelnić się w GitHub z poziomu instancji notebooka. Ten proces różni się w zależności od tego, czy masz włączone uwierzytelnianie dwuskładnikowe w GitHub.

Jeśli nie wiesz, od czego zacząć, wykonaj czynności opisane w dokumentacji GitHub, aby utworzyć klucz SSH, a następnie dodaj nowy klucz do GitHub.

Krok 3. Sprawdź, czy repozytorium GitHub zostało prawidłowo połączone

Aby mieć pewność, że wszystko jest skonfigurowane prawidłowo, uruchom git remote -v w terminalu. Nowe repozytorium powinno być widoczne jako repozytorium zdalne. Gdy zobaczysz adres URL repozytorium GitHub i uwierzytelnisz się w GitHub z poziomu notatnika, możesz przesłać dane bezpośrednio do GitHub z instancji notatnika.

Aby zsynchronizować lokalne repozytorium Git z nowo utworzonym repozytorium GitHub, kliknij przycisk przesyłania do chmury u góry paska bocznego Git:

eec001587bb9cfb1.png

Odśwież repozytorium GitHub, a zobaczysz kod notebooka z poprzednimi zatwierdzeniami. Jeśli inne osoby mają dostęp do Twojego repozytorium GitHub i chcesz pobrać najnowsze zmiany do swojego notebooka, kliknij ikonę chmury, aby zsynchronizować te zmiany.

Na karcie Historia w interfejsie Git Notebooków możesz sprawdzić, czy Twoje lokalne zatwierdzenia są zsynchronizowane z GitHubem. W tym przykładzie origin/master odpowiada naszemu repozytorium na GitHub:

2c3d1eb7cf95c24e.png

Za każdym razem, gdy wprowadzasz nowe zatwierdzenia, po prostu kliknij przycisk przesyłania w chmurze, aby przesłać zmiany do repozytorium GitHub.

8. Gratulacje!

W tym module wykonałeś/-aś wiele zadań 👏👏👏

Podsumowując, dowiesz się, jak:

  • Tworzenie i dostosowywanie instancji notatnika AI Platform
  • zainicjować lokalne repozytorium Git w tej instancji, dodać commity za pomocą interfejsu lub wiersza polecenia Git, wyświetlić różnice w Git w interfejsie Notebooka;
  • Tworzenie i trenowanie prostego modelu TensorFlow 2
  • Korzystanie z narzędzia What-If w ramach instancji Notebooka
  • Łączenie repozytorium git Notebooka z zewnętrznym repozytorium w GitHubie

9. Czyszczenie

Jeśli chcesz nadal korzystać z notatnika, zalecamy wyłączenie go, gdy go nie używasz. W interfejsie Notebooków w konsoli Cloud wybierz notebook, a następnie Zatrzymaj:

ba727f9a0aefbc30.png

Jeśli chcesz usunąć wszystkie zasoby utworzone w tym laboratorium, zamiast je zatrzymywać, po prostu usuń instancję notatnika.

W menu nawigacyjnym konsoli Google Cloud przejdź do usługi Storage i usuń oba zasobniki utworzone do przechowywania zasobów modelu.