Addestramento su Cloud TPU (TF 2.x)


Questo tutorial mostra come addestrare un modello Keras ResNet-RS su Cloud TPU utilizzando tf.distribute.TPUStrategy. Per ulteriori informazioni su ResNet-RS, consulta la pagina Rivisitazione di ResNets: strategie di addestramento e scalabilità migliorate.

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

Obiettivi

  • Crea un bucket Cloud Storage in cui inserire il set di dati e l'output del modello.
  • Prepara un set di dati imagenet falso simile al set di dati ImageNet.
  • 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

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 pagina del selettore di progetti della console Google Cloud, 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 pagina del selettore di progetti della console Google Cloud, 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 i componenti fatturabili di Google Cloud. Consulta la pagina dei prezzi di Cloud TPU per stimare i costi. Assicurati di pulire le risorse che hai creato quando hai finito di utilizzarle per evitare addebiti inutili.

Configura le risorse

Questa sezione fornisce informazioni sulla configurazione delle risorse Cloud Storage, VM, Cloud TPU e bucket Cloud Storage per i tutorial.

  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}
    

    La prima volta che esegui questo comando in una nuova VM 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.

    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 europe-west4 gs://bucket-name
    

    Questo bucket Cloud Storage archivia i dati utilizzati 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 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 utilizzando il comando gcloud.

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --name=resnet-rs-tutorial \
     --zone=europe-west4-a \
     --disk-size=300 \
     --machine-type=n1-standard-16 \
     --tf-version=2.12.0
     

    Descrizioni flag comando

    vm-only
    Crea solo una VM, non una TPU.
    name
    Il nome della TPU da creare.
    zone
    La zona in cui creare la 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.

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

  7. Quando richiesto, premi Y per creare le tue risorse Cloud TPU.

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

    gcloud compute ssh resnet-rs-tutorial --zone=europe-west4-a
    

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

  8. Installare i pacchetti necessari.

    $ pip3 install tensorflow-text==2.8.1 --no-deps

Imposta le variabili dei bucket Cloud Storage

Configura le seguenti variabili di ambiente, sostituendo bucket-name con il nome del tuo bucket Cloud Storage:

