1. Przegląd
W tym module użyjesz Vertex AI do uruchomienia niestandardowego zadania trenowania.
Ten moduł jest częścią serii filmów Od prototypu do produkcji. Utworzysz model klasyfikacji obrazów przy użyciu zbioru danych Flowers. Więcej informacji znajdziesz w tym filmie:
.
Czego się dowiesz
Poznasz takie zagadnienia jak:
- Tworzenie zarządzanego notatnika Vertex AI Workbench
- Konfigurowanie i uruchamianie niestandardowego zadania trenowania w interfejsie Vertex AI
- Skonfiguruj i uruchom niestandardowe zadanie trenowania za pomocą pakietu SDK Vertex AI dla Pythona.
Całkowity koszt ukończenia tego modułu w Google Cloud wynosi około 1 USD.
2. Wprowadzenie do Vertex AI
W tym module wykorzystujemy najnowszą ofertę produktów AI dostępną w Google Cloud. Vertex AI integruje usługi ML w Google Cloud, zapewniając płynne środowisko programistyczne. Wcześniej modele wytrenowane za pomocą AutoML i modele niestandardowe były dostępne w ramach osobnych usług. Nowa oferta łączy je w jeden interfejs API wraz z innymi nowymi usługami. Możesz też przeprowadzić migrację istniejących projektów do Vertex AI.
Vertex AI obejmuje wiele różnych usług, które obsługują kompleksowe przepływy pracy związane z uczeniem maszynowym. Ten moduł skupia się na wyróżnionych poniżej usługach: trenowanie i Workbench.

3. Konfigurowanie środowiska
Aby wykonać to ćwiczenie, musisz mieć projekt w Google Cloud Platform z włączonymi płatnościami. Aby utworzyć projekt, postępuj zgodnie z instrukcjami.
Krok 1. Włącz interfejs Compute Engine API
Przejdź do Compute Engine i kliknij Włącz, jeśli nie jest jeszcze włączona.
Krok 2. Włącz interfejs Artifact Registry API
Otwórz Artifact Registry i kliknij Włącz, jeśli nie jest jeszcze włączona. Użyjesz go do utworzenia kontenera na potrzeby niestandardowego zadania trenowania.
Krok 3. Włącz interfejs Vertex AI API
Otwórz sekcję Vertex AI w konsoli Cloud i kliknij Włącz interfejs Vertex AI API.

Krok 4. Tworzenie instancji Vertex AI Workbench
W sekcji Vertex AI w konsoli Cloud kliknij Workbench:

Włącz interfejs Notebooks API, jeśli nie jest jeszcze włączony.

Po włączeniu kliknij ZARZĄDZANE NOTATNIKI:

Następnie wybierz NOWY NOTEBOOK.

Nadaj nazwę notatnikowi, a w sekcji Uprawnienia wybierz Konto usługi.

Kliknij Ustawienia zaawansowane.
W sekcji Zabezpieczenia wybierz „Włącz terminal”, jeśli nie jest jeszcze włączony.

Wszystkie pozostałe ustawienia zaawansowane możesz pozostawić bez zmian.
Następnie kliknij Utwórz. Udostępnienie instancji zajmie kilka minut.
Po utworzeniu instancji kliknij OTWÓRZ JUPYTERLAB.

4. Konteneryzowanie kodu aplikacji trenującej
To zadanie trenowania prześlesz do Vertex AI, umieszczając kod aplikacji do trenowania w kontenerze Dockera i przenosząc ten kontener do Google Artifact Registry. Dzięki temu możesz wytrenować model utworzony w dowolnym frameworku.
Aby rozpocząć, w menu Launchera otwórz okno terminala w instancji notatnika:

Krok 1. Utwórz zasobnik Cloud Storage
W tym zadaniu treningowym wyeksportujesz wytrenowany model TensorFlow do zasobnika Cloud Storage. Dane do trenowania będziesz też przechowywać w zasobniku Cloud Storage.
W terminalu uruchom to polecenie, aby zdefiniować zmienną środowiskową dla projektu. Pamiętaj, aby zastąpić your-cloud-project identyfikatorem projektu:
PROJECT_ID='your-cloud-project'
Następnie uruchom w terminalu to polecenie, aby utworzyć nowy zasobnik w projekcie.
BUCKET="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET
Krok 2. Skopiuj dane do zasobnika Cloud Storage
Musimy przenieść nasz zbiór danych o kwiatach do Cloud Storage. Na potrzeby demonstracji najpierw pobierzesz zbiór danych do tej instancji Workbench, a potem skopiujesz go do zasobnika.
Pobierz i rozpakuj dane.
wget https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
tar xvzf flower_photos.tgz
Następnie skopiuj go do utworzonego przed chwilą zasobnika. Dodajemy parametr -r, ponieważ chcemy skopiować cały katalog, a parametr -m, aby wykonać kopiowanie wieloprocesowe, co przyspieszy działanie.
gsutil -m cp -r flower_photos $BUCKET
Krok 3. Napisz kod szkoleniowy
Utwórz nowy katalog o nazwie flowers i przejdź do niego:
mkdir flowers
cd flowers
Uruchom to polecenie, aby utworzyć katalog na kod szkoleniowy i plik Pythona, do którego dodasz kod.
mkdir trainer
touch trainer/task.py
W katalogu flowers/ powinny się teraz znajdować te pliki:
+ trainer/
+ task.py
Więcej informacji o tym, jak zorganizować kod aplikacji do trenowania, znajdziesz w dokumentacji.
Następnie otwórz utworzony plik task.py i skopiuj poniższy kod.
Musisz zastąpić {your-gcs-bucket} nazwą utworzonego zasobnika Cloud Storage.
Dzięki narzędziu Cloud Storage FUSE zadania trenowania w Vertex AI Training mogą uzyskiwać dostęp do danych w Cloud Storage jako plików w lokalnym systemie plików. Gdy uruchomisz niestandardowe zadanie trenowania, zobaczy ono katalog /gcs, który zawiera wszystkie Twoje zasobniki Cloud Storage jako podkatalogi. Dlatego ścieżki danych w kodzie trenowania zaczynają się od /gcs.
import tensorflow as tf
import numpy as np
import os
## Replace {your-gcs-bucket} !!
BUCKET_ROOT='/gcs/{your-gcs-bucket}'
# Define variables
NUM_CLASSES = 5
EPOCHS=10
BATCH_SIZE = 32
IMG_HEIGHT = 180
IMG_WIDTH = 180
DATA_DIR = f'{BUCKET_ROOT}/flower_photos'
def create_datasets(data_dir, batch_size):
'''Creates train and validation datasets.'''
train_dataset = tf.keras.utils.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="training",
seed=123,
image_size=(IMG_HEIGHT, IMG_WIDTH),
batch_size=batch_size)
validation_dataset = tf.keras.utils.image_dataset_from_directory(
data_dir,
validation_split=0.2,
subset="validation",
seed=123,
image_size=(IMG_HEIGHT, IMG_WIDTH),
batch_size=batch_size)
train_dataset = train_dataset.cache().shuffle(1000).prefetch(buffer_size=tf.data.AUTOTUNE)
validation_dataset = validation_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)
return train_dataset, validation_dataset
def create_model():
'''Creates model.'''
model = tf.keras.Sequential([
tf.keras.layers.Resizing(IMG_HEIGHT, IMG_WIDTH),
tf.keras.layers.Rescaling(1./255, input_shape=(IMG_HEIGHT, IMG_WIDTH, 3)),
tf.keras.layers.Conv2D(16, 3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(32, 3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(64, 3, padding='same', activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(NUM_CLASSES, activation='softmax')
])
return model
# CREATE DATASETS
train_dataset, validation_dataset = create_datasets(DATA_DIR, BATCH_SIZE)
# CREATE/COMPILE MODEL
model = create_model()
model.compile(optimizer=tf.keras.optimizers.Adam(),
loss=tf.keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
# TRAIN MODEL
history = model.fit(
train_dataset,
validation_data=validation_dataset,
epochs=EPOCHS
)
# SAVE MODEL
model.save(f'{BUCKET_ROOT}/model_output')
Krok 4. Utwórz plik Dockerfile
Aby umieścić kod w kontenerze, musisz utworzyć plik Dockerfile. W pliku Dockerfile umieścisz wszystkie polecenia potrzebne do uruchomienia obrazu. Zainstaluje wszystkie niezbędne biblioteki i skonfiguruje punkt wejścia dla kodu trenowania.
W terminalu utwórz pusty plik Dockerfile w katalogu głównym katalogu flowers:
touch Dockerfile
W katalogu flowers/ powinny się teraz znajdować te pliki:
+ Dockerfile
+ trainer/
+ task.py
Otwórz plik Dockerfile i skopiuj do niego ten kod:
FROM gcr.io/deeplearning-platform-release/tf2-gpu.2-8
WORKDIR /
# Copies the trainer code to the docker image.
COPY trainer /trainer
# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.task"]
Przyjrzyjmy się poleceniom w tym pliku.
Polecenie FROM określa obraz bazowy, czyli obraz nadrzędny, na którym będzie oparty tworzony obraz. Jako obrazu bazowego użyjesz obrazu Dockera Deep Learning Container TensorFlow Enterprise 2.8 z GPU. Kontenery do deep learningu w Google Cloud mają fabrycznie zainstalowanych wiele popularnych platform ML i narzędzi do analizy danych.
Polecenie WORKDIR określa katalog w obrazie, w którym będą wykonywane kolejne instrukcje.
Polecenie COPY kopiuje kod trenera do obrazu Dockera. Pamiętaj, że w tym przykładzie w katalogu trenera mamy tylko 1 plik Pythona, ale w bardziej realistycznym przykładzie prawdopodobnie będziesz mieć dodatkowe pliki. Może to być na przykład plik data.py, który obsługuje wstępne przetwarzanie danych, i plik model.py, który zawiera tylko kod modelu. W przypadku bardziej złożonego kodu trenowania zapoznaj się z dokumentacją Pythona dotyczącą pakowania projektów w Pythonie.
Jeśli chcesz dodać dodatkowe biblioteki, możesz użyć polecenia RUN, aby zainstalować je za pomocą narzędzia pip (np. RUN pip install -r requirements.txt). W naszym przykładzie nie potrzebujemy jednak niczego dodatkowego.
Na koniec polecenie ENTRYPOINT konfiguruje punkt wejścia do wywoływania trenera. To zostanie uruchomione, gdy rozpoczniemy zadanie trenowania. W naszym przypadku jest to wykonanie pliku task.py.
Więcej informacji o pisaniu plików Dockerfile na potrzeby trenowania w Vertex AI znajdziesz tutaj.
Krok 4. Utwórz kontener
W terminalu notatnika Workbench uruchom to polecenie, aby zdefiniować zmienną środowiskową dla projektu. Pamiętaj, aby zastąpić your-cloud-project identyfikatorem projektu:
PROJECT_ID='your-cloud-project'
Tworzenie repozytorium w Artifact Registry
REPO_NAME='flower-app'
gcloud artifacts repositories create $REPO_NAME --repository-format=docker \
--location=us-central1 --description="Docker repository"
Zdefiniuj zmienną z identyfikatorem URI obrazu kontenera w Google Artifact Registry:
IMAGE_URI=us-central1-docker.pkg.dev/$PROJECT_ID/$REPO_NAME/flower_image:latest
Konfigurowanie Dockera
gcloud auth configure-docker \
us-central1-docker.pkg.dev
Następnie utwórz kontener, uruchamiając to polecenie w katalogu głównym flower:
docker build ./ -t $IMAGE_URI
Na koniec prześlij go do Artifact Registry:
docker push $IMAGE_URI
Po przesłaniu kontenera do Artifact Registry możesz rozpocząć zadanie trenowania.
5. Uruchamianie niestandardowego zadania trenowania w Vertex AI
W tym module używamy trenowania niestandardowego za pomocą kontenera niestandardowego w Google Artifact Registry, ale możesz też uruchomić zadanie trenowania za pomocą gotowych kontenerów.
Na początek otwórz sekcję Trenowanie w sekcji Vertex w konsoli Cloud:

Krok 1. Skonfiguruj zadanie trenowania
Kliknij Utwórz, aby wprowadzić parametry zadania trenowania.

- W sekcji Zbiór danych wybierz Brak zarządzanego zbioru danych.
- Następnie jako metodę trenowania wybierz Trenowanie niestandardowe (zaawansowane) i kliknij Dalej.
- Wybierz Wytrenuj nowy model, a następnie wpisz
flowers-model(lub dowolną inną nazwę modelu) w polu Nazwa modelu. - Kliknij Dalej.
W kroku Ustawienia kontenera wybierz Kontener niestandardowy:

W pierwszym polu (Obraz kontenera) wpisz wartość zmiennej IMAGE_URI z poprzedniej sekcji. Powinien on mieć postać: us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest, gdzie zamiast us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest wpiszesz identyfikator swojego projektu. Pozostałe pola pozostaw puste i kliknij Dalej.
Pomiń krok Hiperparametry, klikając ponownie Dalej.
Krok 2. Skonfiguruj klaster obliczeniowy
Skonfiguruj pulę instancji roboczych 0 w ten sposób:

Na razie pomiń krok 6. Kontener prognozowania skonfigurujesz w następnym module z tej serii.
Aby rozpocząć zadanie trenowania, kliknij ROZPOCZNIJ TRENOWANIE. W sekcji Trenowanie w konsoli na karcie PIPELINE TRENOWANIA zobaczysz nowo uruchomione zadanie:

🎉 Gratulacje! 🎉
Dowiedziałeś się, jak używać Vertex AI do:
- Uruchom zadanie trenowania niestandardowego, aby wytrenować kod podany w kontenerze niestandardowym. W tym przykładzie użyto modelu TensorFlow, ale możesz wytrenować model utworzony za pomocą dowolnej platformy, korzystając z kontenerów niestandardowych lub wbudowanych.
Więcej informacji o różnych częściach Vertex znajdziesz w dokumentacji.
6. [Opcjonalnie] Użyj pakietu Vertex AI Python SDK
W poprzedniej sekcji pokazaliśmy, jak uruchomić zadanie trenowania w interfejsie. W tej sekcji znajdziesz alternatywny sposób przesyłania zadania trenowania za pomocą pakietu SDK Vertex AI w Pythonie.
Wróć do instancji notatnika i utwórz notatnik TensorFlow 2 z poziomu Launchera:

Zaimportuj pakiet Vertex AI SDK.
from google.cloud import aiplatform
Następnie utwórz CustomContainerTrainingJob. W container_uri musisz zastąpić znak {PROJECT_ID} nazwą projektu, a w staging_bucket musisz zastąpić znak {BUCKET} utworzonym wcześniej zasobnikiem.
my_job = aiplatform.CustomContainerTrainingJob(display_name='flower-sdk-job',
container_uri='us-central1-docker.pkg.dev/{PROJECT_ID}/flower-app/flower_image:latest',
staging_bucket='gs://{BUCKET}')
Następnie uruchom zadanie.
my_job.run(replica_count=1,
machine_type='n1-standard-8',
accelerator_type='NVIDIA_TESLA_V100',
accelerator_count=1)
Na potrzeby demonstracji to zadanie zostało skonfigurowane do uruchamiania na większej maszynie niż w poprzedniej sekcji. Dodatkowo korzystamy z procesora graficznego. Jeśli nie określisz machine-type, accelerator_type ani accelerator_count, zadanie będzie domyślnie uruchamiane na n1-standard-4.
W sekcji Trenowanie w konsoli na karcie ZADANIA NIESTANDARDOWE zobaczysz zadanie trenowania.
7. Czyszczenie
Zarządzane notatniki Vertex AI Workbench mają funkcję wyłączania w przypadku braku aktywności, więc nie musimy się martwić o wyłączanie 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ń.

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