Addestramento di ResNet su Cloud TPU

Il modello di questo tutorial è basato su Deep Residual Learning for Image Recognition, che introduce per prima l'architettura ResNet (ResNet). Il tutorial utilizza la variante a 50 livelli, ResNet-50, e dimostra l'addestramento del modello utilizzando TPUEstimator. Il modello ResNet-50 è preinstallato sulla tua VM di Compute Engine.

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. 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 e Cloud TPU utilizzando il comando gcloud.

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --name=resnet-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 ctpu 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 tua VM di Compute Engine.

    gcloud compute ssh resnet-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.

Configura percorso di archiviazione, modello e dati

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

(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet
(vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
(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 il bucket Cloud Storage per archiviare i punti di controllo durante l'addestramento.

Addestra e valuta il modello ResNet confalse_imagenet

ImageNet è un database di immagini. Le immagini nel database sono organizzate in una gerarchia; ogni nodo della gerarchia contiene 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 utilizzando l'utilità ctpu.

    (vm)$ gcloud compute tpus execution-groups create \
     --tpu-only \
     --accelerator-type=v3-8  \
     --name=resnet-tutorial \
     --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 la variabile del nome Cloud TPU.

     (vm)$ export TPU_NAME=resnet-tutorial
     (vm)$ export ACCELERATOR_TYPE=v3-8
    
  3. Passa alla directory del modello:

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

    Per un singolo dispositivo Cloud TPU, lo script addestra il modello ResNet-50 per 90 periodi e valuta i risultati dopo ogni passaggio di addestramento. Il numero di passaggi di addestramento è impostato con il flag train_steps. Utilizzando la riga di comando script riportata di seguito, il modello dovrebbe essere addestrato in circa 15 minuti.

    Poiché l'addestramento e la valutazione vengono eseguiti sul set di datifalse_imagenet, i risultati di addestramento e valutazione non riflettono i risultati che verrebbero generati se l'addestramento e la valutazione fossero stati eseguiti su un set di dati reale.

    Se esegui questo script su un set di dati reale, utilizza il flag train_steps per specificare il numero di passaggi di addestramento. Consulta i file .yaml nella directory /usr/share/tpu/models/official/resnet/configs/cloud per farti un'idea di quanti passaggi di addestramento utilizzare.

     (vm)$ python3 resnet_main.py \
        --tpu=${TPU_NAME} \
        --data_dir=${DATA_DIR} \
        --model_dir=${MODEL_DIR} \
        --train_steps=500 \
        --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml
    

    Descrizioni flag comando

    tpu
    Indica il nome della Cloud TPU. Tieni presente che ctpu trasmette questo nome alla VM di Compute Engine come variabile di ambiente (TPU_NAME).
    data_dir
    Il percorso Cloud Storage di input dell'addestramento. È impostato sul set di dati false_imagenet in questo esempio.
    model_dir
    Il bucket Cloud Storage, in cui i punti di controllo e i riepiloghi vengono archiviati durante l'addestramento. Puoi utilizzare una cartella esistente per caricare punti di controllo generati in precedenza creati su una TPU delle stesse dimensioni e versione di TensorFlow.
    config_file
    Specifica il file YAML di configurazione da utilizzare durante l'addestramento. Il nome di questo file corrisponde al tipo di TPU utilizzato. Ad esempio, v2-8.yaml.

L'output dello script di addestramento dovrebbe avere il seguente aspetto:

Eval results at step 500: {
  'top_1_accuracy': 0.0010579427,
  'top_5_accuracy': 0.005391439,
  'global_step': 500,
  'loss': 8.253192
}

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

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 ResNet-50 completamente supportato può funzionare con le seguenti sezioni di pod:

  • v2-32
  • v2-128
  • v2-256
  • v2-512
  • v3-32
  • v3-128
  • v3-256
  • v3-512
  • v3-1024
  • v3-2048

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 resnet-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 --name=resnet-tutorial \
      --accelerator-type=v2-32  \
      --zone=europe-west4-a \
      --tf-version=1.15.5 \
      --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 Cloud TPU.
    tf-version
    La versione di Tensorflow gcloud viene installata sulla VM.
    tpu-only
    Crea solo Cloud TPU. Per impostazione predefinita, il comando gcloud crea una VM e una Cloud TPU.
  3. Aggiorna le variabili di ambiente TPU_NAME e ACCELERATOR_TYPE per specificare un nome pod pod TPU come tipo acceleratore.

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

      (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-tutorial
    
  5. Addestra il modello, aggiornando il parametro config_file in modo che utilizzi il file di configurazione corrispondente alla sezione del pod che vuoi utilizzare. Ad esempio, lo script di addestramento utilizza il file di configurazione v2-32.yaml.

    Lo script addestrare il modello sul set di dati falsi_imagnet a 35 periodi. L'esecuzione su una Cloud TPU v3-128 richiede circa 90 minuti.

    (vm)$ python3 resnet_main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --train_steps=500 \
      --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml
    

    Descrizioni flag comando

    tpu
    Il nome della tua Cloud TPU.
    data_dir
    Il percorso Cloud Storage di input dell'addestramento. È impostato sul set di dati false_imagenet in questo esempio.
    model_dir
    Il bucket Cloud Storage, in cui i punti di controllo e i riepiloghi vengono archiviati durante l'addestramento. Puoi utilizzare una cartella esistente per caricare i punti di controllo generati in precedenza creati su una TPU delle stesse dimensioni e con la versione di TensorFlow.
    train_steps
    Il numero di passaggi da utilizzare per l'addestramento.
    config_file
    Specifica il file YAML di configurazione da utilizzare durante l'addestramento. Il nome di questo file corrisponde al tipo di TPU utilizzato. Ad esempio, v2-8.yaml.

Valutazione del modello in corso...

In questo passaggio, 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.

    (vm)$ gcloud compute tpus execution-groups delete resnet-tutorial \
     --zone=europe-west4-a \
     --tpu-only
    
  2. Creare una risorsa pod Cloud TPU v3-8.

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

    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.
    tf-version
    La versione di Tensorflow gcloud viene installata sulla VM.
    accelerator-type
    Il tipo di Cloud TPU da creare.
  3. Aggiorna la variabile di ambiente TPU_NAME.

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

     (vm)$ python3 resnet_main.py \
       --tpu=${TPU_NAME} \
       --data_dir=${DATA_DIR} \
       --model_dir=${MODEL_DIR} \
       --mode=eval \
       --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml
    

    Descrizioni flag comando

    tpu
    Cloud TPU da utilizzare per l'addestramento.
    data_dir
    Il percorso Cloud Storage in cui sono archiviati i dati 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.
    mode
    Uno dei seguenti: train, eval, train_and_eval o predict.
    config_file
    Specifica il file YAML di configurazione da utilizzare durante l'addestramento. Il nome di questo file corrisponde al tipo di TPU utilizzato. Ad esempio, v2-8.yaml.

Tale comando genera un output simile al seguente:

Eval results: {
  'loss': 8.255788,
  'top_1_accuracy': 0.0009969076,
  'global_step': 0,
  'top_5_accuracy': 0.005126953
  }.
  Elapsed seconds: 76

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

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@project, 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 resnet-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.