Addestramento di EfficientNet su Cloud TPU

I modelli EffectiveNet sono una famiglia di modelli di classificazione delle immagini, che raggiungono l'accuratezza all'avanguardia, ma sono anche più piccoli e veloci rispetto ad altri modelli. I modelli EffectiveNet-EdgeTpu sono modelli personalizzati per essere eseguiti in modo efficiente sui dispositivi Google EdgeTPU.

Il modello di questo tutorial è basato su EffectiveNet: Rethinking Model Scaling for Convolutional Neural Networks. I ricercatori hanno sviluppato una nuova tecnica per migliorare le prestazioni del modello: bilanciando con attenzione profondità, larghezza e risoluzione della rete, utilizzando un coefficiente composto semplice ma altamente efficace.

La famiglia di modelli da efficientnet-b0 a efficientnet-b7 può raggiungere una precisione di classificazione delle immagini discreta data l'utilizzo di dispositivi Google EdgeTPU con limitazioni delle risorse.

efficientnet-b0, il modello utilizzato in questo tutorial, corrisponde al modello base più piccolo, mentre efficientnet-b7 corrisponde al modello più potente, ma più costoso. Il tutorial illustra l'addestramento del modello utilizzando TPUEstimator.

Obiettivi

  • Crea un bucket Cloud Storage per contenere l'output del set di dati e il modello.
  • Prepara una versione di test del set di dati ImageNet, denominato fake_imagenet.
  • Esegui il job di addestramento.
  • Verifica i risultati dell'output.

Costi

Questo tutorial utilizza 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 beneficiare di una prova gratuita.

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 dei progetti in Google Cloud Console, seleziona o crea un progetto Google Cloud.

    Vai al selettore progetti

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

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

    Vai al selettore progetti

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Cloud. Scopri come verificare se la fatturazione è abilitata su un progetto.

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

Configura le risorse

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

  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. Il comando 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 trovarsi nella stessa area geografica della macchina virtuale (VM) e del nodo TPU. Le VM e i nodi TPU si trovano in zone specifiche, ovvero suddivisioni all'interno di un'area geografica.

  6. Avvia le risorse Compute Engine e Cloud TPU richieste per questo tutorial utilizzando il comando gcloud compute tpus execution-groups.

    gcloud compute tpus execution-groups create \
     --vm-only \
     --name=efficientnet-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 VM di Compute Engine, non creare 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.
    machine-type
    Il tipo di macchina della VM di Compute Engine da creare.
    tf-version
    La versione di Tensorflow gcloud viene installata sulla VM.

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

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

    Una volta completata l'esecuzione del comando gcloud compute tpus execution-groups, verifica che il messaggio 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 efficientnet-tutorial --zone=europe-west4-a
    

    Da questo momento in poi, un prefisso (vm)$ significa che devi eseguire il comando sull'istanza VM di Compute Engine.

