Esecuzione di MNIST su Cloud TPU (TF 2.x)


Questo tutorial contiene una descrizione generale del modello MNIST, istruzioni per scaricare l'esempio di codice MNIST TensorFlow TPU e guida per l'esecuzione del codice su Cloud TPU.

Disclaimer

Questo tutorial utilizza un set di dati di terze parti. Google non fornisce alcuna dichiarazione o garanzia in merito alla validità o ad altri aspetti di questo set di dati.

Descrizione del modello

Il set di dati MNIST contiene un numero elevato di immagini di cifre scritte a mano, comprese tra 0 e 9, oltre alle etichette che identificano la cifra in ogni immagine.

Questo tutorial addestra un modello di machine learning per classificare le immagini in base al set di dati MNIST. Dopo l'addestramento, il modello classifica le immagini in arrivo in 10 categorie (da 0 a 9) in base a ciò che ha appreso sulle immagini scritte a mano dal set di dati MNIST. Puoi quindi inviare al modello un'immagine che non ha mai visto prima, e il modello identifica la cifra dell'immagine in base a ciò che il modello ha appreso durante l'addestramento.

Il set di dati MNIST è stato suddiviso in tre parti:

  • 60.000 esempi di dati di addestramento
  • 10.000 esempi di dati di test
  • 5000 esempi di dati di convalida

Il modello ha una combinazione di sette livelli:

  • 2 x convoluzione
  • Pooling massimo 2 volte
  • 2 volte denso (completamente connesso)
  • 1 abbandono scolastico

La perdita viene calcolata utilizzando l'entropia incrociata categorica.

Questa versione del modello MNIST utilizza l'API Keras, un modo consigliato per creare ed eseguire un modello di machine learning su una Cloud TPU.

Keras semplifica il processo di sviluppo del modello nascondendo la maggior parte dell'implementazione di basso livello, il che semplifica anche il passaggio tra TPU e altre piattaforme di test come GPU o CPU.

Obiettivi

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

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

  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 us-central1 gs://bucket-name
    

    Questo bucket Cloud Storage archivia i dati utilizzati per addestrare il modello e i risultati dell'addestramento. Il comando gcloud 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.

  6. Avvia una VM di Compute Engine e Cloud TPU utilizzando il comando gcloud. Il comando da utilizzare dipende dall'utilizzo di VM TPU o nodi TPU. Per ulteriori informazioni, consulta Architettura di sistema.

    VM TPU

    $ gcloud compute tpus tpu-vm create mnist-tutorial \
    --zone=us-central1-b \
    --accelerator-type=v3-8 \
    --version=tpu-vm-tf-2.16.1-pjrt \
    

    Descrizioni flag comando

    zone
    La zona in cui prevedi di creare la 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 acceleratore supportati per ogni versione di TPU, consulta Versioni TPU.
    version
    La versione software di Cloud TPU.

    Nodo TPU

    $ gcloud compute tpus execution-groups create \
    --name=mnist-tutorial \
    --zone=us-central1-b \
    --tf-version=2.12.0 \
    --machine-type=n1-standard-1 \
    --accelerator-type=v3-8 \
    

    Descrizioni flag comando

    name
    Il nome della Cloud TPU da creare.
    zone
    La zona in cui prevedi di creare la Cloud TPU.
    tf-version
    La versione di TensorFlow che il comando gcloud viene installata sulla tua VM.
    machine-type
    Il tipo di macchina della VM di Compute Engine da creare.
    accelerator-type
    Il tipo di Cloud TPU da creare.

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

  7. Al termine dell'esecuzione del comando gcloud compute tpus, 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.

    Se non hai una connessione all'istanza Compute Engine, puoi eseguire il comando seguente:

    VM TPU

    gcloud compute tpus tpu-vm ssh mnist-tutorial --zone=us-central1-b
    

    Nodo TPU

    gcloud compute ssh mnist-tutorial --zone=us-central1-b
    

    Mentre continui con queste istruzioni, esegui ogni comando che inizia con (vm)$ nella finestra della sessione VM.

  8. Crea una variabile di ambiente per il nome della TPU.

    VM TPU

    (vm)$ export TPU_NAME=local
    

    Nodo TPU

    (vm)$ export TPU_NAME=mnist-tutorial
    
  9. Installa i requisiti di TensorFlow.

    Il comando da utilizzare varia a seconda che tu stia utilizzando VM TPU o nodi TPU.

    VM TPU

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    

    Nodo TPU

    (vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
    

Addestra il modello

Il codice sorgente per il modello MNIST TPU è disponibile su GitHub.

  1. Imposta le seguenti variabili. Sostituisci bucket-name con il nome del bucket:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mnist
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
    
  2. Imposta la variabile di ambiente PYTHONPATH.

    VM TPU

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

    Nodo TPU

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
  3. Durante la creazione della TPU, se imposti il parametro --version su una versione che termina con -pjrt, imposta le seguenti variabili di ambiente per abilitare il runtime PJRT:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    
  4. Passa alla directory in cui è archiviato il modello:

    VM TPU

    (vm)$ cd /usr/share/tpu/models/official/legacy/image_classification
    

    Nodo TPU

    (vm)$ cd /usr/share/models/official/legacy/image_classification
    
  5. Esegui lo script di addestramento MNIST:

    (vm)$ python3 mnist_main.py \
      --tpu=${TPU_NAME} \
      --model_dir=${MODEL_DIR} \
      --data_dir=${DATA_DIR} \
      --train_epochs=10 \
      --distribution_strategy=tpu \
      --download
    

    Descrizioni flag comando

    tpu
    Il nome della Cloud TPU. Se non specificato durante la configurazione della VM di Compute Engine e di Cloud TPU, il valore predefinito sarà il tuo nome utente.
    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.
    data_dir
    Il percorso Cloud Storage dell'input di addestramento. In questo esempio, è impostato sul set di dati fake_imagenet.
    train_epochs
    Il numero di epoche in cui addestrare il modello.
    distribution_strategy
    Per addestrare il modello ResNet su una Cloud TPU, imposta distribution_strategy su tpu.
    download
    Se impostato su true, lo script scarica e pre-elabora il set di dati MNIST, se non è stato già scaricato.

Lo script di addestramento viene eseguito in meno di 5 minuti su una Cloud TPU v3-8 e mostra un output simile al seguente:

Run stats:
{
  'accuracy_top_1': 0.9762369990348816,
  'eval_loss': 0.07863274961709976,
  'loss': 0.1111728847026825,
  'training_accuracy_top_1': 0.966645359992981
}

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. Elimina le risorse Cloud TPU e Compute Engine. Il comando da utilizzare per eliminare le risorse dipende dall'utilizzo di VM TPU o nodi TPU. Per ulteriori informazioni, consulta Architettura di sistema.

    VM TPU

    $ gcloud compute tpus tpu-vm delete mnist-tutorial \
    --zone=us-central1-b
    

    Nodo TPU

    $ gcloud compute tpus execution-groups delete mnist-tutorial \
    --zone=us-central1-b
    
  3. Verifica che le risorse siano state eliminate eseguendo gcloud compute tpus execution-groups list. L'eliminazione potrebbe richiedere diversi minuti. L'output del comando seguente non deve includere nessuna delle risorse create in questo tutorial:

    VM TPU

    $ gcloud compute tpus tpu-vm list --zone=us-central1-b

    Nodo TPU

    $ gcloud compute tpus execution-groups list --zone=us-central1-b
  4. Elimina il bucket Cloud Storage utilizzando gsutil, come illustrato nell'esempio seguente. 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.