Transformer auf Cloud TPU (TF 2.x) trainieren


Wenn Sie mit Cloud TPU nicht vertraut sind, sollten Sie unbedingt die quickstart durchgehen, damit Sie lernen, wie eine TPU-VM erstellt wird.

In dieser Anleitung erfahren Sie, wie Sie ein Transformer-Modell in Cloud TPU trainieren. Transformer ist eine neuronale Netzwerkarchitektur, die Sequenz-zu-Sequenz-Probleme mithilfe von Aufmerksamkeitsmechanismen löst. Im Gegensatz zu herkömmlichen neuronalen Sequenz-zu-Sequenz-Modellen umfasst Transformer keine wiederkehrenden Verbindungen. Der Aufmerksamkeitsmechanismus lernt Abhängigkeiten zwischen Tokens in zwei Sequenzen. Da Aufmerksamkeitsgewichtungen auf alle Tokens in den Sequenzen angewendet werden, kann das Transformer-Modell problemlos Abhängigkeiten über weite Strecken erfassen.

Die gesamte Struktur von Transformer folgt dem Encoder-Decoder-Standardmuster. Der Codierer verwendet "Self-Attention", um eine Darstellung der Eingabesequenz zu berechnen. Der Decoder generiert die Ausgabesequenz Token für Token und verwendet die Encoder-Ausgabe und vorherige Decoder-Ausgabetokens als Eingaben.

Das Modell wendet auch Einbettungen auf die Eingabe- und Ausgabetokens an und fügt eine konstante Positionscodierung hinzu. Die Positionscodierung fügt Informationen über die Position jedes Tokens hinzu.

Lernziele

  • Cloud Storage-Bucket zum Speichern der Dataset- und Modellausgabe erstellen
  • Laden Sie das zum Trainieren des Modells verwendete Dataset herunter und vorverarbeiten Sie es.
  • Trainingsjob ausführen
  • Ausgabeergebnisse überprüfen

Kosten

In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:

  • Compute Engine
  • Cloud TPU

Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen. Neuen Google Cloud-Nutzern steht möglicherweise eine kostenlose Testversion zur Verfügung.

Hinweise

Bevor Sie mit dieser Anleitung beginnen, prüfen Sie, ob Ihr Google Cloud-Projekt ordnungsgemäß eingerichtet ist.

  1. Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  4. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  5. Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.

  6. In dieser Anleitung werden kostenpflichtige Komponenten der Google Cloud verwendet. Rufen Sie die Seite mit den Cloud TPU-Preisen auf, um Ihre Kosten abzuschätzen. Denken Sie daran, nicht mehr benötigte Ressourcen zu bereinigen, um unnötige Kosten zu vermeiden.

Mit einem einzelnen Cloud TPU-Gerät trainieren

Dieser Abschnitt enthält Informationen zum Einrichten eines Cloud Storage-Bucket und einer TPU-VM für das Training mit einem einzelnen Gerät.

  1. Öffnen Sie ein Cloud Shell-Fenster.

    Cloud Shell öffnen

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

    export PROJECT_ID=project-id
    
  3. Konfigurieren Sie die Google Cloud CLI so, dass das Google Cloud-Projekt verwendet wird, in dem Sie eine Cloud TPU erstellen möchten.

    gcloud config set project ${PROJECT_ID}
    

    Wenn Sie diesen Befehl zum ersten Mal in einer neuen Cloud Shell-VM ausführen, wird die Seite Authorize Cloud Shell angezeigt. Klicken Sie unten auf der Seite auf Authorize, um gcloud das Ausführen von Google Cloud API-Aufrufen mit Ihren Anmeldedaten zu erlauben.

  4. Erstellen Sie ein Dienstkonto für das Cloud TPU-Projekt.

    Dienstkonten ermöglichen dem Cloud TPU-Dienst den Zugriff auf andere Google Cloud-Dienste.

    $ 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 us-central2 gs://bucket-name
    

    Dieser Cloud Storage-Bucket speichert die Daten, die Sie zum Trainieren Ihres Modells verwenden, sowie die Trainingsergebnisse. Mit dem gcloud-Befehl, der in dieser Anleitung zum Einrichten der TPU verwendet wird, werden auch 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.