Prepara i dati

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

  1. Crea una variabile di ambiente per il nome del tuo bucket. Sostituisci bucket-name con il nome del tuo bucket.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  2. Crea alcune variabili di ambiente.

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet
    (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    (vm)$ export TPU_NAME=efficientnet-tutorial
    (vm)$ export PYTHONPATH=$PYTHONPATH:/usr/share/tpu/models
    

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

Addestra e valuta il modello EffectiveNet confalse_imagenet

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

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

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

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

Il set di dati falsi_imagenet è utile solo per capire come utilizzare una Cloud TPU e convalidare le prestazioni end-to-end. I valori relativi alla precisione 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. Avvia una risorsa Cloud TPU.

    (vm)$ gcloud compute tpus execution-groups create \
     --tpu-only \
     --name=efficientnet-tutorial \
     --zone=europe-west4-a \
     --disk-size=300 \
     --machine-type=n1-standard-8 \
     --tf-version=1.15.5
    

    Descrizioni flag comando

    tpu-only
    Crea solo Cloud TPU, non un computer Compute Engine.
    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.
    machine-type
    Il tipo di macchina della VM di Compute Engine da creare.
    tf-version
    La versione di Tensorflow gcloud viene installata sulla VM.
  2. Passa alla directory del modello:

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

    (vm)$ python3 main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --model_name='efficientnet-b0' \
      --skip_host_call=true \
      --train_batch_size=2048 \
      --train_steps=1000
    

    Descrizioni flag comando

    tpu
    Utilizza il nome specificato nella variabile TPU_NAME.
    data_dir
    Indica il percorso Cloud Storage per l'input di addestramento. In questo esempio, è impostato sul set di datifalse_imagenet.
    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 archiviare checkpoint aggiuntivi purché i punti di controllo precedenti siano stati creati utilizzando una Cloud TPU della stessa dimensione e della stessa versione di TensorFlow.
    model_name
    Il nome del modello da addestrare. Ad esempio, efficientnet.
    skip_host_call
    Imposta su true per indicare allo script di saltare il host_call che viene eseguito ogni passaggio dell'addestramento. Viene generalmente utilizzato per generare riepiloghi di formazione (perdite di addestramento, tasso di apprendimento e così via). Quando skip_host_call=false, potrebbe verificarsi un calo delle prestazioni se la funzione host_call è lenta e non riesce a tenere il passo con il calcolo lato TPU.
    train_batch_size
    Le dimensioni del batch di addestramento.
    train_steps
    Il numero di passaggi da utilizzare per l'addestramento. Il valore predefinito è 218.949 passi,pari a circa 350 periodi in una dimensione batch di 2048. Questo flag deve essere regolato in base al valore del flag train_batch_size.

Addestra il modello EffectiveNet (efficientnet-b0 variante) per soli 1000 passi, poiché utilizza il set di dati ImageNet falso. Durante l'addestramento con il set di dati completo di ImageNet, puoi addestrare la convergenza utilizzando il seguente comando:

(vm)$ python3 main.py \
  --tpu=${TPU_NAME} \
  --data_dir=${DATA_DIR} \
  --model_dir=${MODEL_DIR} \
  --model_name='efficientnet-b0' \
  --skip_host_call=true \
  --train_batch_size=2048 \
  --train_steps=218948

Questo addestra il modello EffectiveNet per 350 periodi e valuta dopo l'elaborazione di un batch di dati. Utilizzando i flag specificati, il modello dovrebbe essere addestrato in circa 23 ore. Queste impostazioni dovrebbero ottenere una precisione superiore al 76,5% sul set di dati di convalida di NetNet. Il miglior checkpoint del modello e il corrispondente risultato di valutazione si trova all'interno della cartella archive nella directory del modello: ${STORAGE_BUCKET}/efficientnet/archive.

Scalabilità del modello con i pod Cloud TPU

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

  • v2-32
  • v3-32

Quando lavori con i pod di Cloud TPU, devi prima addestrare il modello utilizzando un pod, poi utilizzare un singolo dispositivo Cloud TPU per valutarlo.

Addestramento con pod di Cloud TPU

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

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

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

    Descrizioni flag comando

    tpu-only
    Crea solo Cloud TPU. Per impostazione predefinita, il comando gcloud 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.
    accelerator-type
    Il tipo di Cloud TPU da creare.
    tf-version
    La versione di Tensorflow gcloud compute tpus execution-groups viene installata sulla VM.
  3. Crea una variabile di ambiente per il tuo nome TPU.

    (vm)$ export TPU_NAME=efficientnet-tutorial
    
  4. Aggiorna la directory MODEL_DIR per archiviare i dati di addestramento.

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-tutorial
    
  5. Addestrare il modello.

    (vm)$ python3 main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --model_name='efficientnet-b3' \
      --skip_host_call=true \
      --mode=train \
      --train_steps=1000 \
      --train_batch_size=4096 \
      --iterations_per_loop=100
    

    Descrizioni flag comando

    tpu
    Il nome della Cloud TPU.
    data_dir
    Il percorso Cloud Storage per l'input di addestramento. In questo esempio, è impostato sul set di datifalse_imagenet.
    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 archiviare checkpoint aggiuntivi purché i punti di controllo precedenti siano stati creati utilizzando una Cloud TPU della stessa dimensione e della stessa versione di TensorFlow.
    model_name
    Il nome del modello da addestrare.
    skip_host_call
    Imposta su true per indicare allo script di saltare il host_call che viene eseguito ogni passaggio dell'addestramento. Viene generalmente utilizzato per generare riepiloghi di formazione (perdite di addestramento, tasso di apprendimento e così via). Quando skip_host_call=false, potrebbe verificarsi un calo delle prestazioni se la funzione host_call è lenta e non riesce a tenere il passo con il calcolo lato TPU.
    mode
    Uno dei seguenti: train_and_eval, train o eval. train_and_eval addestra e valuta il modello. train addestra il modello. eval valuta il modello.
    train_steps
    Specifica il numero di passaggi di addestramento.
    train_batch_size
    Le dimensioni del batch di addestramento.
    iterations_per_loop
    Il numero di passaggi di addestramento da eseguire sulla TPU prima di inviare metriche alla CPU.

Questo comando esegue l'addestramento del modello EffectiveNet (efficientnet-b0 variante) solo per 1000 passi in quanto utilizza il set di dati ImageNet falso. Durante l'addestramento con il set di dati completo di ImageNet, puoi addestrare la convergenza utilizzando il seguente comando:

(vm)$ python3 main.py \
  --tpu=${TPU_NAME} \
  --data_dir=${DATA_DIR} \
  --model_dir=${MODEL_DIR} \
  --model_name='efficientnet-b3' \
  --skip_host_call=true \
  --mode=train \
  --train_steps=109474 \
  --train_batch_size=4096 \
  --iterations_per_loop=100

Questo comando esegue l'addestramento del modello EffectiveNet (efficientnet-b3 variante) per 350 periodi. Il modello dovrebbe raggiungere una precisione dell'81,1% sul set di sviluppo ImageNet, che dovrebbe terminare entro circa 20 ore. Il miglior checkpoint del modello e il risultato di valutazione corrispondente è all'interno della cartella archive nella directory del modello: ${STORAGE_BUCKET}/efficientnet/archive.

Valutazione del modello in corso...

In questo insieme di passaggi, utilizzerai Cloud TPU per valutare il modello addestrato sopra riportato in base ai dati di convalidafalse_imagenet.

  1. Elimina la risorsa Cloud TPU creata per addestrare il modello su un pod.

    (vm)$ gcloud compute tpus execution-groups delete efficientnet-tutorial \
      --tpu-only \
      --zone=europe-west4-a
      
  2. Avvia una Cloud TPU v2-8 per eseguire la valutazione. Utilizza lo stesso nome che hai utilizzato per la VM di Compute Engine, che deve essere ancora in esecuzione.

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

    Descrizioni flag comando

    tpu-only
    Crea solo Cloud TPU. Per impostazione predefinita, il comando gcloud crea una VM e una Cloud TPU.
    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 Cloud TPU.
    tf-version
    La versione di Tensorflow gcloud viene installata sulla VM.
  3. Crea una variabile di ambiente per il tuo nome TPU.

    (vm)$ export TPU_NAME=efficientnet-tutorial
    
  4. Esegui la valutazione del modello. Questa volta, aggiungi il flag mode e impostalo su eval.

    (vm)$ python3 main.py \
       --tpu=${TPU_NAME} \
       --data_dir=${DATA_DIR} \
       --model_dir=${MODEL_DIR} \
       --model_name='efficientnet-b3' \
       --skip_host_call=true \
       --mode=eval
    

    Descrizioni flag comando

    tpu
    Utilizza il nome specificato nella variabile TPU_NAME.
    data_dir
    Indica il percorso Cloud Storage per l'input di addestramento. In questo esempio, è impostato sul set di datifalse_imagenet.
    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 archiviare checkpoint aggiuntivi purché i punti di controllo precedenti siano stati creati utilizzando una Cloud TPU della stessa dimensione e della stessa versione di TensorFlow.
    model_name
    Il nome del modello da addestrare. Ad esempio, efficientnet ecc.
    skip_host_call
    Imposta su true per indicare allo script di saltare il host_call che viene eseguito ogni passaggio dell'addestramento. Viene generalmente utilizzato per generare riepiloghi di formazione (perdite di addestramento, tasso di apprendimento e così via). Quando skip_host_call=false, potrebbe verificarsi un calo delle prestazioni se la funzione host_call è lenta e non riesce a tenere il passo con il calcolo lato TPU.
    mode
    Se impostato su train_and_eval, questo script viene addestrato e valutato. Se impostato su export_only, questo script esporta un modello salvato.

    Tale comando genera un output simile al seguente:

    Eval results: {
    'loss': 7.532023,
    'top_1_accuracy': 0.0010172526,
    'global_step': 100,
    'top_5_accuracy': 0.005065918
    }
    Elapsed seconds: 88

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, utilizza il comando seguente per eliminare la VM di Compute Engine e Cloud TPU:

    $ gcloud compute tpus execution-groups delete efficientnet-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.