Addestramento RetinaNet su Cloud TPU

Questo documento descrive un'implementazione del modello di rilevamento degli oggetti RetinaNet. Il codice è disponibile su GitHub.

Le istruzioni riportate di seguito presuppongono che tu abbia già familiarità con l'esecuzione di un modello su Cloud TPU. Se non hai mai utilizzato Cloud TPU, puoi consultare la guida rapida per un'introduzione di base.

Se prevedi di addestrare una sezione di un pod di TPU, consulta Formazione sui pod di TPU per comprendere le modifiche ai parametri richieste per le sezioni dei pod.

Obiettivi

  • Crea un bucket Cloud Storage per contenere l'output del set di dati e il modello
  • Prepara il set di dati COCO
  • Configura una VM di Compute Engine e un nodo Cloud TPU per l'addestramento e la valutazione
  • Esegui addestramento e valutazione su una singola Cloud TPU o un pod di Cloud TPU

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

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

  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=retinanet-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 gcloud compute tpus execution-groups viene installata sulla VM.

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

  7. Viene visualizzata la configurazione da te specificata. Inserisci y per approvare o n per annullare.

    Al termine dell'esecuzione del comando gcloud compute tpus execution-groups, verifica che il prompt di Cloud 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 retinanet-tutorial --zone=europe-west4-a
    

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

    Quando il comando gcloud avvia una macchina virtuale (VM) Compute Engine, posiziona automaticamente i file del modello RetinaNet dal ramo TensorFlow nella directory /usr/share/tpu/models/official/detection/.

  8. Utilizza il comando export per impostare queste variabili di ambiente.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export TPU_NAME=retinanet-tutorial
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    
  9. Installa pacchetti aggiuntivi

    L'applicazione di formazione RetinaNet richiede diversi pacchetti aggiuntivi. Installale subito:

    (vm)$ sudo apt-get install -y python3-tk
    
    (vm)$ pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow
    
    (vm)$ pip3 install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI'
    
    (vm)$ pip3 install --user -U gast==0.2.2
    