Transformer-Modell auf einer einzelnen Cloud TPU trainieren

  1. Starten Sie eine Cloud TPU-VM mit dem Befehl gcloud.

      $ gcloud compute tpus tpu-vm create transformer-tutorial \
         --zone=us-central2-b \
         --accelerator-type=v4-8 \
         --version=tpu-vm-tf-2.16.1-pjrt
    

    Beschreibung der Befehls-Flags

    zone
    Die Zone, in der Sie Ihre Cloud TPU erstellen möchten.
    accelerator-type
    Der Beschleunigertyp gibt die Version und Größe der Cloud TPU an, die Sie erstellen möchten. Weitere Informationen zu unterstützten Beschleunigertypen für die einzelnen TPU-Versionen finden Sie unter TPU-Versionen.
    version
    Die Cloud TPU-Softwareversion.
  2. Stellen Sie mit dem folgenden ssh-Befehl eine Verbindung zur Cloud TPU-VM her.

    gcloud compute tpus tpu-vm ssh transformer-tutorial --zone=us-central2-b
    
  3. Exportieren Sie Umgebungsvariablen.

      (vm)$ export STORAGE_BUCKET=gs://bucket-name
      (vm)$ export SENTENCEPIECE_MODEL=sentencepiece
      (vm)$ export SENTENCEPIECE_MODEL_PATH=${STORAGE_BUCKET}/${SENTENCEPIECE_MODEL}.model
      (vm)$ export TFDS_DIR=${STORAGE_BUCKET}/tfds
      (vm)$ export PARAM_SET=big
      (vm)$ export TPU_NAME=local
      (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/transformer/model_${PARAM_SET}
      (vm)$  export PYTHONPATH="/usr/share/tpu/models:$PYTHONPATH"
    
  4. Wenn Sie beim Erstellen Ihrer TPU den Parameter --version auf eine Version festlegen, die auf -pjrt endet, legen Sie die folgenden Umgebungsvariablen fest, um die PJRT-Laufzeit zu aktivieren:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    
  5. Installieren Sie TensorFlow-Anforderungen.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    
  6. Dataset herunterladen und vorverarbeiten

      (vm)$ python3 -c "import tensorflow_datasets as tfds; tfds.load('wmt14_translate/de-en', split='train+validation', shuffle_files=True, download=True)"
      (vm)$ python3 /usr/share/tpu/models/official/nlp/data/train_sentencepiece.py --output_model_path=${SENTENCEPIECE_MODEL}
    
  7. Dataset in den Cloud Storage-Bucket kopieren

      (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.model ${STORAGE_BUCKET}
      (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.vocab ${STORAGE_BUCKET}
      (vm)$ gsutil -m cp -r tensorflow_datasets/wmt14_translate ${TFDS_DIR}/wmt14_translate
    
  8. Trainingsverzeichnis aufrufen

    (vm)$ cd /usr/share/tpu/models/
    
  9. Trainingsskript ausführen

    (vm)$ python3 official/nlp/train.py \
      --tpu=${TPU_NAME} \
      --experiment=wmt_transformer/large \
      --mode=train_and_eval \
      --model_dir=${MODEL_DIR} \
      --params_override="runtime.distribution_strategy=tpu, task.train_data.tfds_data_dir=${TFDS_DIR}, task.validation_data.tfds_data_dir=${TFDS_DIR}, task.sentencepiece_model_path=${SENTENCEPIECE_MODEL_PATH}, trainer.train_steps=10000, trainer.validation_interval=10000"
    

    Beschreibung der Befehls-Flags

    tpu
    Der Name der Cloud TPU. Dieser wird durch Angabe der Umgebungsvariable (TPU_NAME) festgelegt.
    experiment
    Das Modell, das trainiert werden soll.
    mode
    Der Modus, in dem das Script ausgeführt wird.
    model_dir
    Der Cloud Storage-Bucket, in dem während des Trainings Prüfpunkte und Zusammenfassungen gespeichert werden. Sie können einen vorhandenen Ordner verwenden, um zuvor generierte Prüfpunkte zu laden, die auf einer TPU derselben Größe und TensorFlow-Version erstellt wurden.
    params_override
    Modellparameter festlegen

    Standardmäßig wird das Modell nach 10.000 Schritten ausgewertet. Mit den folgenden Parametern können Sie die Anzahl der Trainingsschritte erhöhen oder angeben, wie oft Bewertungen ausgeführt werden sollen:

    • train.train_steps: Die Gesamtzahl der auszuführenden Trainingsschritte.
    • trainer.validation_interval: Die Anzahl der Trainingsschritte, die zwischen den Bewertungen ausgeführt werden sollen.

    Training und Bewertung dauern auf einer v4-8-Cloud TPU etwa 20 Minuten. Wenn das Training und die Bewertung abgeschlossen sind, wird eine Meldung wie die folgende angezeigt:

    I0208 20:57:19.309512 140039467895872 controller.py:310]  eval | step:  10000 | eval time:   69.2 sec | output:
    {'bleu_score': 19.204771518707275,
     'sacrebleu_score': 18.307039308307356,
     'validation_loss': 2.0654342}
     eval | step:  10000 | eval time:   69.2 sec | output:
    {'bleu_score': 19.204771518707275,
     'sacrebleu_score': 18.307039308307356,
     'validation_loss': 2.0654342}
    

    Sie haben jetzt das Einzelgerät-Training abgeschlossen. Gehen Sie folgendermaßen vor, um die Ressourcen des TPU-Einzelgeräts zu löschen.

  10. Trennen Sie die Verbindung zur Compute Engine-Instanz:

    (vm)$ exit
    

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

  11. Löschen Sie die TPU-Ressource.

      $ gcloud compute tpus tpu-vm delete transformer-tutorial \
        --zone=us-central2-b
      

    Beschreibung der Befehls-Flags

    zone
    Die Zone, in der sich Ihre Cloud TPU befand.

An dieser Stelle können Sie entweder diese Anleitung beenden und eine Bereinigung durchführen oder die Ausführung des Modells auf Cloud TPU Pods fortsetzen.

Modell mit Cloud TPU Pods skalieren

Wenn Sie das Modell auf Cloud TPU-Pods trainieren, sind möglicherweise einige Änderungen am Trainingsskript erforderlich. Weitere Informationen finden Sie unter Training auf TPU-Pods.

TPU-Pod-Training

  1. Öffnen Sie ein Cloud Shell-Fenster.

    Cloud Shell öffnen

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

    export PROJECT_ID=project-id
    
  3. Konfigurieren Sie die Google Cloud CLI so, dass das Projekt verwendet wird, in dem Sie eine Cloud TPU erstellen möchten.

    gcloud config set project ${PROJECT_ID}
    

    Wenn Sie diesen Befehl zum ersten Mal in einer neuen Cloud Shell-VM ausführen, wird die Seite Authorize Cloud Shell angezeigt. Klicken Sie unten auf der Seite auf Authorize, damit gcloud API-Aufrufe mit Ihren Anmeldedaten ausführen kann.

  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 oder verwenden Sie einen Bucket, den Sie zuvor für Ihr Projekt erstellt haben:

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 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-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.

TPU-VM-Ressourcen starten

  1. Starten Sie einen TPU-VM-Pod mit dem gcloud-Befehl. In dieser Anleitung wird ein v4-32-Pod angegeben. Weitere Pod-Optionen finden Sie auf der Seite zu verfügbaren TPU-Typen unter TPU-Typen.

    $ gcloud compute tpus tpu-vm create transformer-tutorial \
      --zone=us-central2-b \
      --accelerator-type=v3-32 \
      --version=tpu-vm-tf-2.16.1-pod-pjrt
    

    Beschreibung der Befehls-Flags

    zone
    Die Zone, in der Sie Ihre Cloud TPU erstellen möchten.
    accelerator-type
    Der Beschleunigertyp gibt die Version und Größe der Cloud TPU an, die Sie erstellen möchten. Weitere Informationen zu unterstützten Beschleunigertypen für die einzelnen TPU-Versionen finden Sie unter TPU-Versionen.
    version
    Die Cloud TPU-Softwareversion.
  2. Stellen Sie mit dem folgenden ssh-Befehl eine Verbindung zur TPU-VM her. Wenn Sie bei der VM angemeldet sind, ändert sich die Shell-Eingabeaufforderung von username@projectname in username@vm-name:

    gcloud compute tpus tpu-vm ssh transformer-tutorial --zone=us-central2-b
    
  3. Installieren Sie TensorFlow-Anforderungen.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    

Pod-Training einrichten und starten

  1. Exportieren Sie Cloud TPU-Einrichtungsvariablen:

    (vm)$ export PYTHONPATH="/usr/share/tpu/models:$PYTHONPATH"
    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export SENTENCEPIECE_MODEL=sentencepiece
    (vm)$ export SENTENCEPIECE_MODEL_PATH=${STORAGE_BUCKET}/${SENTENCEPIECE_MODEL}.model
    (vm)$ export TFDS_DIR=${STORAGE_BUCKET}/tfds
    (vm)$ export TPU_NAME=transformer-tutorial
    (vm)$ export PARAM_SET=big
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/transformer/model_${PARAM_SET}
    (vm)$ export TPU_LOAD_LIBRARY=0
    
  2. Dataset herunterladen

    (vm)$ python3 -c "import tensorflow_datasets as tfds; tfds.load('wmt14_translate/de-en', split='train+validation', shuffle_files=True, download=True)"
    (vm)$ python3 /usr/share/tpu/models/official/nlp/data/train_sentencepiece.py --output_model_path=${SENTENCEPIECE_MODEL}

  3. Dataset in Cloud Storage-Bucket kopieren

    (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.model ${STORAGE_BUCKET}
    (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.vocab ${STORAGE_BUCKET}
    (vm)$ gsutil -m cp -r tensorflow_datasets/wmt14_translate ${TFDS_DIR}/wmt14_translate
    
  4. Wechseln Sie in das Trainingsverzeichnis:

    (vm)$ cd /usr/share/tpu/models/
  5. Führen Sie das Trainingsskript aus:

    (vm)$ python3 official/nlp/train.py 
    --tpu=${TPU_NAME}
    --experiment=wmt_transformer/large
    --mode=train_and_eval
    --model_dir=${MODEL_DIR}
    --params_override="runtime.distribution_strategy=tpu, task.train_data.tfds_data_dir=${TFDS_DIR}, task.validation_data.tfds_data_dir=${TFDS_DIR}, task.sentencepiece_model_path=${SENTENCEPIECE_MODEL_PATH}, trainer.train_steps=10000, trainer.validation_interval=10000"

    Command flag descriptions

    tpu
    The name of the Cloud TPU. This is set by specifying the environment variable (TPU_NAME).
    experiment
    The model to train.
    mode
    The mode in which to run the script.
    model_dir
    The Cloud Storage bucket where checkpoints and summaries are stored during training. You can use an existing folder to load previously generated checkpoints created on a TPU of the same size and TensorFlow version.
    params_override
    Set model parameters.

Standardmäßig wird das Modell nach 10.000 Schritten ausgewertet. Zum Trainieren einer Konvergenz müssen Sie train_steps auf 200.000 ändern. Sie können die Anzahl der Trainingsschritte erhöhen oder angeben, wie oft Bewertungen ausgeführt werden sollen, indem Sie die folgenden Parameter festlegen:

  • trainer.train_steps: Legt die Gesamtzahl der auszuführenden Trainingsschritte fest.
  • trainer.validation_interval: Legt die Anzahl der Trainingsschritte fest, die zwischen den Bewertungen ausgeführt werden sollen.

Training und Bewertung dauern auf einer v4-32 Cloud TPU etwa 14 Minuten. Wenn das Training und die Bewertung abgeschlossen sind, werden Nachrichten wie diese angezeigt:

I0209 22:19:49.143219 139751309618240 controller.py:310]  eval | step:  10000 | eval time:   73.6 sec | output:
    {'bleu_score': 19.401752948760986,
     'sacrebleu_score': 18.442741330886378,
     'validation_loss': 2.0558002}
 eval | step:  10000 | eval time:   73.6 sec | output:
    {'bleu_score': 19.401752948760986,
     'sacrebleu_score': 18.442741330886378,
     'validation_loss': 2.0558002}

Dieses Trainingsskript wird für 20.000 Schritte trainiert und führt alle 2.000 Schritte eine Bewertung aus. Dieses spezielle Training und diese Bewertung dauern auf einem v3-32-Cloud TPU-Pod etwa acht Minuten. Wenn das Training und die Bewertung abgeschlossen sind, wird eine Meldung wie die folgende angezeigt:

INFO:tensorflow:Writing to file /tmp/tmpdmlanxcf
I0218 21:09:19.100718 140509661046592 translate.py:184] Writing to file /tmp/tmpdmlanxcf
I0218 21:09:28.043537 140509661046592 transformer_main.py:118] Bleu score (uncased): 1.799112930893898
I0218 21:09:28.043911 140509661046592 transformer_main.py:119] Bleu score (cased): 1.730366237461567

