BERT-Feinabstimmung mit Cloud TPU: Satz- und Satzpaar-Klassifizierungsaufgaben (TF 2.x)

In dieser Anleitung wird beschrieben, wie Sie das BERT-Modell (Bidirectional Encoder Representations from Transformers) in Cloud TPU trainieren.

BERT ist eine Methode zur Sprachdarstellung vor dem Training. Mit "vor dem Training" ist gemeint, dass BERT zuerst mit einer großen Textquelle wie Wikipedia trainiert wird. Anschließend können Sie die Trainingsergebnisse für andere Aufgaben zur natürlichen Sprachverarbeitung (Natural Language Processing, NLP) verwenden, z. B. Beantworten von Fragen und Sentimentanalyse. Mit BERT und Cloud TPU können Sie in etwa 30 Minuten eine Vielzahl von NLP-Modellen trainieren.

Weitere Informationen zu BERT finden Sie in den folgenden Ressourcen:

Ziele

  • Cloud Storage-Bucket zum Speichern der Dataset- und Modellausgabe erstellen
  • Trainingsjob ausführen
  • Ausgabeergebnisse überprüfen

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet, darunter:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Sie können mithilfe des Preisrechners die Kosten für Ihre voraussichtliche Nutzung kalkulieren. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweis

Dieser Abschnitt enthält Informationen zum Einrichten eines Cloud Storage-Buckets und einer Compute Engine-VM.

  1. Öffnen Sie ein Cloud Shell-Fenster.

    Zu Cloud Shell

  2. Erstellen Sie eine Variable für Ihre Projekt-ID.

    export PROJECT_ID=project-id
    
  3. Konfigurieren Sie das gcloud-Befehlszeilentool für das Projekt, in dem Sie eine Cloud TPU erstellen möchten.

    gcloud config set project ${PROJECT_ID}
    
  4. Erstellen Sie ein Dienstkonto für das Cloud TPU-Projekt.

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    Der Befehl gibt ein Cloud TPU-Dienstkonto im folgenden Format zurück:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    
  5. Erstellen Sie mit dem folgenden Befehl einen Cloud Storage-Bucket:

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 -b on gs://bucket-name
    

    Dieser Cloud Storage-Bucket speichert die Daten, die Sie zum Trainieren Ihres Modells verwenden, und die Trainingsergebnisse. Mit dem in dieser Anleitung verwendeten gcloud compute tpus execution-groups-Befehl werden Standardberechtigungen für das Cloud TPU-Dienstkonto eingerichtet, das Sie im vorherigen Schritt eingerichtet haben. Wenn Sie genauere Berechtigungen benötigen, können Sie die Berechtigungen auf Zugriffsebene anpassen.

    Der Bucket-Standort muss sich in derselben Region wie Ihre Compute Engine (VM) und Ihr Cloud TPU-Knoten befinden.

  6. Starten Sie mit dem Befehl gcloud eine Compute Engine-VM und eine Cloud TPU. Der verwendete Befehl hängt davon ab, ob Sie eine TPU-VM oder einen TPU-Knoten verwenden. Weitere Informationen zur beiden VM-Architektur finden Sie unter Systemarchitektur. Weitere Informationen zum Befehl gcloud finden Sie in der gcloud-Referenz.

    TPU-VMs

    $ gcloud alpha compute tpus tpu-vm create bert-tutorial \
    --zone=europe-west4-a \
    --accelerator-type=v3-8 \
    --version=v2-alpha
    

    Beschreibung der Befehls-Flags

    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    accelerator-type
    Der Typ der zu erstellenden Cloud TPU.
    version
    Die Cloud TPU-Laufzeitversion.

    TPU-Knoten

    $ gcloud compute tpus execution-groups create \
    --name=bert-tutorial \
    --zone=europe-west4-a \
    --tf-version=2.5.0 \
    --machine-type=n1-standard-1 \
    --accelerator-type=v3-8
    

    Beschreibung der Befehls-Flags

    name
    Der Name der Cloud TPU, die erstellt werden soll.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    tf-version
    Die Version von Tensorflow, die ctpu auf der VM installiert.
    machine-type
    Der Maschinentyp der zu erstellenden Compute Engine-VM.
    accelerator type
    Der Typ der zu erstellenden Cloud TPU.
  7. Wenn Sie nicht automatisch bei der Compute Engine-Instanz angemeldet sind, melden Sie sich mit dem folgenden ssh-Befehl an. Wenn Sie bei der VM angemeldet sind, ändert sich Ihre Shell-Eingabeaufforderung von username@projectname in username@vm-name:

    TPU-VM

    gcloud alpha compute tpus tpu-vm ssh bert-tutorial --zone=europe-west4-a
    

    TPU-Knoten

    gcloud compute ssh bert-tutorial --zone=europe-west4-a
    

    Führen Sie im weiteren Verlauf dieser Anleitung jeden Befehl, der mit (vm)$ beginnt, in Ihrem VM-Sitzungsfenster aus.

  8. Erstellen Sie eine Umgebungsvariable für den TPU-Namen.

    TPU-VM

    (vm)$ export TPU_NAME=local
    

    TPU-Knoten

    (vm)$ export TPU_NAME=bert-tutorial
    

