Transformer mit Tensor2Tensor in der Cloud TPU ausführen

In dieser Anleitung erfahren Sie, wie Sie das Transformer-Modell (von Attention Is All You Need) mit Tensor2Tensor auf einer Cloud TPU trainieren.

Modellbeschreibung

Das Transformer-Modell verwendet Stapel von Self-Attention- und Feed-Forward-Schichten, um sequenzielle Eingaben wie Text zu verarbeiten. Die folgenden Varianten werden unterstützt:

  • transformer (nur Decoder) für Einzelsequenzmodelle. Anwendungsbeispiel: Sprachmodellierung.
  • transformer (Encoder-Decoder) für Sequenz-zu-Sequenz-Modelle. Anwendungsbeispiel: Übersetzung.
  • transformer_encoder (nur Encoder) führt nur den Encoder für Sequenz-zu-Klasse-Modelle aus. Anwendungsbeispiel: Sentimentklassifizierung.

Der Transformer ist nur eines der Modelle in der Tensor2Tensor-Bibliothek. Tensor2Tensor (T2T) ist eine Bibliothek mit Deep-Learning-Modellen und -Datasets sowie verschiedenen Skripts, mit denen Sie die Modelle trainieren und die Daten herunterladen und vorbereiten können.

Lernziele

  • Trainings-Dataset generieren
  • Sprachmodell auf einer einzelnen Cloud TPU oder einem Cloud TPU Pod trainieren
  • Übersetzungsmodell Englisch-Deutsch auf einer einzelnen Cloud TPU trainieren
  • Sentimentklassifikator auf einer einzelnen Cloud TPU trainieren
  • Cloud TPU-Ressourcen bereinigen

Kosten

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

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

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.

Hinweis

Wenn Sie in einem TPU Pod-Segment trainieren möchten, lesen Sie bitte Training für TPU-Pods, die die speziellen Überlegungen beim Training in einem Pod-Segment erläutert.

Bevor Sie mit dieser Anleitung beginnen, führen Sie die folgenden Schritte aus, um zu überprüfen, ob Ihr Google Cloud-Projekt richtig eingerichtet ist.

Dieser Abschnitt enthält Informationen zum Einrichten von einem Cloud Storage-Bucket und einer Compute Engine-VM.

  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-Befehlszeile für das Projekt, in dem Sie 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 auf Authorize unten auf der Seite, damit gcloud GCP API-Aufrufe mit Ihren Anmeldedaten durchfü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:

    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. Das in dieser Anleitung verwendete Tool gcloud compute tpus execution-groups richtet Standardberechtigungen für das Cloud TPU-Dienstkonto ein. Wenn Sie weitere Berechtigungen benötigen, können Sie die Berechtigungen auf Zugriffsebene anpassen.

    Der Bucket-Speicherort muss sich in derselben Region wie die virtuelle Maschine (VM) und der TPU-Knoten befinden. VMs und TPU-Knoten befinden sich in bestimmten Zonen, die Untergruppen innerhalb einer Region sind.

  6. Starten Sie mit dem Befehl gcloud eine Compute Engine-VM.

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --name=transformer-tutorial \
     --zone=europe-west4-a \
     --disk-size=300 \
     --machine-type=n1-standard-8 \
     --tf-version=1.15.5
    

    Beschreibung der Befehls-Flags

    vm-only
    Erstellen Sie nur eine VM. Standardmäßig werden mit dem Befehl gcloud compute tpus execution-groups eine VM und eine Cloud TPU erstellt.
    name
    Der Name der zu erstellenden Cloud TPU.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    disk-size
    Die Größe des Laufwerks in GB der VM, die mit dem Befehl gcloud compute tpus execution-groups erstellt wurde.
    machine-type
    Der Maschinentyp der zu erstellenden Compute Engine-VM.
    tf-version
    Die Version von TensorFlow gcloud compute tpus execution-groups wird auf der VM installiert.

    Weitere Informationen zum Befehl gcloud finden Sie in der gcloud-Referenz.

  7. Die von Ihnen angegebene Konfiguration wird angezeigt. Geben Sie y zum Bestätigen oder n zum Abbrechen ein.

    Wenn der Befehl gcloud compute tpus execution-groups ausgeführt wurde, sollten Sie prüfen, ob die Shell-Eingabeaufforderung von username@projectname zu username@vm-name geändert wurde. Diese Änderung bedeutet, dass Sie jetzt bei Ihrer Compute Engine-VM angemeldet sind.

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

    Führen Sie im weiteren Verlauf dieser Anleitung jeden Befehl, der mit (vm)$ beginnt, in Ihrer Compute Engine-Instanz aus.