Zum Trainieren einer Konvergenz müssen Sie train_steps auf 200.000 ändern. Sie können die Anzahl der Trainingsschritte erhöhen oder angeben, wie oft Bewertungen ausgeführt werden sollen, indem Sie die folgenden Parameter festlegen:

  • --train_steps: Legt die Gesamtzahl der auszuführenden Trainingsschritte fest.
  • --steps_between_evals: Anzahl der Trainingsschritte, die zwischen den Bewertungen ausgeführt werden sollen.

Wenn das Training und die Bewertung abgeschlossen sind, wird eine Meldung wie die folgende angezeigt:

0509 00:27:59.984464 140553148962624 translate.py:184] Writing to file /tmp/tmp_rk3m8jp
I0509 00:28:11.189308 140553148962624 transformer_main.py:119] Bleu score (uncased): 1.3239131309092045
I0509 00:28:11.189623 140553148962624 transformer_main.py:120] Bleu score (cased): 1.2855342589318752

Bereinigen

Damit Ihrem Google Cloud-Konto die in dieser Anleitung verwendeten Ressourcen nicht in Rechnung gestellt werden, löschen Sie entweder das Projekt, das die Ressourcen enthält, oder Sie behalten das Projekt und löschen die einzelnen Ressourcen.

  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.

    $ gcloud compute tpus tpu-vm delete transformer-tutorial \
      --zone=us-central2-b
    
  3. Führen Sie gsutil wie angegeben aus und ersetzen Sie dabei bucket-name durch den Namen des Cloud Storage-Buckets, den Sie für diese Anleitung erstellt haben:

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

Nächste Schritte

In den Cloud TPU-Anleitungen von TensorFlow wird das Modell in der Regel mithilfe eines Beispiel-Datasets trainiert. Die Ergebnisse dieses Trainings sind nicht für Inferenzen verwendbar. Wenn Sie ein Modell für die Inferenz verwenden möchten, können Sie die Daten mit einem öffentlich verfügbaren Dataset oder Ihrem eigenen Dataset trainieren. Für TensorFlow-Modelle, die auf Cloud TPUs trainiert wurden, müssen im Allgemeinen Datasets im TFRecord-Format erforderlich sein.

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

Hyperparameter-Feinabstimmung

Sie können die Hyperparameter des Modells abstimmen, um die Leistung des Modells mit Ihrem Dataset zu verbessern. Informationen zu den Hyperparametern, die alle von der TPU unterstützten Modelle gemeinsam sind, finden Sie auf GitHub. Informationen zu modellspezifischen Hyperparametern finden Sie im Quellcode des jeweiligen Modells. Weitere Informationen zur Abstimmung von Hyperparametern finden Sie unter Übersicht über die Abstimmung von Hyperparametern und Hyperparameter abstimmen.

Inferenz

Nachdem Sie Ihr Modell trainiert haben, können Sie es für Inferenzen (auch Vorhersage genannt) verwenden. Mit dem Cloud TPU-Inferenzkonverter-Tool können Sie ein TensorFlow-Modell für die Inferenz in Cloud TPU v5e vorbereiten und optimieren. Weitere Informationen zur Inferenz in Cloud TPU v5e finden Sie unter Einführung in Cloud TPU v5e-Inferenz.