Prepara il set di dati COCO

  1. Esegui lo script download_and_preprocess_coco.sh per convertire il set di dati COCO in un set di TFRecord (*.tfrecord) previsto.

    (vm)$ sudo bash /usr/share/tpu/tools/datasets/download_and_preprocess_coco.sh ./data/dir/coco
    

    Vengono installate le librerie richieste ed eseguito lo script di pre-elaborazione. Genera una serie di file *.tfrecord nella directory dati locale.

  2. Dopo aver convertito i dati in TFRecord, copiali dallo spazio di archiviazione locale nel tuo bucket Cloud Storage utilizzando il comando gsutil. Devi anche copiare i file delle annotazioni. Questi file consentono di convalidare le prestazioni del modello:

    (vm)$ gsutil -m cp ./data/dir/coco/*.tfrecord ${DATA_DIR}
    
    (vm)$ gsutil cp ./data/dir/coco/raw-data/annotations/*.json ${DATA_DIR}
    

Configurare l'ambiente di addestramento

  1. Esegui questo comando per creare Cloud TPU.

    (vm)$ gcloud compute tpus execution-groups create \
     --tpu-only \
     --name=retinanet-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.
    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 compute tpus execution-groups viene installata sulla VM.
  2. Viene visualizzata la configurazione da te specificata. Inserisci y per approvare o n per annullare.

    Verrà visualizzato un messaggio: Operation success; not ssh-ing to Compute Engine VM due to --tpu-only flag. Poiché in precedenza hai completato la propagazione della chiave SSH, puoi ignorare questo messaggio.

  3. Aggiorna i valori keepalive per la connessione alla VM.

    Questo tutorial richiede una connessione di lunga durata all'istanza di Compute Engine. Per assicurarti di non essere disconnesso dall'istanza, esegui il comando seguente:

    (vm)$ sudo /sbin/sysctl \
      -w net.ipv4.tcp_keepalive_time=120 \
      net.ipv4.tcp_keepalive_intvl=120 \
      net.ipv4.tcp_keepalive_probes=5
    
  4. Ora è tutto pronto per eseguire il modello sui dati COCO pre-elaborati. Innanzitutto, aggiungi la cartella /models di primo livello al percorso Python con il comando:

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

Addestramento e valutazione richiedono TensorFlow 1.13 o una versione successiva.

Addestramento dispositivo Cloud TPU singolo

  1. Configura le seguenti variabili di ambiente:

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-train
    (vm)$ export RESNET_CHECKPOINT=gs://cloud-tpu-checkpoints/retinanet/resnet50-checkpoint-2018-02-07
    (vm)$ export TRAIN_FILE_PATTERN=${DATA_DIR}/train-*
    (vm)$ export EVAL_FILE_PATTERN=${DATA_DIR}/val-*
    (vm)$ export VAL_JSON_FILE=${DATA_DIR}/instances_val2017.json
    
  2. Esegui lo script di addestramento:

    (vm)$ python3 /usr/share/tpu/models/official/detection/main.py \
    --use_tpu=True \
    --tpu=${TPU_NAME} \
    --num_cores=8 \
    --model_dir=${MODEL_DIR} \
    --mode="train" \
    --eval_after_training=True \
    --params_override="{ type: retinanet, train: { checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 } }"
    

    Descrizioni flag comando

    use_tpu
    Addestra il modello su una singola Cloud TPU.
    tpu
    Il nome della Cloud TPU. Per questo viene impostato utilizzando la variabile di ambiente TPU_NAME.
    num_cores
    Il numero di core Cloud TPU da utilizzare durante l'addestramento.
    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 della stessa versione di TensorFlow.
    mode
    Uno di train, eval o train_and_eval.

Valutazione di un singolo dispositivo Cloud TPU

La procedura seguente utilizza i dati di valutazione COCO. La procedura di valutazione richiede circa 10 minuti.

  1. Configura le seguenti variabili di ambiente:

    (vm)$ export EVAL_SAMPLES=5000
    
  2. Esegui lo script di valutazione:

      (vm)$ python3 /usr/share/tpu/models/official/detection/main.py \
        --use_tpu=True \
        --tpu=${TPU_NAME} \
        --num_cores=8 \
        --model_dir=${MODEL_DIR} \
        --mode="eval" \
        --params_override="{ type: retinanet, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: ${EVAL_SAMPLES} } }"
    

    Descrizioni flag comando

    use_tpu
    Imposta su true per l'addestramento su una Cloud TPU.
    tpu
    Il nome della Cloud TPU per eseguire addestramento o valutazione.
    num_cores
    Il numero di core Cloud TPU da utilizzare durante l'addestramento.
    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 della stessa versione di TensorFlow.
    mode
    Uno di train, eval o train_and_eval.
    params_override
    Una stringa JSON che sostituisce i parametri di script predefiniti. Per ulteriori informazioni sui parametri dello script, consulta /usr/share/models/official/vision/detection/main.py.

    Lo script di valutazione mostra un output simile al seguente:

    Eval result: {
      'AP': 0.3371653,
      'ARl': 0.6749888,
      'ARmax100': 0.4848119,
      'APl': 0.48918217,
      'ARmax10': 0.45885247,
      'APs': 0.14764188,
      'ARm': 0.545395,
      'ARs': 0.24094534,
      'AP75': 0.3606217,
      'AP50': 0.51819533,
      'APm': 0.38223606,
      'ARmax1': 0.29476196
    }

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

  • v2-32
  • v3-32
  1. Elimina la risorsa Cloud TPU creata per addestrare il modello su un singolo dispositivo.

    (vm)$ gcloud compute tpus execution-groups delete retinanet-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=retinanet-tutorial \
      --accelerator-type=v3-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. Configura le seguenti variabili di ambiente:

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-model-pod
    (vm)$ export TPU_NAME=retinanet-tutorial
    
  4. Esegui lo script di addestramento dei pod su un nodo TPU v3-32:

    (vm)$ python3 /usr/share/tpu/models/official/detection/main.py \
    --use_tpu=True \
    --tpu=${TPU_NAME} \
    --num_cores=32 \
    --model_dir=${MODEL_DIR} \
    --mode="train" \
    --eval_after_training=False \
    --params_override="{ type: retinanet, train: { train_batch_size: 1024, total_steps: 2109, learning_rate: { warmup_steps: 820, init_learning_rate: 0.64, learning_rate_levels: [0.064, 0.0064], learning_rate_steps: [1641, 1992] }, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, resnet: { batch_norm: { batch_norm_momentum: 0.9 }}, fpn: { batch_norm: { batch_norm_momentum: 0.9 }}, retinanet_head: { batch_norm: { batch_norm_momentum: 0.9 }} }"
    

    Descrizioni flag comando

    use_tpu
    Imposta su true per l'addestramento su una Cloud TPU.
    tpu
    Il nome della Cloud TPU. Se non è specificato durante la configurazione della VM di Compute Engine e di Cloud TPU, viene utilizzato il nome utente per impostazione predefinita.
    num_cores
    Il numero di core Cloud TPU da utilizzare per l'addestramento.
    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 della stessa versione di TensorFlow.
    mode
    Uno dei seguenti: train, eval, train_and_eval o predict.
    eval_after_training
    Impostare true per valutare il modello dopo l'addestramento,
    params_override
    Una stringa JSON che sostituisce i parametri di script predefiniti. Per ulteriori informazioni sui parametri dello script, consulta /usr/share/models/official/vision/detection/main.py.

L'output dello script di addestramento deve avere un testo simile al seguente:

INFO:tensorflow:Loss for final step: 0.96952075.
I1125 21:47:10.729412 140023184553728 estimator.py:371] Loss for final step: 0.96952075.
INFO:tensorflow:training_loop marked as finished
I1125 21:47:10.730288 140023184553728 error_handling.py:101] training_loop marked as finished

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 retinanet-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.

Addestramento con dimensioni di immagini diverse

Puoi esplorare utilizzando una rete neurale più ampia (ad esempio, ResNet-101 anziché ResNet-50). Un'immagine di input più grande e una rete neurale più potente forniranno un modello più lento ma più preciso.

Utilizza una base diversa

In alternativa, puoi esplorare il pre-addestramento di un modello ResNet sul tuo set di dati e utilizzarlo come base per il modello RetinaNet. Con un po' di lavoro, puoi anche scambiare la rete neurale alternativa al posto di ResNet. Infine, se ti interessa implementare modelli di rilevamento degli oggetti, questa rete potrebbe essere una buona base per ulteriori esperimenti.