Dataset vorbereiten

  1. Installieren Sie TensorFlow-Anforderungen.

    Der verwendete Befehl hängt davon ab, ob Sie eine TPU-VM oder einen TPU-Knoten verwenden.

    TPU-VM

    (vm)$ git clone https://github.com/tensorflow/models.git
    (vm)$ pip3 install -r models/official/requirements.txt
    

    TPU-Knoten

    (vm)$ sudo pip3 install -r /usr/share/models/official/requirements.txt
    
  2. Optional: Download von download_glue_data.py

    In dieser Anleitung wird die GLUE-Benchmark (General Language Understanding Evaluation) verwendet, um die Leistung des Modells zu bewerten und zu analysieren. Die GLUE-Daten wurden für diese Anleitung unter gs://cloud-tpu-checkpoints/bert/classification bereitgestellt.

    Wenn Sie mit Glue-Rohdaten arbeiten und TFRecords erstellen möchten, folgen Sie der Anleitung zur Dataset-Verarbeitung auf GitHub.

Parameterwerte definieren

  1. Definieren Sie mehrere Parameterwerte, die zum Trainieren und Bewerten des Modells erforderlich sind:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export BERT_BASE_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/bert-output
    (vm)$ export GLUE_DIR=gs://cloud-tpu-checkpoints/bert/classification
    (vm)$ export TASK=mnli
    
  2. Legen Sie die Umgebungsvariable PYTHONPATH fest.

    TPU-VM

    (vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}"
    

    TPU-Knoten

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
  3. Wechseln Sie zum Verzeichnis, in dem sich das Modell befindet:

    TPU-VM

    (vm)$ cd ~/models/official/nlp/bert
    

    TPU-Knoten

    (vm)$ cd /usr/share/models/official/nlp/bert
    

Modell trainieren

Auf der Compute Engine-VM führen Sie den folgenden Befehl aus:

(vm)$ python3 run_classifier.py \
  --mode='train_and_eval' \
  --input_meta_data_path=${GLUE_DIR}/${TASK}_meta_data \
  --train_data_path=${GLUE_DIR}/${TASK}_train.tf_record \
  --eval_data_path=${GLUE_DIR}/${TASK}_eval.tf_record \
  --bert_config_file=${BERT_BASE_DIR}/bert_config.json \
  --init_checkpoint=${BERT_BASE_DIR}/bert_model.ckpt \
  --train_batch_size=32 \
  --eval_batch_size=32 \
  --learning_rate=2e-5 \
  --num_train_epochs=1 \
  --model_dir=${MODEL_DIR} \
  --distribution_strategy=tpu \
  --tpu=${TPU_NAME} \
  --steps_per_loop=500

Beschreibung der Befehls-Flags

mode
Entweder train, eval, train_and_eval oder predict.
input_meta_data_path
Der Pfad zu einer Datei, die Metadaten zum Dataset enthält, die für das Training und die Bewertung verwendet werden sollen.
train_data_path
Der Cloud Storage-Pfad für die Trainingseingabe. In diesem Beispiel ist er auf das Dataset "fake_imagenet" festgelegt.
eval_data_path
Der Cloud Storage-Pfad für die Bewertungseingabe. In diesem Beispiel ist er auf das Dataset "fake_imagenet" festgelegt.
bert_config_file
Die BERT-Konfigurationsdatei.
init_checkpoint
Der Pfad zur JSON-Datei, die den ersten Prüfpunkt des vortrainierten BERT-Modells enthält.
train_batch_size
Die Größe des Trainingsbatches.
eval_batch_size
Die Größe des Bewertungsbatches.
learning_rate
Die Lernrate.
num_train_epochs
Die Anzahl der Epochen zum Trainieren des Modells.
model_dir
Der Cloud Storage-Pfad, in dem während des Modelltrainings Prüfpunkte und Zusammenfassungen gespeichert werden. Sie können einen vorhandenen Ordner wiederverwenden, um zuvor generierte Prüfpunkte zu laden und zusätzliche Prüfpunkte zu speichern, sofern die vorherigen Prüfpunkte mit einer Cloud TPU derselben Größe und TensorFlow-Version erstellt wurden.
distribution_strategy
Zum Trainieren des ResNet-Modells in einer TPU legen Sie für distribution_strategy den Wert tpu fest.
tpu
Der Name der Cloud TPU, die für das Training verwendet werden soll.
steps_per_loop
Die Anzahl der Trainingsschritte, die ausgeführt werden sollen, bevor der Status auf der CPU gespeichert wird. Ein Trainingsschritt ist die Verarbeitung eines Batches von Beispielen. Dies gilt sowohl für den Vorwärtsdurchlauf als auch für die Rückpropagierung.

