Prototyp do produkcji: trenowanie modeli niestandardowych przy użyciu Vertex AI

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: trenowanieWorkbench.

Omówienie usługi Vertex

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.

Panel Vertex AI

Krok 4. Tworzenie instancji Vertex AI Workbench

W sekcji Vertex AI w konsoli Cloud kliknij Workbench:

Menu Vertex AI

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

Notebook_api

Po włączeniu kliknij ZARZĄDZANE NOTATNIKI:

Notebooks_UI

Następnie wybierz NOWY NOTEBOOK.

new_notebook

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

create_notebook

Kliknij Ustawienia zaawansowane.

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

enable_terminal

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.

open_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:

Otwórz terminal w notatniku

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:

menu trenowania,

Krok 1. Skonfiguruj zadanie trenowania

Kliknij Utwórz, aby wprowadzić parametry zadania trenowania.

create_training

  • 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:

Opcja niestandardowego kontenera

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:

worker_pool_0

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:

Zadania trenowania

🎉 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:

new_notebook

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ń.

Zatrzymaj instancję

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

Usuń miejsce na dane