(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-rs-2x
(vm)$ export IMAGENET_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
(vm)$ export PYTHONPATH=/usr/share/models
(vm)$ export TPU_NAME=resnet-rs-tutorial

L'applicazione di addestramento prevede che i tuoi dati di addestramento siano accessibili in Cloud Storage. L'applicazione di addestramento usa il tuo bucket Cloud Storage per archiviare i checkpoint durante l'addestramento.

Addestramento e valutazione di un singolo dispositivo di Cloud TPU

ImageNet è un database di immagini. Le immagini nel database sono organizzate in una gerarchia, con centinaia e migliaia di immagini raffiguranti ogni nodo.

Questo tutorial utilizza una versione dimostrativa del set di dati completo ImageNet, definito fake_imagenet. Questa versione dimostrativa consente di testare il tutorial, riducendo al contempo i requisiti di spazio di archiviazione e di tempo normalmente associati all'esecuzione di un modello sull'intero database ImageNet.

Il set di dati finger_imagenet si trova in questa posizione su Cloud Storage:

gs://cloud-tpu-test-datasets/fake_imagenet

Il set di dati finger_imagenet è utile solo per capire come utilizzare una Cloud TPU e convalidare le prestazioni end-to-end. I valori relativi all'accuratezza e il modello salvato non saranno significativi.

Per informazioni su come scaricare ed elaborare il set di dati ImageNet completo, consulta Download, pre-elaborazione e caricamento del set di dati ImageNet.

  1. Crea una Cloud TPU utilizzando il comando gcloud.

    $ gcloud compute tpus execution-groups create \
     --tpu-only \
     --accelerator-type=v3-8  \
     --name=resnet-rs-tutorial \
     --zone=europe-west4-a \
     --tf-version=2.12.0

    Descrizioni flag comando

    tpu-only
    Crea solo una TPU, non una VM.
    accelerator-type
    Il tipo di Cloud TPU da creare.
    name
    Il nome della TPU da creare.
    zone
    La zona in cui creare la Cloud TPU.
    tf-version
    La versione TensorFlow installata sulla VM.
  2. Imposta la variabile del nome TPU_NAME.

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

    (vm)$ python3 /usr/share/models/official/vision/beta/train.py \
    --experiment=resnet_rs_imagenet \
    --mode=train_and_eval \
    --model_dir=$MODEL_DIR \
    --tpu=$TPU_NAME \
    --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
    --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
    

    Descrizioni flag comando

    experiment
    Il nome dell'esperimento da eseguire.
    mode
    La modalità in cui eseguire lo script. I valori validi sono: "train", "eval" o "train_and_eval".
    model_dir
    Il bucket Cloud Storage in cui vengono archiviati i checkpoint e i 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.
    tpu
    Il nome della TPU da utilizzare.
    config_file
    Il percorso di un file di configurazione di script.
    params_override
    Esegui l'override delle impostazioni impostate nel file di configurazione dello script.

Questo addestrerà ResNet-RS per 100 passaggi di addestramento e verrà completato su un nodo TPU v3-8 in meno di 5 minuti. L'output dello script di addestramento deve includere testo simile al seguente:

{
  'train_loss': 1.435225,
  'train_accuracy': 0.00084427913
}

Lo script di addestramento esegue anche la valutazione. L'output di valutazione dovrebbe contenere testo come questo:

Run stats:
{
  'eval_loss': 0.861013,
  'eval_acc': 0.001,
  'train_loss': 1.435225,
  'train_acc': 0.00084427913,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1606330585.7613473>',
    'BatchTimestamp<batch_index: 500,
    timestamp: 1606330883.8486104>',
    'BatchTimestamp<batch_index: 1000,
    timestamp: 1606331119.515312>',
    'BatchTimestamp<batch_index: 1251,
    timestamp: 1606331240.7516596>'
  ],
  'train_finish_time': 1606331296.395158,
  'avg_exp_per_second': 1951.6983246161021
}

Per addestrare il modello ResNet-RS alla convergenza, ometti l'argomento trainer.train_steps=100 come mostrato nello script seguente. Formazione e valutazione vengono svolte insieme.

