Addestramento di EfficientNet su Cloud TPU (TF 2.x)


Questo tutorial mostra come addestrare un modello Keras EfficientNet su Cloud TPU utilizzando tf.distribute.TPUStrategy.

Se non hai dimestichezza con Cloud TPU, ti consigliamo vivamente di consulta la guida rapida per scoprire come creare un Cloud TPU e VM di Compute Engine.

Obiettivi

  • Crea un bucket Cloud Storage per contenere 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 utilizzi i seguenti componenti fatturabili di Google Cloud:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Per generare una stima dei costi basata sull'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi utenti di Google Cloud potrebbero essere idonei per una prova gratuita.

Prima di iniziare

Prima di iniziare questo tutorial, verifica che il tuo progetto Google Cloud sia corretto configurazione.

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Questa procedura dettagliata utilizza i componenti fatturabili di Google Cloud. Controlla il Pagina dei prezzi di Cloud TPU per stimare i costi. Assicurati di pulire le risorse VM TPU che crei quando hai finito di lavorare per evitare addebiti inutili.

Addestramento su dispositivo singolo Cloud TPU

.

Questa sezione descrive come configurare le risorse Cloud TPU e formare il modello EfficientNet utilizzando un singolo dispositivo Cloud TPU.

  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 in modo da 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, Pagina Authorize Cloud Shell visualizzata. Fai clic su Authorize in basso della pagina per consentire a gcloud di effettuare chiamate API con le tue credenziali.

    Per ulteriori informazioni sul comando gcloud, consulta le Riferimento gcloud.

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

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

  5. Esporta variabili di configurazione TPU

    Imposta la zona in cui addestrerai il modello e archivierai tutti i dati relativi all'addestramento.

    $ export ZONE=europe-west4-a
  6. Crea un bucket Cloud Storage utilizzando il seguente comando:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4

    Questo bucket Cloud Storage archivia i dati che utilizzi per addestrare del modello e dei risultati dell'addestramento. Utilizza il comando gcloud compute tpus tpu-vm per configurare le autorizzazioni predefinite per l'account di servizio Cloud TPU configurato nel passaggio precedente. Se vuoi autorizzazioni più granulari, rivedi le autorizzazioni a livello di accesso.

    La posizione del bucket deve trovarsi nella stessa regione di Compute Engine (VM) e del tuo nodo Cloud TPU.

  7. Prepara il set di dati o utilizza fake_imagenet

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

    Questo tutorial utilizza una versione dimostrativa del set di dati ImageNet completo, noto come fake_imagenet. Questa versione dimostrativa ti consente testa il tutorial, riducendo al contempo i requisiti di archiviazione e tempo tipicamente associato all'esecuzione di un modello sull'intero database ImageNet.

    Il set di dati falsa_imagenet si trova nella seguente posizione su Cloud Storage:

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

    Il set di dati fake_imagenet è utile solo per capire come utilizzare una Cloud TPU e convalidare le prestazioni end-to-end. L'accuratezza i numeri e il modello salvato non saranno significativi.

    Per usare l'intero set di dati ImageNet, consulta Download, pre-elaborazione e caricamento del set di dati ImageNet.

  8. Avvia le risorse TPU utilizzando l'gcloud .

    $ gcloud compute tpus tpu-vm create efficientnet-tutorial \
      --zone=${ZONE} \
      --accelerator-type=v3-8 \
      --version=tpu-vm-tf-2.17.0-pjrt

    Descrizioni dei flag dei comandi

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

    Per ulteriori informazioni sul comando gcloud, consulta le Riferimento gcloud.

  9. Connettiti all'istanza Compute Engine tramite SSH. Quando sei connesso alla VM, il prompt della shell cambia da username@projectname a username@vm-name:

    gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=${ZONE}
  10. Imposta la variabile del nome Cloud TPU.

    (vm)$ export TPU_NAME=local
  11. Imposta le variabili del bucket Cloud Storage

    Sostituisci bucket-name con il nome del tuo bucket Cloud Storage:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x
    (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet

    L'applicazione di addestramento si aspetta che i dati di addestramento siano accessibili in Cloud Storage. L'applicazione di addestramento utilizza anche il tuo Cloud Storage per archiviare i checkpoint durante l'addestramento.

  12. Quando crei la TPU, se imposti il parametro --version su una versione che termina con -pjrt, imposta le seguenti variabili di ambiente per attivare il runtime PJRT:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
  13. Installa i requisiti di TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  14. Lo script di addestramento di EfficientNet richiede pacchetti aggiuntivi. Installali ora:

    (vm)$ sudo pip3 install tensorflow-addons
    (vm)$ sudo pip3 install tensorflow-model-optimization>=0.1.3
  15. Imposta alcune variabili di ambiente richieste:

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"

    Il modello EfficientNet è preinstallato sulla VM Cloud TPU.

  16. Passa alla directory in cui si trova il modello:

    (vm)$ cd /usr/share/tpu/models/official/legacy/image_classification
  17. Addestrare il modello. Viene utilizzato un set di dati falsa_imagenet e addestra EfficientNet per un'epoca.

    (vm)$ python3 classifier_trainer.py \
      --mode=train_and_eval \
      --model_type=efficientnet \
      --dataset=imagenet \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
      --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"

    Descrizioni flag di comando

    mode
    Uno tra train, eval o train_and_eval.
    model_type
    Il tipo di modello. Ad esempio, efficientnet.
    dataset
    Il nome del set di dati. Ad esempio, imagenet.
    tpu
    Il nome della Cloud TPU su cui eseguire l'addestramento o la valutazione.
    data_dir
    Specifica il percorso di Cloud Storage per l'input di addestramento. In questo esempio è impostato sul set di dati fake_imagenet.
    model_dir
    Il percorso di Cloud Storage in cui sono archiviati checkpoint e riepiloghi durante l'addestramento del modello. Puoi riutilizzare una cartella esistente per caricare checkpoint generati in precedenza e per archiviare checkpoint aggiuntivi purché i checkpoint precedenti siano stati creati utilizzando una Cloud TPU della stessa dimensione e versione TensorFlow.
    config_file
    Il percorso del file JSON contenente il file EfficientNet preaddestrato un modello di machine learning. Questo file contiene l'architettura del modello.
    params_override
    Una stringa JSON che sostituisce i parametri di script predefiniti. Per ulteriori informazioni sui parametri dello script, consulta /usr/share/models/official/legacy/detection/main.py.

    Questo addestrerà EfficientNet per 1 epoca e si completerà su una versione v3-8 Cloud TPU in circa 40 minuti. Al termine dello script di addestramento, viene visualizzato un output simile al seguente:

    Run stats:
    {
      'accuracy_top_1': 0.0010172526817768812,
      'eval_loss': 7.104171276092529,
      'loss': 7.113735675811768,
      'training_accuracy_top_1': 0.0009773431811481714,
      'step_timestamp_log': [
        'BatchTimestamp<batch_index: 0,
        timestamp: 1604960724.2224622>',
        'BatchTimestamp<batch_index: 1251,
        timestamp: 1604961281.3745298>'
      ],
      'train_finish_time': 1604961342.6359076,
      'avg_exp_per_second': 2071.493269569079
    }
    

    Per addestrare EfficientNet alla convergenza sul set di dati ImageNet, eseguilo per 90 epoche come mostrato nello script seguente. L'addestramento e la valutazione vengono eseguiti insieme. Ogni epoca ha 1251 passi per un totale di 112590 passaggi di addestramento e 48 passaggi di valutazione.

    (vm)$ python3 classifier_trainer.py \
         --mode=train_and_eval \
         --model_type=efficientnet \
         --dataset=imagenet \
         --tpu=${TPU_NAME} \
         --data_dir=${DATA_DIR} \
         --model_dir=${MODEL_DIR} \
         --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
         --params_override="train_dataset.builder=records, validation_dataset.builder=records"

    Descrizioni dei flag dei comandi

    mode
    Una tra train, eval o train_and_eval.
    model_type
    Il tipo di modello. Ad esempio, efficientnet.
    dataset
    Il nome del set di dati. Ad esempio, imagenet.
    tpu
    Il nome della Cloud TPU su cui eseguire l'addestramento o la valutazione.
    data_dir
    Specifica il percorso di Cloud Storage per l'input di addestramento. In questo esempio è impostato sul set di dati fake_imagenet.
    model_dir
    Il percorso di Cloud Storage in cui sono archiviati checkpoint e 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 i checkpoint precedenti siano stati creati utilizzando una Cloud TPU delle stesse dimensioni e della stessa versione di TensorFlow.
    config_file
    Il percorso del file JSON contenente il file EfficientNet preaddestrato un modello di machine learning. Questo file contiene l'architettura del modello.
    params_override
    Una stringa JSON che sostituisce i parametri dello script predefiniti. Per ulteriori informazioni sui parametri dello script, consulta /usr/share/models/official/legacy/detection/main.py.

    Poiché l'addestramento è stato eseguito sul set di dati fake_imagenet, i risultati dell'output non riflettono l'output effettivo che verrebbe visualizzato se l'addestramento fosse eseguito su un set di dati reale.

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

  18. Disconnettiti dall'istanza Compute Engine:

    (vm)$ exit

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

  19. Elimina la risorsa TPU.

    $ gcloud compute tpus tpu-vm delete efficientnet-tutorial \
     --zone=${ZONE}

    Descrizioni flag di comando

    zone
    La zona in cui Cloud TPU risiedono.

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

Eseguire il scaling del modello con i pod Cloud TPU

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

Addestramento di pod Cloud TPU

Questa sezione fornisce informazioni sulla configurazione di un bucket Cloud Storage e le risorse Cloud TPU per l'addestramento dei pod.

  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 in modo da 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, Pagina Authorize Cloud Shell visualizzata. Fai clic su Authorize nella parte inferiore della pagina per consentire a gcloud di effettuare chiamate alle API Google Cloud con le tue credenziali.

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

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

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

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4

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

    La posizione del bucket deve trovarsi nella stessa regione della VM TPU.

  6. Esporta le variabili di configurazione della TPU

    Imposta la zona in cui addestrerai il modello e memorizzerai i dati correlati all'addestramento.

    $ export ZONE=europe-west4-a

  7. Prepare your dataset or use fake_imagenet

    ImageNet is an image database. The images in the database are organized into a hierarchy, with each node of the hierarchy depicted by hundreds and thousands of images.

    The default Pod training accesses a demonstration version of the full ImageNet dataset, referred to as fake_imagenet. This demonstration version allows you to test Pod training, while reducing the storage and time requirements typically associated with training a model against the full ImageNet database.

    The fake_imagenet dataset is only useful for understanding how to use a Cloud TPU and validating end-to-end performance. The accuracy numbers and saved model will not be meaningful.

    If you want to use the full ImageNet dataset, see Downloading, preprocessing, and uploading the ImageNet dataset.

  8. Launch your Cloud TPU resources using the gcloud command.

    For more information on the gcloud command, see the gcloud Reference. This tutorial specifies a v3-32 Pod. For other Pod options, see the available TPU types page.

    This tutorial specifies a v3-32 Pod. For other Pod options, see the available TPU types page.

    $ gcloud compute tpus tpu-vm create efficientnet-tutorial \
     --zone=${ZONE} \
     --accelerator-type=v3-32 \
     --version=tpu-vm-tf-2.17.0-pod-pjrt

    Descrizioni dei flag dei comandi

    zone
    La zona in cui prevedi di creare la tua Cloud TPU.
    accelerator-type
    Il tipo di acceleratore specifica la versione e le dimensioni della Cloud TPU che vuoi creare. Per ulteriori informazioni sui tipi di acceleratori supportati per ogni versione di TPU, vedi Versioni TPU.
    version
    La versione software di Cloud TPU.
  9. Connettiti all'istanza Compute Engine tramite SSH. Quando la connessione è attiva alla VM, il prompt della shell passa da username@projectname a username@vm-name:

    gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=europe-west4-a
  10. Esporta variabili di configurazione TPU:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export TPU_NAME=efficientnet-tutorial
    (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x-pod

    L'applicazione di addestramento richiede che i dati di addestramento siano accessibili di archiviazione ideale in Cloud Storage. L'applicazione di addestramento utilizza anche il tuo Cloud Storage per archiviare i checkpoint durante l'addestramento.

  11. Installa i requisiti di TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  12. Imposta alcune variabili di ambiente obbligatorie:

    (vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}"
    (vm)$ export TPU_LOAD_LIBRARY=0
  13. Passa alla directory in cui si trova il modello:

    (vm)$ cd /usr/share/tpu/models/official/legacy/image_classification/
  14. Addestrare il modello.

    (vm)$ python3 classifier_trainer.py \
    --mode=train_and_eval \
    --model_type=efficientnet \
    --dataset=imagenet \
    --tpu=${TPU_NAME} \
    --data_dir=${DATA_DIR} \
    --model_dir=${MODEL_DIR} \
    --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
    --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"

    Descrizioni flag di comando

    mode
    Se impostato su train_and_eval, questo script addestra e valuta il modello. Se impostato su export_only, questo script esporta un modello salvato.
    model_type
    Il tipo di modello. Ad esempio, efficientnet.
    dataset
    Il nome del set di dati. Ad esempio, imagenet.
    tpu
    Utilizza il nome specificato nella variabile TPU_NAME.
    data_dir
    Specifica il percorso di Cloud Storage per l'input di addestramento. È impostato su il set di dati falsa_imagenet in questo esempio.
    model_dir
    Il percorso di Cloud Storage in cui sono archiviati checkpoint e riepiloghi durante l'addestramento del modello. Puoi riutilizzare una cartella esistente per caricarla in precedenza i checkpoint generati e archiviare ulteriori checkpoint, purché i checkpoint precedenti sono stati creati utilizzando una Cloud TPU e la stessa versione di TensorFlow.
    config_file
    Il percorso del file JSON contenente il modello preaddestrato di EfficientNet. Questo file contiene l'architettura del modello.
    params_override
    Una stringa JSON che sostituisce i parametri di script predefiniti. Per ulteriori informazioni sui parametri dello script, consulta /usr/share/models/official/legacy/detection/main.py.

La procedura addestra il modello sul set di dati fake_imagenet per 1 epoca (312 passaggi di addestramento totali e 12 passaggi di valutazione). Questo addestramento richiede circa 2 minuti su una Cloud TPU v3-32. Quando l'addestramento e la valutazione viene visualizzato un messaggio simile al seguente:

Run stats:
{
  'accuracy_top_1': 0.0009969075908884406,
  'eval_loss': 7.105168342590332,
  'loss': 7.114983081817627,
  'training_accuracy_top_1': 0.0010031675919890404,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1605041621.4997303>',
    'BatchTimestamp<batch_index: 312,
    timestamp: 1605041970.8633356>'
  ],
  'train_finish_time': 1605042032.2274444,
  'avg_exp_per_second': 3111.5120716536226
}

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. Fatto:

    (vm)$ exit

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

  2. Elimina le tue risorse Cloud TPU e Compute Engine.

    $ gcloud compute tpus tpu-vm delete efficientnet-tutorial \
    --zone=${ZONE}
  3. Verifica che le risorse siano state eliminate eseguendo gcloud compute tpus execution-groups list. L'eliminazione potrebbe richiedere alcuni minuti. L'output del seguente comando non deve includere le risorse TPU create in questo tutorial:

    $ gcloud compute tpus execution-groups list --zone=${ZONE}
  4. Elimina il bucket Cloud Storage utilizzando gcloud CLI come mostrato nell'esempio che segue. Sostituisci bucket-name con il nome del tuo account Cloud Storage di sincronizzare la directory di una VM con un bucket.

    $ gcloud storage rm gs://bucket-name --recursive

Passaggi successivi

I tutorial di TensorFlow Cloud TPU generalmente addestrano il modello utilizzando un set di dati di esempio. I risultati di questo addestramento non sono utilizzabili per l'inferenza. A per l'inferenza, puoi addestrare i dati su una o il tuo set di dati. Modelli TensorFlow addestrati su Cloud TPU richiedono generalmente che i set di dati siano TFRecord.

Puoi utilizzare lo strumento di conversione dei set di dati sample per convertire un'immagine in formato TFRecord. Se non utilizzi un'immagine di classificazione, dovrai convertire il tuo set di dati in Formato TFRecord per te. Per ulteriori informazioni, consulta TFRecord e tf.Example.

Ottimizzazione degli iperparametri

Per migliorare le prestazioni del modello con il tuo set di dati, puoi ottimizzare i suoi parametri iperbolici. Puoi trovare informazioni sugli iperparametri comuni a tutti Modelli supportati da TPU su GitHub. Puoi trovare informazioni sugli iperparametri specifici del modello nella fonte per ciascuno un modello di machine learning. Per ulteriori informazioni sull'ottimizzazione degli iperparametri, consulta la Panoramica delle ottimizzazione degli iperparametri e Tune e regolare gli iperparametri.

Inferenza

Una volta addestrato il modello, puoi utilizzarlo per l'inferenza (chiamato anche previsione). Puoi utilizzare il convertitore di inferenza di Cloud TPU strumento per preparare e ottimizzare Modello TensorFlow per l'inferenza su Cloud TPU v5e. Per maggiori informazioni informazioni sull'inferenza su Cloud TPU v5e, consulta Inferenza di Cloud TPU v5e introduzione.

  • Scopri come eseguire l'addestramento e la valutazione utilizzando i tuoi dati al posto dei set di dati fake_imagenet o ImageNet seguendo il tutorial sulla conversione dei set di dati. Il tutorial spiega come utilizzare lo script di esempio del convertitore di dati di classificazione delle immagini per convertire un set di dati non elaborato per la classificazione delle immagini in TFRecord utilizzabili dai modelli TensorFlow di Cloud TPU.

  • Esegui una colab di Cloud TPU che dimostri come eseguire un modello di classificazione delle immagini usando i tuoi dati immagine.

  • Consulta gli altri tutorial su Cloud TPU.

  • Scopri come utilizzare gli strumenti di monitoraggio TPU TensorBoard.