Auf Ihrer Compute Engine-VM:

  1. Erstellen Sie die folgenden Umgebungsvariablen:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/transformer
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
    (vm)$ export TMP_DIR=${HOME}/t2t_tmp
  2. Verzeichnis zum Speichern temporärer Dateien erstellen:

    (vm)$ mkdir ${TMP_DIR}
  3. Fügen Sie den Pfad zu den Skripts tensor2tensor hinzu, die zum Verarbeiten der Modelldaten verwendet werden:

    (vm)$ export PATH=.local/bin:${PATH}

Trainieren Sie ein Sprachmodell auf einer einzelnen Cloud TPU

  1. Generieren Sie das Trainings-Dataset für das Sprachmodell.

    (vm)$ t2t-datagen --problem=languagemodel_lm1b32k_packed \
     --data_dir=${DATA_DIR} \
     --tmp_dir=${TMP_DIR}

    Beschreibung der Befehls-Flags

    problem
    Die Bezeichnung des Problems.
    data_dir
    Der Cloud Storage-Pfad der Trainingseingabe.
    tmp_dir
    Das temporäre Speicherverzeichnis.
  2. Führen Sie den folgenden Befehl aus, um Ihre Cloud TPU-Ressource zu erstellen.

    (vm)$ gcloud compute tpus execution-groups create --tpu-only \
     --zone=europe-west4-a \
     --tf-version=1.15.5 \
     --name=transformer-tutorial

    Beschreibung der Befehls-Flags

    tpu-only
    Erstellen Sie nur eine Cloud TPU. Standardmäßig werden mit dem Befehl gcloud compute tpus execution-groups eine VM und eine Cloud TPU erstellt.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten. Das sollte dieselbe Zone sein, die Sie für die Compute Engine-VM verwendet haben. Beispiel: europe-west4-a.
    tf-version
    Die Version von TensorFlow ctpu wird auf der VM installiert.
    name
    Der Name der zu erstellenden Cloud TPU.
  3. Legen Sie eine Umgebungsvariable für den TPU-Namen fest.

    (vm)$ export TPU_NAME=transformer-tutorial
  4. Führen Sie das Trainingsskript aus.

    (vm)$ t2t-trainer \
     --model=transformer \
     --hparams_set=transformer_tpu \
     --problem=languagemodel_lm1b32k_packed \
     --eval_steps=3 \
     --data_dir=${DATA_DIR} \
     --output_dir=${MODEL_DIR}/language_lm1b32k \
     --use_tpu=True \
     --cloud_tpu_name=${TPU_NAME} \
     --train_steps=10

    Beschreibung der Befehls-Flags

    model
    Das Modell, das trainiert werden soll.
    hparams_set
    Die Hyperparameter, die während des Trainings verwendet werden sollen.
    problem
    Die Bezeichnung des Problems.
    eval-steps
    Die Anzahl der Schritte, die ausgewertet werden sollen.
    data_dir
    Der Cloud Storage-Pfad, in dem die Trainingsdaten gespeichert werden.
    output_dir
    Das Basisausgabeverzeichnis für die Ausführung.
    use_tpu
    Setzen Sie den Wert auf „true“, um eine Cloud TPU zu verwenden, andernfalls auf „false“.
    cloud_tpu_name
    Der Name der Cloud TPU, die für das Training verwendet werden soll.
    train_steps
    Die Anzahl der Trainingsschritte.

    Mit dem Befehl oben werden zehn Trainingsschritte und anschließend drei Bewertungsschritte ausgeführt. Die Ausführung dauert ca. fünf Minuten auf einem v3-8-TPU-Knoten. Wenn Sie dieses Modell präziser gestalten möchten, passen Sie das Flag --train_steps an, um die Anzahl der Trainingsschritte zu erhöhen. Es empfiehlt sich, das Modell mit mindestens 40.000 Schritten zu trainieren. Das Modell erreicht gewöhnlich nach ca. 250.000 Schritten seine maximale Qualität.

  5. Löschen Sie die erstellte Cloud TPU-Ressource.

    $ gcloud compute tpus execution-groups delete transformer-tutorial \
      --zone=europe-west4-a \
      --tpu-only

Trainieren Sie ein Sprachmodell auf einem Cloud TPU Pod

  1. Führen Sie den Befehl gcloud mit dem Parameter accelerator-type aus, um das Pod-Slice anzugeben, das Sie verwenden möchten. Der folgende Befehl verwendet beispielsweise ein v2-32-Pod-Slice.

    (vm)$ gcloud compute tpus execution-groups create \
     --tpu-only \
     --accelerator-type=v2-32 \
     --name=transformer-tutorial-pod \
     --zone=europe-west4-a \
     --tf-version=1.15.5

    Beschreibung der Befehls-Flags

    tpu-only
    Erstellt die Cloud TPU, ohne eine VM zu erstellen. Standardmäßig werden mit dem Befehl gcloud compute tpus execution-groups eine VM und eine Cloud TPU erstellt.
    accelerator-type
    Der Typ der zu erstellenden Cloud TPU.
    name
    Der Name der zu erstellenden Cloud TPU.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    tf-version
    Die Version von TensorFlow ctpu wird auf der VM installiert.
  2. Legen Sie eine Umgebungsvariable für den neuen TPU-Namen fest.

    (vm)$ export TPU_NAME=transformer-tutorial-pod
  3. Führen Sie das Trainingsskript aus.

    (vm)$ t2t-trainer \
     --model=transformer \
     --hparams_set=transformer_tpu \
     --problem=languagemodel_lm1b32k_packed \
     --eval_steps=3 \
     --data_dir=${DATA_DIR} \
     --output_dir=${MODEL_DIR}/language_lm1b32k_pod \
     --use_tpu=True \
     --cloud_tpu_name=${TPU_NAME} \
     --tpu_num_shards=32  \
     --schedule=train \
     --train_steps=25000

    Beschreibung der Befehls-Flags

    model
    Das Modell, das trainiert werden soll.
    hparams_set
    Die Hyperparameter, die während des Trainings verwendet werden sollen.
    problem
    Die Bezeichnung des Problems.
    eval-steps
    Die Anzahl der Schritte, die ausgewertet werden sollen.
    data_dir
    Der Cloud Storage-Pfad, in dem die Trainingsdaten gespeichert werden.
    output_dir
    Das Basisausgabeverzeichnis für die Ausführung.
    use_tpu
    Setzen Sie den Wert auf „true“, um eine Cloud TPU zu verwenden, andernfalls auf „false“.
    cloud_tpu_name
    Der Name der Cloud TPU, die für das Training verwendet werden soll.
    tpu_num_shards
    Die Anzahl der Cloud TPU-Shards. Der Standardwert ist „8“.
    schedule
    Die auszuführende Testmethode.
    train_steps
    Die Anzahl der Schritte zum Trainieren des Modells.

    Mit dem obigen Befehl werden 25.000 Trainingsschritte und anschließend drei Bewertungsschritte ausgeführt. Es dauert ungefähr 30 Minuten, um dieses Training mit einer Cloud TPU v2-32 auszuführen.

    Es empfiehlt sich, das Modell mit mindestens 40.000 Schritten zu trainieren. Das Modell erreicht gewöhnlich nach ca. 250.000 Schritten seine maximale Qualität.

  4. Löschen Sie die Cloud TPU-Ressource, die Sie für das Training erstellt haben.

    (vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \
      --zone=europe-west4-a \
      --tpu-only

Übersetzungsmodell Englisch-Deutsch auf einer einzelnen Cloud TPU trainieren

  1. Verwenden Sie das Skript t2t-datagen, um die Trainings- und Bewertungsdaten für das Übersetzungsmodell im Cloud Storage-Bucket zu generieren:

    (vm)$ t2t-datagen \
     --problem=translate_ende_wmt32k_packed \
     --data_dir=${DATA_DIR} \
     --tmp_dir=${TMP_DIR}

    Beschreibung der Befehls-Flags

    problem
    Die Bezeichnung des Problems.
    data_dir
    Der Cloud Storage-Pfad der Trainingseingabe.
    tmp_dir
    Das temporäre Speicherverzeichnis.
  2. Führen Sie den folgenden Befehl aus, um Ihre Cloud TPU-Ressource zu erstellen.

    (vm)$ gcloud compute tpus execution-groups create --tpu-only \
     --zone=europe-west4-a \
     --tf-version=1.15.5 \
     --name=transformer-tutorial

    Beschreibung der Befehls-Flags

    tpu-only
    Erstellen Sie nur eine Cloud TPU. Standardmäßig werden mit dem Befehl gcloud compute tpus execution-groups eine VM und eine Cloud TPU erstellt.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    tf-version
    Die Version von TensorFlow gcloud compute tpus execution-groups wird auf der VM installiert.
    name
    Der Name der zu erstellenden Cloud TPU.
  3. Legen Sie eine Umgebungsvariable für den neuen TPU-Namen fest.

    (vm)$ export TPU_NAME=transformer-tutorial
  4. Führen Sie t2t-trainer aus, um das Modell zu trainieren und zu bewerten:

    (vm)$ t2t-trainer \
     --model=transformer \
     --hparams_set=transformer_tpu \
     --problem=translate_ende_wmt32k_packed \
     --eval_steps=3 \
     --data_dir=${DATA_DIR} \
     --output_dir=${MODEL_DIR}/translate_ende \
     --use_tpu=True \
     --cloud_tpu_name=${TPU_NAME} \
     --train_steps=10

    Beschreibung der Befehls-Flags

    model
    Das Modell, das trainiert werden soll.
    hparams_set
    Die Hyperparameter, die während des Trainings verwendet werden sollen.
    problem
    Die Bezeichnung des Problems.
    eval-steps
    Die Anzahl der Schritte, die ausgewertet werden sollen.
    data_dir
    Der Cloud Storage-Pfad, in dem die Trainingsdaten gespeichert werden.
    output_dir
    Das Basisausgabeverzeichnis für die Ausführung.
    use_tpu
    Setzen Sie den Wert auf „true“, um eine Cloud TPU zu verwenden, andernfalls auf „false“.
    cloud_tpu_name
    Der Name der Cloud TPU, die für das Training verwendet werden soll.
    train_steps
    Die Anzahl der Schritte zum Trainieren des Modells.

    Mit dem Befehl oben werden zehn Trainingsschritte und anschließend drei Bewertungsschritte ausgeführt. Die Ausführung auf einem v3-8-TPU-Knoten dauert ca. fünf Minuten. Sie können (und sollten) die Anzahl der Trainingsschritte erhöhen, indem Sie das Flag --train_steps anpassen. Übersetzungen ergeben in der Regel nach etwa 40.000 Schritten Sinn. Das Modell erreicht gewöhnlich nach ca. 250.000 Schritten seine maximale Qualität.

  5. Löschen Sie die Cloud TPU-Ressource, die Sie zum Trainieren des Modells auf einem einzelnen Gerät erstellt haben.

    (vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \
     --tpu-only \
     --zone=europe-west4-a 

Trainieren Sie ein Sentimentklassifikatormodell auf einer einzelnen Cloud TPU

  1. Generieren Sie das Dataset für das Sentimentklassifikatormodell.

    (vm)$ t2t-datagen --problem=sentiment_imdb \
     --data_dir=${DATA_DIR} \
     --tmp_dir=${TMP_DIR}
  2. Führen Sie den folgenden Befehl aus, um Ihre Cloud TPU-Ressource zu erstellen.

    (vm)$ gcloud compute tpus execution-groups create --tpu-only \
     --zone=europe-west4-a \
     --tf-version=1.15.5 \
     --name=transformer-tutorial

    Beschreibung der Befehls-Flags

    tpu-only
    Erstellen Sie nur eine Cloud TPU. Standardmäßig werden mit dem Befehl gcloud compute tpus execution-groups eine VM und eine Cloud TPU erstellt.
    zone
    Die Zone, in der Sie die Cloud TPU erstellen möchten.
    tf-version
    Die Version von TensorFlow gcloud compute tpus execution-groups wird auf der VM installiert.
    name
    Der Name der zu erstellenden Cloud TPU.
  3. Führen Sie das Trainingsskript aus.

    (vm)$ t2t-trainer \
     --model=transformer_encoder \
     --hparams_set=transformer_tiny_tpu \
     --problem=sentiment_imdb \
     --eval_steps=1 \
     --data_dir=${DATA_DIR} \
     --output_dir=${MODEL_DIR}/sentiment_classifier \
     --use_tpu=True \
     --cloud_tpu_name=${TPU_NAME} \
     --train_steps=10
    

    Beschreibung der Befehls-Flags

    model
    Das Modell, das trainiert werden soll.
    hparams_set
    Die Hyperparameter, die während des Trainings verwendet werden sollen.
    problem
    Die Bezeichnung des Problems.
    eval-steps
    Die Anzahl der Schritte, die ausgewertet werden sollen.
    data_dir
    Der Cloud Storage-Pfad, in dem die Trainingsdaten gespeichert werden.
    output_dir
    Das Basisausgabeverzeichnis für die Ausführung.
    use_tpu
    Setzen Sie den Wert auf „true“, um eine Cloud TPU zu verwenden, andernfalls auf „false“.
    cloud_tpu_name
    Der Name der Cloud TPU, die für das Training verwendet werden soll.
    train_steps
    Die Anzahl der Schritte zum Trainieren des Modells.

    Mit dem Befehl oben werden zehn Trainingsschritte und anschließend drei Bewertungsschritte ausgeführt. Die Ausführung auf einem v3-8-TPU-Knoten dauert ca. fünf Minuten. Dieses Modell erreicht nach etwa 2.000 Schritten eine Genauigkeit von etwa 85 %.

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. Führen Sie in Cloud Shell den Befehl gcloud compute tpus execution-groups mit dem Flag "--zone" aus, das Sie auch beim Einrichten der Cloud TPU angegeben haben, um die Compute Engine-VM und die Cloud TPU zu löschen:

    $ gcloud compute tpus execution-groups delete transformer-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
    

    Sie sollten eine leere Liste der TPUs sehen, die in etwa so aussieht:

       NAME             STATUS
    
  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
    

Weitere Informationen

In den Cloud TPU-Anleitungen von TensorFlow wird das Modell in der Regel mithilfe eines Beispiel-Datasets trainiert. Die Ergebnisse dieser Schulung können nicht für Inferenzen verwendet werden. Wenn Sie ein Inferenzmodell verwenden möchten, können Sie die Daten mit einem öffentlich verfügbaren Dataset oder Ihrem eigenen Dataset trainieren. TensorFlow-Modelle, die auf Cloud TPUs trainiert werden, benötigen im Allgemeinen Datasets im Format TFRecord.

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-Feinabstimmung

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.