(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
  --experiment=resnet_rs_imagenet \
  --mode=train_and_eval \
  --model_dir=$MODEL_DIR \
  --tpu=$TPU_NAME \
  --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
  --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"

Descrizioni flag comando

experiment
Il nome dell'esperimento da eseguire.
mode
La modalità in cui eseguire lo script. I valori validi sono: "train", "eval" o "train_and_eval".
model_dir
Il bucket Cloud Storage in cui vengono archiviati i checkpoint e i 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.
tpu
Il nome della TPU da utilizzare.
config_file
Il percorso di un file di configurazione di script.
params_override
Esegui l'override delle impostazioni impostate nel file di configurazione dello script.

Poiché l'addestramento e la valutazione sono stati eseguiti sul set di dati Fake_imagenet, i risultati di output non riflettono l'output effettivo che verrebbe visualizzato se l'addestramento e la valutazione venissero eseguiti su un set di dati reale.

A questo punto, puoi concludere questo tutorial e pulire le tue risorse Google Cloud oppure puoi esplorare ulteriormente l'esecuzione del modello sui pod di Cloud TPU.

Utilizzare modelli più grandi

ResNet-RS offre una famiglia di modelli di diverse dimensioni con modelli più grandi che in genere sono più precisi, con un costo maggiore di calcolo. Per ulteriori informazioni, consulta Rivisitazione di ResNets: strategie di addestramento e scalabilità migliorate.

Puoi scegliere le dimensioni del modello da addestrare modificando il file config_file nel comando seguente.

(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
  --experiment=resnet_rs_imagenet \
  --mode=train_and_eval \
  --model_dir=$MODEL_DIR \
  --tpu=$TPU_NAME \
  --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs200_i256.yaml \
  --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"

Le configurazioni disponibili sono in /usr/share/models/official/vision/beta/configs/experiments/ sulla tua VM.

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, consulta Addestramento sui pod TPU.

Puoi ottenere risultati più velocemente scalando il modello con i pod di Cloud TPU. Il modello ResNet-RS-50 completamente supportato può funzionare con le seguenti sezioni di pod:

  • v2-32
  • v3-32

Con i pod di Cloud TPU, l'addestramento e la valutazione vengono eseguiti insieme.

Addestramento con i pod di Cloud TPU

  1. Elimina la risorsa Cloud TPU che hai creato per l'addestramento del modello su un singolo dispositivo.

    (vm)$ gcloud compute tpus execution-groups delete resnet-rs-tutorial \
      --zone=europe-west4-a \
      --tpu-only
  2. Creare una nuova risorsa Cloud TPU per il pod, utilizzando il parametro accelerator-type per specificare la sezione di pod da utilizzare. Ad esempio, il comando seguente utilizza una sezione di pod v3-32.

    (vm)$ gcloud compute tpus execution-groups  create --name=resnet-rs-tutorial \
      --accelerator-type=v3-32  \
      --zone=europe-west4-a \
      --tf-version=2.12.0 \
      --tpu-only
    

    Descrizioni flag comando

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

    (vm)$ python3 /usr/share/models/official/vision/beta/train.py \
    --experiment=resnet_rs_imagenet \
    --mode=train_and_eval \
    --model_dir=$MODEL_DIR \
    --tpu=$TPU_NAME \
    --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
    --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
    

    Descrizioni flag comando

    experiment
    Il nome dell'esperimento da eseguire.
    mode
    La modalità in cui eseguire lo script. I valori validi sono: "train", "eval" o "train_and_eval".
    model_dir
    Il bucket Cloud Storage in cui vengono archiviati i checkpoint e i 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.
    tpu
    Il nome della TPU da utilizzare.
    config_file
    Il percorso di un file di configurazione di script.
    params_override
    Esegui l'override delle impostazioni impostate nel file di configurazione dello script.

Questo addestrerà ResNet-RS per 100 passaggi di addestramento e verrà completato su un nodo TPU v3-8 in meno di 5 minuti. L'output dello script di addestramento deve includere testo simile al seguente:

{
  'train_loss': 1.435225,
  'train_accuracy': 0.00084427913
}

Lo script di addestramento esegue anche la valutazione. L'output di valutazione dovrebbe contenere testo come questo:

Run stats:
{
  'eval_loss': 0.861013,
  'eval_acc': 0.001,
  'train_loss': 1.435225,
  'train_acc': 0.00084427913,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1606330585.7613473>',
    'BatchTimestamp<batch_index: 500,
    timestamp: 1606330883.8486104>',
    'BatchTimestamp<batch_index: 1000,
    timestamp: 1606331119.515312>',
    'BatchTimestamp<batch_index: 1251,
    timestamp: 1606331240.7516596>'
  ],
  'train_finish_time': 1606331296.395158,
  'avg_exp_per_second': 1951.6983246161021
}

Formazione e valutazione vengono svolte insieme. Ogni epoca ha 1251 passaggi per un totale di 112.590 passaggi di addestramento e 48 passaggi di valutazione.

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 lo hai già fatto:

    (vm)$ exit
    

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

  2. In Cloud Shell, utilizza questo comando per eliminare la VM di Compute Engine e Cloud TPU:

    $ gcloud compute tpus execution-groups delete resnet-rs-tutorial \
      --zone=europe-west4-a
    
  3. Verifica che le risorse siano state eliminate eseguendo gcloud compute tpus execution-groups list. L'eliminazione potrebbe richiedere diversi minuti. Una risposta come la 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 il seguente:

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