Esecuzione di Transformer con Tensor2Tensor su Cloud TPU

Questo tutorial ti mostra come addestrare il modello Transformer (da Warning Is All You Need) con Tensor2Tensor su Cloud TPU.

Descrizione del modello

Il modello Transformer utilizza gli stack di livelli di attenzione automatica e i livelli con feed in avanti per elaborare l'input sequenziale, come il testo. Supporta le seguenti varianti:

  • transformer (solo decodificatore) per la modellazione a sequenza singola. Esempio di utilizzo: la definizione del linguaggio.
  • transformer (codificatore-decodificatore) per la sequenza in sequenza. Esempio di esempio: traduzione.
  • transformer_encoder (solo codificatore) esegue solo il codificatore per la modellazione da sequenza a classe. Esempio di caso d'uso: classificazione del sentiment.

Transformer è solo uno dei modelli della libreria Tensor2Tensor. Tensor2Tensor (T2T) è una libreria di modelli e set di dati di deep learning, nonché un insieme di script che consentono di addestrare i modelli e scaricare e preparare i dati.

Obiettivi

  • Generare il set di dati di addestramento
  • Addestra un modello di linguaggio su una singola Cloud TPU o un pod Cloud TPU
  • Addestra un modello di traduzione inglese-tedesco su una singola Cloud TPU
  • Addestrare un classificatore di sentiment su una singola Cloud TPU
  • Pulisci le risorse Cloud TPU

Costi

In questo documento, utilizzi 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 potrebbero essere idonei per una prova gratuita.

Prima di iniziare

Se prevedi di addestrare una sezione di un pod di TPU, assicurati di leggere la pagina Formazione sui pod di TPU, che spiega le considerazioni speciali durante l'addestramento su una sezione di un pod.

Prima di iniziare questo tutorial, segui i passaggi riportati di seguito per verificare che il tuo progetto Google Cloud sia configurato correttamente.

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

  1. Apri una finestra di Cloud Shell.

    Apri Cloud Shell

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

    export PROJECT_ID=project-id
    
  3. Configura l'interfaccia a riga di comando di Google Cloud per utilizzare il progetto in cui vuoi creare 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 GCP con le tue credenziali.

  4. Crea 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:

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

    Questo bucket Cloud Storage archivia i dati che utilizzi per addestrare il modello e i risultati dell'addestramento. Lo strumento gcloud compute tpus execution-groups utilizzato in questo tutorial configura le autorizzazioni predefinite per l'account di servizio Cloud TPU. Se vuoi le autorizzazioni finin-grain, consulta le autorizzazioni per il livello di accesso.

    La località del bucket deve essere nella stessa area geografica della macchina virtuale (VM) e del nodo TPU. Le VM e i nodi TPU si trovano in zone specifiche, che sono suddivisioni all'interno di un'area geografica.

  6. Avvia una VM di Compute Engine utilizzando il comando gcloud.

    $ 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
    

    Descrizioni flag comando

    vm-only
    Crea solo una VM. Per impostazione predefinita, il comando gcloud compute tpus execution-groups crea una VM e una Cloud TPU.
    name
    Il nome della Cloud TPU da creare.
    zone
    La zona in cui prevedi di creare Cloud TPU.
    disk-size
    Le dimensioni del disco rigido in GB della VM creata dal comando gcloud compute tpus execution-groups.
    machine-type
    Il tipo di macchina della VM di Compute Engine da creare.
    tf-version
    La versione di Tensorflow gcloud compute tpus execution-groups viene installata sulla VM.

    Per maggiori informazioni sul comando gcloud, consulta la sezione Riferimento gcloud.

  7. Viene visualizzata la configurazione da te specificata. Inserisci y per approvare o n per annullare.

    Al termine dell'esecuzione del comando gcloud compute tpus execution-groups, verifica che il prompt di Cloud Shell sia cambiato da username@projectname a username@vm-name. Questa modifica mostra che hai eseguito l'accesso alla tua VM di Compute Engine.

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

    Mentre continui a seguire queste istruzioni, esegui ciascun comando che inizia con (vm)$ nella tua istanza di Compute Engine.