Auf einer v3-8-TPU dauert das Training ungefähr 30 Minuten. Nach Abschluss sollte das Trainingsskript folgende Ergebnisse anzeigen:

12271/12271 [==============================]
  - 756s 62ms/step
  - loss: 0.4864
  - accuracy: 0.8055
  - val_loss: 0.3832
  - val_accuracy: 0.8546

Um die Genauigkeit zu erhöhen, legen Sie --num_tain_epochs=3 fest.

Bereinigen

  1. Trennen Sie die Verbindung zur Compute Engine-Instanz, sofern noch nicht geschehen:

    (vm)$ exit
    

    Die Eingabeaufforderung sollte nun username@projectname lauten und angeben, dass Sie sich in Cloud Shell befinden.

  2. Löschen Sie Ihre Cloud TPU- und Compute Engine-Ressourcen. Der Befehl zum Löschen Ihrer Ressourcen hängt davon ab, ob Sie TPU-VMs oder TPU-Knoten verwenden. Weitere Informationen finden Sie unter Systemarchitektur.

    TPU-VMs

    $ gcloud alpha compute tpus tpu-vm delete bert-tutorial \
    --zone=europe-west4-a
    

    TPU-Knoten

    $ gcloud compute tpus execution-groups delete bert-tutorial \
    --zone=europe-west4-a
    
  3. Prüfen Sie, ob die Ressourcen gelöscht wurden. Führen Sie dazu gcloud compute tpus execution-groups list aus. Der Löschvorgang kann einige Minuten dauern. Eine Antwort wie die folgende gibt an, dass Ihre Instanzen erfolgreich gelöscht wurden.

    $ gcloud compute tpus execution-groups list \
      --zone=europe-west4-a
    
     Listed 0 items.
    
  4. Löschen Sie Ihren Cloud Storage-Bucket wie unten gezeigt mit gsutil. Ersetzen Sie bucket-name durch den Namen des Cloud Storage-Buckets.

    $ gsutil rm -r gs://bucket-name
    

Nächste Schritte

In dieser Anleitung haben Sie das BERT-Modell mithilfe eines Beispiel-Datasets trainiert. Die Ergebnisse dieses Trainings sind in den meisten Fällen nicht für die Inferenz verwendbar. Wenn Sie ein Modell für die Inferenz verwenden möchten, können Sie die Daten in einem öffentlich verfügbaren Dataset oder in Ihrem eigenen Dataset trainieren. Für Modelle, die auf Cloud TPUs trainiert wurden, müssen Datasets das Format TFRecord haben.

Sie können das Beispiel für das Dataset-Konvertierungstool verwenden, um ein Bildklassifizierungs-Dataset in das TFRecord-Format zu konvertieren. Wenn Sie kein Bildklassifizierungsmodell verwenden, müssen Sie das Dataset selbst in das TFRecords-Format konvertieren. Weitere Informationen finden Sie unter TFRecord und tf.Example

Hyperparameter-Abstimmung

Sie können die Hyperparameter des Modells optimieren, um die Leistung des Modells mit Ihrem Dataset zu verbessern. Informationen zu Hyperparametern, die für alle TPU-unterstützten Modelle üblich sind, finden Sie auf GitHub. Informationen zu modellspezifischen Hyperparametern finden Sie im Quellcode für die einzelnen Modelle. Weitere Informationen zur Hyperparameter-Abstimmung finden Sie unter Übersicht über Hyperparameter-Abstimmung, Hyperparameter-Abstimmungsdienst und Hyperparameter abstimmen.

Inferenz

Sobald Ihr Modell trainiert ist, können Sie es für Inferenz (auch als Vorhersage bezeichnet) verwenden. AI Platform ist eine cloudbasierte Lösung, mit der Sie Modelle für maschinelles Lernen entwickeln, trainieren und bereitstellen können. Sobald ein Modell bereitgestellt wurde, können Sie den AI Platform Prediction-Dienst verwenden.