Trasformatore di addestramento su Cloud TPU (TF 2.x)


Se non hai dimestichezza con Cloud TPU, ti consigliamo vivamente di consultare la quickstart per scoprire come creare una VM TPU.

Questo tutorial mostra come addestrare un modello Transformer su Cloud TPU. Transformer è un'architettura di rete neurale che risolve i problemi da sequenza a sequenza utilizzando meccanismi di attenzione. A differenza dei tradizionali modelli neurali seq2seq, Transformer non prevede connessioni ricorrenti. Il meccanismo di attenzione apprende le dipendenze tra i token in due sequenze. Poiché i pesi di attenzione vengono applicati a tutti i token nelle sequenze, il modello Transformer è in grado di acquisire facilmente dipendenze a lunga distanza.

La struttura generale del trasformatore segue il pattern encoder-decoder standard. L'encoder utilizza l'auto-attenzione per calcolare una rappresentazione della sequenza di input. Il decoder genera la sequenza di output un token alla volta, prendendo come input l'output dell'encoder e i precedenti token decoder-output come input.

Il modello applica anche incorporamenti ai token di input e di output e aggiunge una codifica posizionale costante. La codifica posizionale aggiunge informazioni sulla posizione di ciascun token.

Obiettivi

  • Crea un bucket Cloud Storage in cui conservare il set di dati e l'output del modello.
  • Scarica e pre-elabora il set di dati utilizzato per addestrare il modello.
  • Eseguire il job di addestramento.
  • Verifica i risultati di output.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

  • Compute Engine
  • Cloud TPU

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud possono essere idonei a una prova senza costi aggiuntivi.

Prima di iniziare

Prima di iniziare questo tutorial, verifica che il tuo progetto Google Cloud sia configurato correttamente.

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. Nella console di Google Cloud Console, nella pagina del selettore dei progetti, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  4. Nella console di Google Cloud Console, nella pagina del selettore dei progetti, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Questa procedura dettagliata utilizza componenti fatturabili di Google Cloud. Consulta la pagina Prezzi di Cloud TPU per stimare i costi. Assicurati di ripulire le risorse che crei quando hai finito di utilizzarle per evitare addebiti inutili.

Esegui l'addestramento con un singolo dispositivo Cloud TPU

Questa sezione fornisce informazioni sulla configurazione di un bucket Cloud Storage e di una VM TPU per l'addestramento di un singolo dispositivo.

  1. Apri una finestra di Cloud Shell.

    Apri Cloud Shell

  2. Crea una variabile di ambiente per il tuo ID progetto.

    export PROJECT_ID=project-id
    
  3. Configura Google Cloud CLI per utilizzare il progetto Google Cloud in cui vuoi creare una Cloud TPU.

    gcloud config set project ${PROJECT_ID}
    

    La prima volta che esegui questo comando in una nuova VM di Cloud Shell, viene visualizzata una pagina Authorize Cloud Shell. Fai clic su Authorize in fondo alla pagina per consentire a gcloud di effettuare chiamate API Google Cloud con le tue credenziali.

  4. Creare un account di servizio per il progetto Cloud TPU.

    Gli account di servizio consentono al servizio Cloud TPU di accedere ad altri servizi Google Cloud.

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

    Il comando restituisce un account di servizio Cloud TPU con il formato seguente:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. Crea un bucket Cloud Storage utilizzando questo comando:

    $ gsutil mb -p ${PROJECT_ID} -c standard -l us-central2 gs://bucket-name
    

    Questo bucket Cloud Storage archivia i dati utilizzati per addestrare il modello e i risultati dell'addestramento. Il comando gcloud utilizzato in questo tutorial per configurare la TPU configura anche le autorizzazioni predefinite per l'account di servizio Cloud TPU che hai configurato nel passaggio precedente. Se vuoi autorizzazioni più granulari, esamina le autorizzazioni a livello di accesso.

Addestra il modello Transformer su una singola Cloud TPU

  1. Avvia una VM Cloud TPU utilizzando il comando gcloud.

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

    Descrizioni flag comando

    zone
    La zona in cui prevedi di creare la Cloud TPU.
    accelerator-type
    Il tipo di Cloud TPU da creare.
    version
    La versione software di Cloud TPU.
  2. Connettiti alla VM Cloud TPU eseguendo il seguente comando ssh.

    gcloud compute tpus tpu-vm ssh transformer-tutorial --zone=us-central2-b
    
  3. Esporta le variabili di ambiente.

      (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. Se imposti --version=tpu-vm-tf-2.15.0-pjrt durante la creazione della TPU, imposta le seguenti variabili di ambiente per abilitare il runtime PJRT:
      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    
  5. Installa i requisiti di TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    
  6. Scarica e pre-elabora il set di dati

      (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. Copia il set di dati nel bucket Cloud Storage

      (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. Vai alla directory di addestramento

    (vm)$ cd /usr/share/tpu/models/
    
  9. Esegui lo script di addestramento

    (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"
    

    Descrizioni flag comando

    tpu
    Il nome della Cloud TPU. A questo scopo, specifica la variabile di ambiente (TPU_NAME).
    experiment
    Il modello da addestrare.
    mode
    La modalità in cui eseguire lo script.
    model_dir
    Il bucket Cloud Storage in cui vengono archiviati checkpoint e riepiloghi durante l'addestramento. Puoi utilizzare una cartella esistente per caricare i checkpoint generati in precedenza creati su una TPU delle stesse dimensioni e versione di TensorFlow.
    params_override
    Imposta i parametri del modello.

    Per impostazione predefinita, il modello esegue la valutazione dopo ogni 10.000 passaggi. Puoi aumentare il numero di passaggi di addestramento o specificare la frequenza di esecuzione delle valutazioni impostando questi parametri:

    • train.train_steps: il numero totale di passaggi di addestramento da eseguire.
    • trainer.validation_interval: il numero di passaggi di addestramento da eseguire tra una valutazione e l'altra.

    L'addestramento e la valutazione richiedono circa 20 minuti su Cloud TPU v4-8. Al termine dell'addestramento e della valutazione, viene visualizzato un messaggio simile al seguente:

    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}
    

    Hai completato l'addestramento su un singolo dispositivo. Segui questi passaggi per eliminare le risorse TPU su dispositivo singolo.

  10. Disconnettiti dall'istanza Compute Engine:

    (vm)$ exit
    

    Ora il prompt dovrebbe essere username@projectname, a indicare che ti trovi in Cloud Shell.

  11. Elimina la risorsa TPU.

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

    Descrizioni flag comando

    zone
    La zona in cui si trovava la tua Cloud TPU.

A questo punto, puoi concludere questo tutorial ed eliminare oppure continuare ed esplorare l'esecuzione del modello sui pod di Cloud TPU.

Scala il tuo modello con i pod di Cloud TPU

L'addestramento del modello sui pod di Cloud TPU può richiedere alcune modifiche allo script di addestramento. Per informazioni, vedi Addestramento sui pod TPU.

Addestramento pod di TPU

  1. Apri una finestra di Cloud Shell.

    Apri Cloud Shell

  2. Crea una variabile per il tuo ID progetto.

    export PROJECT_ID=project-id
    
  3. Configura Google Cloud CLI per utilizzare il progetto in cui vuoi creare una Cloud TPU.

    gcloud config set project ${PROJECT_ID}
    

    La prima volta che esegui questo comando in una nuova VM di Cloud Shell, viene visualizzata una pagina Authorize Cloud Shell. Fai clic su Authorize in fondo alla pagina per consentire a gcloud di effettuare chiamate API con le tue credenziali.

  4. Creare un account di servizio per il progetto Cloud TPU.

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

    Il comando restituisce un account di servizio Cloud TPU con il formato seguente:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. Crea un bucket Cloud Storage utilizzando il seguente comando o utilizza un bucket creato in precedenza per il tuo progetto:

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
    

    Questo bucket Cloud Storage archivia i dati utilizzati per addestrare il modello e i risultati dell'addestramento. Il comando gcloud utilizzato in questo tutorial configura le autorizzazioni predefinite per l'account di servizio Cloud TPU che hai configurato nel passaggio precedente. Se vuoi autorizzazioni più granulari, esamina le autorizzazioni a livello di accesso.

Avvia le risorse VM TPU

  1. Avvia un pod di VM TPU utilizzando il comando gcloud. Questo tutorial specifica un pod v4-32. Per altre opzioni di pod, consulta la pagina relativa ai tipi di TPU sui tipi di TPU disponibili.

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

    Descrizioni flag comando

    zone
    La zona in cui prevedi di creare la Cloud TPU.
    accelerator-type
    Il tipo di Cloud TPU da creare.
    version
    La versione software di Cloud TPU.
  2. Connettiti alla VM TPU eseguendo il comando ssh seguente. Quando hai eseguito l'accesso alla VM, il prompt della shell cambia da username@projectname a username@vm-name:

    gcloud compute tpus tpu-vm ssh transformer-tutorial --zone=us-central2-b
    
  3. Installa i requisiti di TensorFlow.

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

Configura e avvia l'addestramento dei pod

  1. Esporta le variabili di configurazione di Cloud TPU:

    (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. Scarica il set di dati

    (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. Copia il set di dati nel bucket Cloud Storage

    (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. Passa alla directory di addestramento:

    (vm)$ cd /usr/share/tpu/models/
  5. Esegui lo script di addestramento:

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

Per impostazione predefinita, il modello esegue la valutazione dopo ogni 10.000 passaggi. Per addestrare alla convergenza, modifica train_steps in 200000. Puoi aumentare il numero di passaggi di addestramento o specificare la frequenza di esecuzione delle valutazioni impostando questi parametri:

  • trainer.train_steps: imposta il numero totale di passaggi di addestramento da eseguire.
  • trainer.validation_interval: imposta il numero di passaggi di addestramento da eseguire tra una valutazione e l'altra.

L'addestramento e la valutazione richiedono circa 14 minuti su una Cloud TPU v4-32. Al termine dell'addestramento e della valutazione, vengono visualizzati messaggi simili ai seguenti:

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}

Questo script di addestramento viene addestrato per 20.000 passaggi ed esegue la valutazione ogni 2000 passaggi. Questa particolare addestramento e valutazione richiede circa 8 minuti su un pod di Cloud TPU v3-32. Al termine dell'addestramento e della valutazione, viene visualizzato un messaggio simile al seguente:

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

Per eseguire l'addestramento alla convergenza, modifica train_steps in 200.000. Puoi aumentare il numero di passaggi di addestramento o specificare la frequenza di esecuzione delle valutazioni impostando questi parametri:

  • --train_steps: imposta il numero totale di passaggi di addestramento da eseguire.
  • --steps_between_evals: numero di passaggi di addestramento da eseguire tra una valutazione e l'altra.

Al termine dell'addestramento e della valutazione, viene visualizzato un messaggio simile al seguente:

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

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

  1. Disconnettiti dall'istanza Compute Engine, se non l'hai già fatto:

    (vm)$ exit
    

    Ora il prompt dovrebbe essere username@projectname, a indicare che ti trovi in Cloud Shell.

  2. Elimina le risorse Cloud TPU e Compute Engine.

    $ gcloud compute tpus tpu-vm delete transformer-tutorial \
      --zone=us-central2-b
    
  3. Esegui gsutil come mostrato, sostituendo bucket-name con il nome del bucket Cloud Storage che hai creato per questo tutorial:

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

Passaggi successivi

I tutorial di TensorFlow Cloud TPU in genere addestrano il modello utilizzando un set di dati di esempio. I risultati di questo addestramento non sono utilizzabili per l'inferenza. Per utilizzare un modello per l'inferenza, puoi addestrare i dati su un set di dati disponibile pubblicamente o sul tuo set di dati. I modelli TensorFlow addestrati su Cloud TPU in genere richiedono che i set di dati siano in formato TFRecord.

Puoi utilizzare l'esempio dello strumento di conversione del set di dati per convertire un set di dati di classificazione delle immagini nel formato TFRecord. Se non utilizzi un modello di classificazione delle immagini, dovrai convertire personalmente il set di dati nel formato TFRecord. Per ulteriori informazioni, vedi TFRecord e tf.Example.

Ottimizzazione degli iperparametri

Per migliorare le prestazioni del modello con il tuo set di dati, puoi ottimizzare gli iperparametri del modello. Puoi trovare informazioni sugli iperparametri comuni a tutti i modelli supportati da TPU su GitHub. Le informazioni sugli iperparametri specifici del modello sono disponibili nel codice sorgente di ciascun modello. Per ulteriori informazioni sull'ottimizzazione degli iperparametri, consulta Panoramica dell'ottimizzazione degli iperparametri, Utilizzo del servizio di ottimizzazione degli iperparametri e Regola iperparametri.

Inferenza

Una volta addestrato il modello, puoi utilizzarlo per l'inferenza (detta anche previsione). AI Platform è una soluzione basata su cloud per lo sviluppo, l'addestramento e il deployment di modelli di machine learning. Una volta eseguito il deployment di un modello, puoi utilizzare il servizio AI Platform Prediction.