Nella tua VM di Compute Engine:

  1. Crea le seguenti variabili di ambiente:

    (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. Crea una directory per archiviare i file temporanei:

    (vm)$ mkdir ${TMP_DIR}
  3. Aggiungi il percorso agli script tensor2tensor utilizzati per elaborare i dati del modello:

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

Addestra un modello linguistico su una singola Cloud TPU

  1. Genera il set di dati di addestramento per il modello linguistico.

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

    Descrizioni flag comando

    problem
    Il nome del problema.
    data_dir
    Il percorso Cloud Storage di input dell'addestramento.
    tmp_dir
    La directory di archiviazione temporanea.
  2. Esegui questo comando per creare la risorsa Cloud TPU.

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

    Descrizioni flag comando

    tpu-only
    Crea solo Cloud TPU. Per impostazione predefinita, il comando gcloud compute tpus execution-groups crea una VM e una Cloud TPU.
    zone
    La zona in cui prevedi di creare Cloud TPU. Deve essere la stessa zona utilizzata per la VM di Compute Engine. Ad esempio, europe-west4-a.
    tf-version
    La versione di Tensorflow ctpu viene installata sulla VM.
    name
    Il nome della Cloud TPU da creare.
  3. Imposta una variabile di ambiente per il nome TPU.

    (vm)$ export TPU_NAME=transformer-tutorial
  4. Esegui lo script di addestramento.

    (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

    Descrizioni flag comando

    model
    Il modello da addestrare.
    hparams_set
    Gli iperparametri da utilizzare durante l'addestramento.
    problem
    Il nome del problema.
    eval-steps
    Il numero di passaggi da valutare.
    data_dir
    Il percorso Cloud Storage in cui sono archiviati i dati di addestramento.
    output_dir
    Directory di output di base per l'esecuzione.
    use_tpu
    Imposta il valore su "true" per utilizzare Cloud TPU, altrimenti su "false".
    cloud_tpu_name
    Il nome della Cloud TPU da utilizzare per l'addestramento.
    train_steps
    Il numero di passi per l'addestramento.

    Il comando riportato sopra prevede 10 passaggi di addestramento, quindi 3 passaggi di valutazione. Viene eseguito in circa 5 minuti su un nodo TPU v3-8. Per rendere questo modello più accurato, devi aumentare il numero di passaggi di addestramento regolando il flag --train_steps. Ti consigliamo di addestrare il modello tramite almeno 40.000 passi. In genere il modello converge alla sua massima qualità dopo circa 250.000 passi.

  5. Elimina la risorsa Cloud TPU che hai creato.

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

Addestra un modello di linguaggio su un pod di Cloud TPU

  1. Esegui il comando gcloud, utilizzando il parametro accelerator-type per specificare la sezione del pod da utilizzare. Ad esempio, il comando seguente utilizza una sezione di pod v2-32.

    (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

    Descrizioni flag comando

    tpu-only
    Crea la Cloud TPU senza creare una VM. Per impostazione predefinita, il comando gcloud compute tpus execution-groups crea una VM e una Cloud TPU.
    accelerator-type
    Il tipo di Cloud TPU da creare.
    name
    Il nome della Cloud TPU da creare.
    zone
    La zona in cui prevedi di creare Cloud TPU.
    tf-version
    La versione di Tensorflow ctpu viene installata sulla VM.
  2. Imposta una variabile di ambiente per il nuovo nome della TPU.

    (vm)$ export TPU_NAME=transformer-tutorial-pod
  3. Esegui lo script di addestramento.

    (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

    Descrizioni flag comando

    model
    Il modello da addestrare.
    hparams_set
    Gli iperparametri da utilizzare durante l'addestramento.
    problem
    Il nome del problema.
    eval-steps
    Il numero di passaggi da valutare.
    data_dir
    Il percorso Cloud Storage in cui sono archiviati i dati di addestramento.
    output_dir
    Directory di output di base per l'esecuzione.
    use_tpu
    Imposta il valore su "true" per utilizzare Cloud TPU, altrimenti su "false".
    cloud_tpu_name
    Il nome della Cloud TPU da utilizzare per l'addestramento.
    tpu_num_shards
    Il numero di shard di Cloud TPU. Il valore predefinito è '8'.
    schedule
    Il metodo di esecuzione di un esperimento.
    train_steps
    Il numero di passaggi per addestrare il modello.

    Il comando riportato sopra esegue 25.000 passaggi di addestramento, quindi esegue tre passaggi di valutazione. Per completare l'addestramento su Cloud TPU v2-32 sono necessari circa 30 minuti.

    Ti consigliamo di addestrare il modello utilizzando almeno 40.000 passi. In genere il modello converge alla sua massima qualità dopo circa 250.000 passi.

  4. Elimina la risorsa Cloud TPU che hai creato per l'addestramento.

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

Addestra un modello di traduzione inglese-tedesco su una singola Cloud TPU

  1. Utilizza lo script t2t-datagen per generare i dati di addestramento e valutazione per il modello di traduzione nel bucket Cloud Storage:

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

    Descrizioni flag comando

    problem
    Il nome del problema.
    data_dir
    Il percorso Cloud Storage di input dell'addestramento.
    tmp_dir
    La directory di archiviazione temporanea.
  2. Esegui questo comando per creare la risorsa Cloud TPU.

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

    Descrizioni flag comando

    tpu-only
    Crea solo Cloud TPU. Per impostazione predefinita, il comando gcloud compute tpus execution-groups crea una VM e una Cloud TPU.
    zone
    La zona in cui prevedi di creare Cloud TPU.
    tf-version
    La versione di Tensorflow gcloud compute tpus execution-groups viene installata sulla VM.
    name
    Il nome della Cloud TPU da creare.
  3. Imposta una variabile di ambiente per il nuovo nome della TPU.

    (vm)$ export TPU_NAME=transformer-tutorial
  4. Esegui t2t-trainer per addestrare e valutare il modello:

    (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

    Descrizioni flag comando

    model
    Il modello da addestrare.
    hparams_set
    Gli iperparametri da utilizzare durante l'addestramento.
    problem
    Il nome del problema.
    eval-steps
    Il numero di passaggi da valutare.
    data_dir
    Il percorso Cloud Storage in cui sono archiviati i dati di addestramento.
    output_dir
    Directory di output di base per l'esecuzione.
    use_tpu
    Imposta il valore su"true"per utilizzare Cloud TPU, altrimenti su"false".
    cloud_tpu_name
    Il nome della Cloud TPU da utilizzare per l'addestramento.
    train_steps
    Il numero di passaggi per addestrare il modello.

    Il comando riportato sopra prevede 10 passaggi di addestramento, quindi 3 passaggi di valutazione. Viene eseguito in circa 5 minuti su un nodo TPU v3-8. Puoi (e dovresti) aumentare il numero di passaggi di addestramento modificando il flag --train_steps. In genere le traduzioni iniziano a essere ragionevoli dopo circa 40.000 passi. In genere il modello converge alla sua massima qualità dopo circa 250.000 passi.

  5. Elimina la risorsa Cloud TPU creata per addestrare il modello su un singolo dispositivo.

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

Addestra un modello di classificazione del sentiment su una singola Cloud TPU

  1. Genera il set di dati per il modello del classificatore di sentiment.

    (vm)$ t2t-datagen --problem=sentiment_imdb \
     --data_dir=${DATA_DIR} \
     --tmp_dir=${TMP_DIR}
  2. Esegui questo comando per creare la risorsa Cloud TPU.

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

    Descrizioni flag comando

    tpu-only
    Crea solo Cloud TPU. Per impostazione predefinita, il comando gcloud compute tpus execution-groups crea una VM e una Cloud TPU.
    zone
    La zona in cui prevedi di creare Cloud TPU.
    tf-version
    La versione di Tensorflow gcloud compute tpus execution-groups viene installata sulla VM.
    name
    Il nome della Cloud TPU da creare.
  3. Esegui lo script di addestramento.

    (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
    

    Descrizioni flag comando

    model
    Il modello da addestrare.
    hparams_set
    Gli iperparametri da utilizzare durante l'addestramento.
    problem
    Il nome del problema.
    eval-steps
    Il numero di passaggi da valutare.
    data_dir
    Il percorso Cloud Storage in cui sono archiviati i dati di addestramento.
    output_dir
    Directory di output di base per l'esecuzione.
    use_tpu
    Imposta il valore su "true" per utilizzare Cloud TPU, altrimenti su "false".
    cloud_tpu_name
    Il nome della Cloud TPU da utilizzare per l'addestramento.
    train_steps
    Il numero di passaggi per addestrare il modello.

    Il comando riportato sopra prevede 10 passaggi di addestramento, quindi 3 passaggi di valutazione. Viene eseguito in circa 5 minuti su un nodo TPU v3-8. Questo modello raggiunge una precisione di circa l'85% dopo circa 2000 passi.

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 di Compute Engine, se non l'hai ancora fatto:

    (vm)$ exit
    

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

  2. In Cloud Shell, esegui gcloud compute tpus execution-groups con il flag --zone che hai utilizzato quando hai configurato Cloud TPU per eliminare la VM di Compute Engine e la Cloud TPU:

    $ gcloud compute tpus execution-groups delete transformer-tutorial \
    --zone=europe-west4-a
    
  3. Verifica che le risorse siano state eliminate eseguendo gcloud compute tpus execution-groups list. L'eliminazione può richiedere qualche minuto. Una risposta simile alla seguente indica che le istanze sono state eliminate correttamente.

    $ gcloud compute tpus execution-groups list \
     --zone=europe-west4-a
    

    Dovresti vedere un elenco vuoto di TPU come segue:

       NAME             STATUS
    
  4. Elimina il bucket Cloud Storage utilizzando gsutil come mostrato di seguito. Sostituisci bucket-name con il nome del tuo bucket Cloud Storage.

    $ 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 corso di formazione non sono utilizzabili per inferenza. Per utilizzare un modello di inferenza, puoi addestrare i dati su un set di dati disponibile pubblicamente o sul tuo set di dati. In genere, i modelli TensorFlow addestrati su Cloud TPU richiedono che i set di dati siano in formato TFRecord.

Puoi utilizzare l'esempio di strumento di conversione del set di dati per convertire un set di dati di classificazione delle immagini in formato TFRecord. Se non utilizzi un modello di classificazione delle immagini, dovrai convertire personalmente il set di dati in 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 regolare gli iperparametri di questo modello. Puoi trovare informazioni sugli iperparametri in comune in tutti i modelli supportati da TPU su GitHub. Puoi trovare informazioni sugli iperparametri specifici del modello 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 Perfezionamento degli iperparametri.

Inferenza

Dopo aver addestrato il modello, puoi utilizzarlo per inferenza (chiamato 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.