1. Przegląd
W tym laboratorium dowiesz się, jak uruchomić niestandardowe zadanie trenowania w Vertex AI Training za pomocą funkcji automatycznego tworzenia pakietów. Zadania trenowania niestandardowego w Vertex AI korzystają z kontenerów. Jeśli nie chcesz tworzyć własnego obrazu, możesz użyć automatycznego pakowania, które utworzy niestandardowy obraz Dockera na podstawie Twojego kodu, prześle go do Container Registry i uruchomi CustomJob na podstawie tego obrazu.
Czego się dowiesz
Poznasz takie zagadnienia jak:
- Aby przetestować kod, użyj trybu lokalnego.
- Skonfiguruj i uruchom niestandardowe zadanie trenowania z automatycznym pakowaniem.
Całkowity koszt przeprowadzenia tego laboratorium w Google Cloud wynosi około 2 USD.
2. Omówienie przypadku użycia
Korzystając z bibliotek Hugging Face, dostroisz model Bert na zbiorze danych IMDB. Model będzie przewidywać, czy recenzja filmu jest pozytywna czy negatywna. Zbiór danych zostanie pobrany z biblioteki zbiorów danych Hugging Face, a model Bert z biblioteki transformatorów Hugging Face.
3. Wprowadzenie do Vertex AI
W tym module wykorzystujemy najnowszą ofertę produktów AI dostępną w Google Cloud. Vertex AI integruje oferty 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. Jeśli masz jakieś uwagi, odwiedź stronę pomocy.
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 trenowaniu i Workbench.

4. 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 Vertex AI API
Otwórz sekcję Vertex AI w konsoli Cloud i kliknij Włącz interfejs Vertex AI API.

Krok 3. Włącz interfejs Container Registry API
Otwórz Container Registry i kliknij Włącz, jeśli nie jest jeszcze włączona. Użyjesz go do utworzenia kontenera na potrzeby niestandardowego zadania trenowania.
Krok 4. Tworzenie instancji Vertex AI Workbench
W sekcji Vertex AI w konsoli Cloud kliknij Workbench:

Następnie kliknij ZARZĄDZANE NOTATNIKI:

Następnie wybierz NOWY NOTEBOOK.

Nadaj notatnikowi nazwę, a potem kliknij Ustawienia zaawansowane.

W sekcji Ustawienia zaawansowane włącz wyłączanie w przypadku bezczynności i ustaw liczbę minut na 60. Oznacza to, że Twój notebook będzie się automatycznie wyłączać, gdy nie jest używany, dzięki czemu nie poniesiesz niepotrzebnych kosztów.

Wszystkie pozostałe ustawienia zaawansowane możesz pozostawić bez zmian.
Następnie kliknij Utwórz.
Po utworzeniu instancji wybierz Otwórz JupyterLab.

Przy pierwszym użyciu nowej instancji pojawi się prośba o uwierzytelnienie.

5. Pisanie kodu szkoleniowego
Aby rozpocząć, w menu Launchera otwórz okno terminala w instancji notatnika:

Utwórz nowy katalog o nazwie autopkg-codelab i przejdź do niego.
mkdir autopkg-codelab
cd autopkg-codelab
W terminalu uruchom to polecenie, aby utworzyć katalog z kodem szkoleniowym i plik Pythona, do którego dodasz kod:
mkdir trainer
touch trainer/task.py
W katalogu autopkg-codelab/ powinny się teraz znajdować te pliki:
+ trainer/
+ task.py
Następnie otwórz utworzony plik task.py i skopiuj poniższy kod.
import argparse
import tensorflow as tf
from datasets import load_dataset
from transformers import AutoTokenizer
from transformers import TFAutoModelForSequenceClassification
CHECKPOINT = "bert-base-cased"
def get_args():
'''Parses args.'''
parser = argparse.ArgumentParser()
parser.add_argument(
'--epochs',
required=False,
default=3,
type=int,
help='number of epochs')
parser.add_argument(
'--job_dir',
required=True,
type=str,
help='bucket to store saved model, include gs://')
args = parser.parse_args()
return args
def create_datasets():
'''Creates a tf.data.Dataset for train and evaluation.'''
raw_datasets = load_dataset('imdb')
tokenizer = AutoTokenizer.from_pretrained(CHECKPOINT)
tokenized_datasets = raw_datasets.map((lambda examples: tokenize_function(examples, tokenizer)), batched=True)
# To speed up training, we use only a portion of the data.
# Use full_train_dataset and full_eval_dataset if you want to train on all the data.
small_train_dataset = tokenized_datasets['train'].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets['test'].shuffle(seed=42).select(range(1000))
full_train_dataset = tokenized_datasets['train']
full_eval_dataset = tokenized_datasets['test']
tf_train_dataset = small_train_dataset.remove_columns(['text']).with_format("tensorflow")
tf_eval_dataset = small_eval_dataset.remove_columns(['text']).with_format("tensorflow")
train_features = {x: tf_train_dataset[x] for x in tokenizer.model_input_names}
train_tf_dataset = tf.data.Dataset.from_tensor_slices((train_features, tf_train_dataset["label"]))
train_tf_dataset = train_tf_dataset.shuffle(len(tf_train_dataset)).batch(8)
eval_features = {x: tf_eval_dataset[x] for x in tokenizer.model_input_names}
eval_tf_dataset = tf.data.Dataset.from_tensor_slices((eval_features, tf_eval_dataset["label"]))
eval_tf_dataset = eval_tf_dataset.batch(8)
return train_tf_dataset, eval_tf_dataset
def tokenize_function(examples, tokenizer):
'''Tokenizes text examples.'''
return tokenizer(examples['text'], padding='max_length', truncation=True)
def main():
args = get_args()
train_tf_dataset, eval_tf_dataset = create_datasets()
model = TFAutoModelForSequenceClassification.from_pretrained(CHECKPOINT, num_labels=2)
model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=tf.metrics.SparseCategoricalAccuracy(),
)
model.fit(train_tf_dataset, validation_data=eval_tf_dataset, epochs=args.epochs)
model.save(f'{args.job_dir}/model_output')
if __name__ == "__main__":
main()
Kilka uwag na temat kodu:
CHECKPOINTto model, który chcemy dostroić. W tym przypadku używamy modelu BERT.- Metoda
TFAutoModelForSequenceClassificationwczyta w TensorFlow określoną architekturę modelu językowego wraz z wagami i doda na górze warstwę klasyfikacji z losowo zainicjowanymi wagami. W tym przypadku mamy problem z klasyfikacją binarną (pozytywną lub negatywną), więc dla tego klasyfikatora określamy wartośćnum_labels=2.
6. Konteneryzowanie i lokalne uruchamianie kodu trenowania
Za pomocą polecenia gcloud ai custom-jobs local-run możesz utworzyć obraz kontenera Dockera na podstawie kodu trenowania i uruchomić go jako kontener na komputerze lokalnym. Uruchomienie kontenera lokalnie powoduje wykonanie kodu trenowania w sposób podobny do tego, w jaki jest on wykonywany w Vertex AI Training. Może to pomóc w debugowaniu problemów z kodem przed przeprowadzeniem niestandardowego trenowania w Vertex AI.
W zadaniu trenowania wyeksportujemy wytrenowany model do zasobnika 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 utwórz zasobnik. Jeśli masz już zasobnik, możesz go użyć.
BUCKET_NAME="gs://${PROJECT_ID}-bucket"
gsutil mb -l us-central1 $BUCKET_NAME
Gdy uruchomimy niestandardowe zadanie trenowania w Vertex AI Training, użyjemy procesora GPU. Ponieważ nie określiliśmy instancji Workbench z procesorami GPU, do testowania lokalnego użyjemy obrazu opartego na procesorze CPU. W tym przykładzie używamy gotowego kontenera Vertex AI Training.
Uruchom to polecenie, aby ustawić identyfikator URI obrazu Dockera, który ma być używany jako podstawa kontenera.
BASE_CPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-cpu.2-7:latest
Następnie ustaw nazwę obrazu Dockera utworzonego przez polecenie uruchamiania lokalnego.
OUTPUT_IMAGE=$PROJECT_ID-local-package-cpu:latest
Nasz kod trenujący korzysta z bibliotek zbiorów danych i transformatorów Hugging Face. Tych bibliotek nie ma w obrazie, który wybraliśmy jako obraz podstawowy, więc musimy podać je jako wymagania. W tym celu utworzymy plik requirements.txt w katalogu autopkg-codelab.
Upewnij się, że jesteś w katalogu autopkg-codelab, i wpisz w terminalu to polecenie:
touch requirements.txt
W katalogu autopkg-codelab powinny się teraz znajdować te pliki:
+ requirements.txt
+ trainer/
+ task.py
Otwórz plik wymagań i wklej do niego ten kod:
datasets==1.18.2
transformers==4.16.2
Na koniec wykonaj polecenie gcloud ai custom-jobs local-run, aby rozpocząć trenowanie na zarządzanej instancji Workbench.
gcloud ai custom-jobs local-run \
--executor-image-uri=$BASE_CPU_IMAGE \
--python-module=trainer.task \
--output-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME
Powinien pojawić się proces tworzenia obrazu Dockera. Zależności dodane do pliku requirements.txt zostaną zainstalowane za pomocą narzędzia pip. Przy pierwszym wykonaniu tego polecenia może to potrwać kilka minut. Po utworzeniu obrazu pliktask.py zacznie działać i zobaczysz trenowanie modelu. Powinien pojawić się ekran podobny do tego:

Ponieważ nie używamy lokalnie procesora GPU, trenowanie modelu zajmie dużo czasu. Możesz nacisnąć Ctrl+c i anulować trenowanie lokalne, zamiast czekać na zakończenie zadania.
Pamiętaj, że jeśli chcesz przeprowadzić dalsze testy, możesz również bezpośrednio uruchomić utworzony powyżej obraz bez ponownego pakowania.
gcloud beta ai custom-jobs local-run \
--executor-image-uri=$OUTPUT_IMAGE \
-- \
--job_dir=$BUCKET_NAME \
--epochs=1
7. Tworzenie zadania niestandardowego
Po przetestowaniu trybu lokalnego użyjemy funkcji automatycznego tworzenia pakietów, aby uruchomić niestandardowe zadanie trenowania w usłudze Vertex AI Training. Za pomocą jednego polecenia ta funkcja:
- Utwórz niestandardowy obraz Dockera na podstawie kodu.
- Prześlij obraz do Container Registry.
- Utwórz
CustomJobna podstawie obrazu.
Wróć do terminala i przejdź do katalogu o jeden poziom wyżej niż katalog autopkg-codelab.
+ autopkg-codelab
+ requirements.txt
+ trainer/
+ task.py
Określ gotowy obraz TensorFlow z procesorem graficznym do trenowania w Vertex AI Training jako obraz podstawowy dla niestandardowego zadania trenowania.
BASE_GPU_IMAGE=us-docker.pkg.dev/vertex-ai/training/tf-gpu.2-7:latest
Następnie uruchom polecenie gcloud ai custom-jobs create. Najpierw to polecenie utworzy niestandardowy obraz Dockera na podstawie kodu trenowania. Obraz bazowy to gotowy kontener Vertex AI Training, który ustawiliśmy jako BASE_GPU_IMAGE. Funkcja automatycznego pakowania zainstaluje biblioteki zbiorów danych i transformatorów za pomocą narzędzia pip zgodnie z informacjami w pliku requirements.txt.
gcloud ai custom-jobs create \
--region=us-central1 \
--display-name=fine_tune_bert \
--args=--job_dir=$BUCKET_NAME \
--worker-pool-spec=machine-type=n1-standard-4,replica-count=1,accelerator-type=NVIDIA_TESLA_V100,executor-image-uri=$BASE_GPU_IMAGE,local-package-path=autopkg-codelab,python-module=trainer.task
Przyjrzyjmy się argumentowi worker-pool-spec. Określa konfigurację puli instancji roboczych używaną przez zadanie niestandardowe. Możesz określić wiele specyfikacji puli instancji roboczych, aby utworzyć niestandardowe zadanie z wieloma pulami instancji roboczych na potrzeby szkolenia rozproszonego. W tym przykładzie określamy tylko jedną pulę instancji roboczych, ponieważ nasz kod trenowania nie jest skonfigurowany pod kątem trenowania rozproszonego.
Oto niektóre z najważniejszych pól tej specyfikacji:
machine-type(wymagany): typ maszyny. Kliknij tutaj, aby zobaczyć obsługiwane typy.replica-count: liczba replik zadań roboczych, które mają być użyte w tej puli zadań roboczych. Domyślnie jest to 1.accelerator-type: typ procesorów graficznych. Kliknij tutaj, aby zobaczyć obsługiwane typy. W tym przykładzie określiliśmy 1 procesor graficzny NVIDIA Tesla V100.accelerator-count: liczba procesorów graficznych, które ma używać każda maszyna wirtualna w puli procesów roboczych. Domyślnie jest to 1.executor-image-uri: identyfikator URI obrazu kontenera, który uruchomi podany pakiet. Jest ona ustawiona na obraz podstawowy.local-package-path: lokalna ścieżka do folderu zawierającego kod trenowania.python-module: nazwa modułu Pythona do uruchomienia w podanym pakiecie.
Podobnie jak w przypadku uruchomienia polecenia lokalnego zobaczysz, że obraz Dockera jest kompilowany, a następnie rozpoczyna się zadanie trenowania. Zamiast danych wyjściowych zadania trenowania zobaczysz jednak ten komunikat potwierdzający, że zadanie trenowania zostało uruchomione. Pamiętaj, że przy pierwszym uruchomieniu polecenia custom-jobs create utworzenie i przesłanie obrazu może potrwać kilka minut.

Wróć do sekcji Vertex AI Training w konsoli Cloud. W sekcji ZADANIA NIESTANDARDOWE powinno być widoczne uruchomione zadanie.

Ukończenie zadania zajmie około 20 minut.
Po zakończeniu w katalogu model_output w zasobniku powinny pojawić się te artefakty zapisanego modelu:

🎉 Gratulacje! 🎉
Dowiedziałeś się, jak używać Vertex AI do:
- Konteneryzowanie i lokalne uruchamianie kodu trenowania
- Przesyłanie zadań trenowania do Vertex AI Training z automatycznym tworzeniem pakietów
Więcej informacji o poszczególnych częściach Vertex AI znajdziesz w dokumentacji.
8. Czyszczenie
Skonfigurowaliśmy notatnik tak, aby po 60 minutach bezczynności przekraczał limit czasu, więc nie musimy się martwić o zamykanie 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ń:
