Ottimizzazione di BERT con Cloud TPU: attività di classificazione di frasi e coppie di frasi (TF 2.x)


Questo tutorial mostra come addestrare le rappresentazioni di encoder bidirezionale dal modello BERT (Transformers) su Cloud TPU.

BERT è un metodo di preaddestramento delle rappresentazioni dei linguaggi. Preaddestramento si riferisce a come BERT viene addestrato inizialmente su una grande fonte di testo, come Wikipedia. Puoi quindi applicare i risultati dell'addestramento ad altre attività di elaborazione del linguaggio naturale (NLP), come la risposta alle domande e l'analisi del sentiment. Con BERT e Cloud TPU, puoi addestrare un'ampia gamma di modelli NLP in circa 30 minuti.

Per maggiori informazioni su BERT, consulta le seguenti risorse:

Obiettivi

  • Crea un bucket Cloud Storage in cui inserire il set di dati e l'output del modello.
  • Esegui il job di addestramento.
  • Verifica i risultati dell'output.

Costi

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

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

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

Questa sezione fornisce informazioni sulla configurazione di un bucket Cloud Storage e di una VM Compute Engine.

  1. Apri una finestra di Cloud Shell.

    Apri Cloud Shell

  2. Crea una variabile per l'ID del progetto.

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

    gcloud config set project ${PROJECT_ID}
    
  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 seguente formato:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    
  5. Crea un bucket Cloud Storage utilizzando il comando seguente:

    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 che utilizzi per creare una TPU (gcloud compute tpus execution-groups create per l'architettura dei nodi TPU o gcloud compute tpus tpu-vm create per l'architettura delle VM TPU) configura le autorizzazioni predefinite per l'account di servizio Cloud TPU che hai configurato nel passaggio precedente. Se vuoi autorizzazioni più granulari, rivedi le autorizzazioni a livello di accesso.

    La località del bucket deve trovarsi nella stessa regione della VM (Compute Engine) e del nodo Cloud TPU.

  6. Avvia una VM di Compute Engine e Cloud TPU utilizzando il comando gcloud. Il comando da utilizzare dipende dall'utilizzo di una VM TPU o di un nodo TPU. Per ulteriori informazioni sull'architettura delle due VM, consulta Architettura di sistema. Per maggiori informazioni sul comando gcloud, consulta la sezione Riferimento gcloud.

    VM TPU

    $ gcloud compute tpus tpu-vm create bert-tutorial \
    --zone=us-central1-b \
    --accelerator-type=v3-8 \
    --version=tpu-vm-tf-2.16.1-se

    Descrizioni flag comando

    zone
    La zona in cui prevedi di creare la Cloud TPU.
    accelerator-type
    Il tipo di acceleratore specifica la versione e le dimensioni della Cloud TPU che vuoi creare. Per maggiori informazioni sui tipi di acceleratori supportati per ogni versione di TPU, consulta Versioni TPU.
    version
    La versione software di Cloud TPU.

    Nodo TPU

    $ gcloud compute tpus execution-groups create \
      --name=bert-tutorial \
      --zone=us-central1-b \
      --tf-version=2.12.0 \
      --machine-type=n1-standard-1 \
      --accelerator-type=v3-8 

    Descrizioni flag comando

    name
    Il nome della Cloud TPU da creare.
    zone
    La zona in cui prevedi di creare la Cloud TPU.
    tf-version
    La versione di Tensorflow ctpu viene installata sulla VM.
    machine-type
    Il tipo di macchina della VM di Compute Engine da creare.
    accelerator type
    Il tipo di Cloud TPU da creare.
  7. Se non hai eseguito automaticamente l'accesso all'istanza di Compute Engine, accedi eseguendo il comando ssh riportato di seguito. Quando hai eseguito l'accesso alla VM, il prompt della shell cambia da username@projectname a username@vm-name:

    VM TPU

    gcloud compute tpus tpu-vm ssh bert-tutorial --zone=us-central1-b
    

    Nodo TPU

    gcloud compute ssh bert-tutorial --zone=us-central1-b
    

    Mentre continui con queste istruzioni, esegui ogni comando che inizia con (vm)$ nella finestra della sessione VM.

  8. Crea una variabile di ambiente per il nome della TPU.

    VM TPU

    (vm)$ export TPU_NAME=local
    

    Nodo TPU

    (vm)$ export TPU_NAME=bert-tutorial
    

Prepara il set di dati

  1. Definisci il bucket di archiviazione necessario per archiviare il modello e il set di dati:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  2. Copia i file di vocab e checkpoint preaddestrati nel bucket di archiviazione:

      (vm)$ curl https://storage.googleapis.com/tf_model_garden/nlp/bert/v3/uncased_L-12_H-768_A-12.tar.gz -o uncased_L-12_H-768_A-12.tar.gz
      (vm)$ mkdir -p uncased_L-12_H-768_A-12
      (vm)$ tar -xvf uncased_L-12_H-768_A-12.tar.gz
      (vm)$ gsutil -m cp -R uncased_L-12_H-768_A-12 ${STORAGE_BUCKET} 

Addestra il modello

  1. Definisci i valori dei parametri richiesti per addestrare e valutare il modello:

      (vm)$ export INIT_CHECKPOINT=${STORAGE_BUCKET}/uncased_L-12_H-768_A-12/bert_model.ckpt
      (vm)$ export TFDS_DIR=${STORAGE_BUCKET}/tfds
      (vm)$ export VOCAB_FILE=${STORAGE_BUCKET}/uncased_L-12_H-768_A-12/vocab.txt
      (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/bert-output
      (vm)$ export TASK=mnli
      

  2. Installa i requisiti di TensorFlow.

    Il comando da utilizzare varia a seconda che tu stia utilizzando una VM TPU o un nodo TPU.

    VM TPU

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

    Nodo TPU

    (vm)$ pip3 install --user -r /usr/share/models/official/requirements.txt
    (vm)$ pip3 install tensorflow-datasets==4.6.0
    
  3. Imposta la variabile di ambiente PYTHONPATH

    VM TPU

    (vm)$ export PYTHONPATH=/usr/share/tpu/models
    

    Nodo TPU

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
  4. Passa alla directory in cui è archiviato il modello:

    VM TPU

    (vm)$ cd /usr/share/tpu/models
    

    Nodo TPU

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

    (vm)$ python3 official/nlp/train.py \
      --tpu=${TPU_NAME} \
      --experiment=bert/sentence_prediction_text \
      --mode=train_and_eval \
      --model_dir=${MODEL_DIR} \
      --config_file=official/nlp/configs/experiments/glue_mnli_text.yaml \
      --params_override="runtime.distribution_strategy=tpu, task.init_checkpoint=${INIT_CHECKPOINT}, task.train_data.tfds_data_dir=${TFDS_DIR}, task.train_data.vocab_file=${VOCAB_FILE}, task.validation_data.tfds_data_dir=${TFDS_DIR}, task.validation_data.vocab_file=${VOCAB_FILE}, trainer.train_steps=2000"
    

    Descrizioni flag comando

    tpu
    Il nome della Cloud TPU da utilizzare per l'addestramento.
    mode
    Uno tra train, eval, train_and_eval o predict.
    model_dir
    Il percorso di Cloud Storage in cui vengono archiviati i checkpoint e i riepiloghi durante l'addestramento del modello. Puoi riutilizzare una cartella esistente per caricare i checkpoint generati in precedenza e per archiviare checkpoint aggiuntivi, a condizione che questi siano stati creati utilizzando una Cloud TPU delle stesse dimensioni e della stessa versione di TensorFlow.

    Lo script viene addestrato per 2000 passaggi e poi esegue 307 passaggi di valutazione. Su una TPU v3-8, dopo circa 5 minuti lo script di addestramento dovrebbe completare e visualizzare risultati simili a questo:

    I0719 00:47:52.683979 140297079573568 controller.py:457] train | step:   2000 | steps/sec:   26.3 | output:
    {'cls_accuracy': 0.7249375,
     'learning_rate': 1.4670059e-05,
     'training_loss': 0.6740678}
    train | step:   2000 | steps/sec:   26.3 | output:
    {'cls_accuracy': 0.7249375,
     'learning_rate': 1.4670059e-05,
     'training_loss': 0.6740678}
    I0719 00:47:53.184051 140297079573568 controller.py:277]  eval | step:   2000 | running 307 steps of evaluation...
    eval | step:   2000 | running 307 steps of evaluation...
    

Esegui la pulizia

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

    (vm)$ exit
    

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

  2. Elimina le risorse Cloud TPU e Compute Engine. Il comando da utilizzare per eliminare le risorse dipende dall'utilizzo di VM TPU o nodi TPU. Per ulteriori informazioni, consulta Architettura di sistema.

    VM TPU

    $ gcloud compute tpus tpu-vm delete bert-tutorial \
    --zone=us-central1-b
    

    Nodo TPU

    $ gcloud compute tpus execution-groups delete bert-tutorial \
    --zone=us-central1-b
    
  3. Verifica che le risorse siano state eliminate eseguendo gcloud compute tpus execution-groups list. L'eliminazione potrebbe richiedere diversi minuti. L'output del comando seguente non deve includere nessuna delle risorse create in questo tutorial:

    VM TPU

    $ gcloud compute tpus tpu-vm list --zone=us-central1-b

    Nodo TPU

    $ gcloud compute tpus execution-groups list --zone=us-central1-b
  4. Elimina il bucket Cloud Storage utilizzando gsutil, come illustrato di seguito. Sostituisci bucket-name con il nome del tuo bucket Cloud Storage.

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

Passaggi successivi

I tutorial su 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 sulle 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 manualmente il set di dati nel formato TFRecord. Per ulteriori informazioni, consulta TFRecord e tf.Example.

Ottimizzazione degli iperparametri

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

Inferenza

Una volta addestrato il modello, puoi utilizzarlo per l'inferenza (detta anche previsione). Puoi utilizzare lo strumento di conversione di inferenza Cloud TPU per preparare e ottimizzare un modello TensorFlow per l'inferenza su Cloud TPU v5e. Per ulteriori informazioni sull'inferenza su Cloud TPU v5e, consulta l'introduzione all'inferenza di Cloud TPU v5e.