Maschera di addestramento RCNN su Cloud TPU (TF 2.x)


Panoramica

Questo tutorial mostra come eseguire il modello Mask RCNN utilizzando Cloud TPU con il set di dati COCO.

Mask RCNN è una rete neurale profonda progettata per il rilevamento degli oggetti e la segmentazione delle immagini, una delle sfide più difficili della visione artificiale.

Il modello Maschera RCNN genera riquadri di delimitazione e maschere di segmentazione per ogni di un oggetto nell'immagine. Il modello si basa sul Funzionalità Pyramid Network (FPN) e backbone ResNet50.

Questo tutorial utilizza l'API TensorFlow Keras per addestrare il modello. L'API Keras è un'API TensorFlow di alto livello che può essere utilizzata per creare ed eseguire un modello di machine learning su Cloud TPU. L'API semplifica lo sviluppo del modello di sicurezza nascondendo la maggior parte delle implementazioni di basso livello, il che semplifica la passare dalla TPU ad altre piattaforme come GPU o CPU.

Queste istruzioni presuppongono che tu abbia già familiarità con l'addestramento di un modello con Cloud TPU. Se non hai mai utilizzato Cloud TPU, puoi consulta la Guida rapida per un'introduzione di base.

Obiettivi

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

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.

Prepara il set di dati COCO

Questo tutorial utilizza il set di dati COCO. Il set di dati deve essere in formato TFRecord su un bucket Cloud Storage da usare per l'addestramento.

Se hai già preparato il set di dati COCO in un bucket Cloud Storage che si trova nella zona che utilizzerai per addestrare il modello, puoi andare direttamente all'addestramento su un singolo dispositivo. In caso contrario, segui questi passaggi per preparare il set di dati.

  1. Apri una finestra di Cloud Shell.

    Apri Cloud Shell

  2. In Cloud Shell, configura gcloud con l'ID progetto.

    export PROJECT_ID=project-id
    gcloud config set project ${PROJECT_ID}
  3. In Cloud Shell, crea un bucket Cloud Storage utilizzando il seguente comando:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
  4. Crea una VM di Compute Engine per scaricare e pre-elaborare il set di dati. Per ulteriori informazioni, consulta Creare e avviare un'istanza Compute Engine.

    $ gcloud compute instances create vm-name \
        --zone=us-central2-b \
        --image-family=ubuntu-2204-lts \
        --image-project=ubuntu-os-cloud \
        --machine-type=n1-standard-16 \
        --boot-disk-size=300GB
  5. Connettiti alla VM di Compute Engine tramite SSH:

    $ gcloud compute ssh vm-name --zone=us-central2-b

    Quando ti connetti alla VM, il prompt della shell cambia da Da username@projectname a username@vm-name.

  6. Configura due variabili, una per il bucket di archiviazione creato in precedenza e una per la directory che contiene i dati di addestramento (DATA_DIR) nel bucket di archiviazione.

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
  7. Installa i pacchetti necessari per pre-elaborare i dati.

    (vm)$ sudo apt-get update && \
      sudo apt-get install python3-pip && \
      sudo apt-get install -y python3-tk && \
      pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow numpy absl-py tensorflow && \
      pip3 install --user "git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI"
  8. Esegui lo script download_and_preprocess_coco.sh per convertire il set di dati COCO in un insieme di file TFRecord (*.tfrecord) previsti dall'applicazione di addestramento.

    (vm)$ git clone https://github.com/tensorflow/tpu.git
    (vm)$ sudo bash tpu/tools/datasets/download_and_preprocess_coco.sh ./data/dir/coco

    Vengono installate le librerie richieste ed eseguito lo script di preelaborazione. Consente di generare file *.tfrecord nella directory dei dati locali. Lo script di download e conversione COCO richiede circa un'ora.

  9. Copia i dati nel bucket Cloud Storage.

    Dopo aver convertito i dati nel formato TFRecord, copiali dallo spazio di archiviazione locale al bucket Cloud Storage con gcloud CLI. Devi anche copiare i file di annotazioni. Questi file consentono di convalidare le prestazioni del modello.

    (vm)$ gcloud storage cp ./data/dir/coco/*.tfrecord ${DATA_DIR}
    (vm)$ gcloud storage cp ./data/dir/coco/raw-data/annotations/*.json ${DATA_DIR}
  10. Disconnettiti dalla VM di Compute Engine:

    (vm)$ exit

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

  11. Elimina la VM Compute Engine:

    $ gcloud compute instances delete vm-name \
    --zone=us-central2-b

Addestramento su dispositivo singolo Cloud TPU

.
  1. Apri una finestra di Cloud Shell.

    Apri Cloud Shell

  2. Crea una variabile di ambiente 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 la Cloud TPU.

    gcloud config set project ${PROJECT_ID}

    La prima volta che esegui questo comando in una nuova VM Cloud Shell, viene visualizzata una paginaAuthorize Cloud Shell. Fai clic su Authorize in basso della 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. Esporta le variabili di configurazione della TPU

    Esporta l'ID progetto, il nome che vuoi utilizzare per le risorse TPU, e la zona in cui addestri l'addestramento del modello e archiviare tutti i dati relativi all'addestramento.

    $ export TPU_NAME=mask-rcnn-tutorial
    $ export ZONE=europe-west4-a
  6. Avvia una VM Compute Engine e una Cloud TPU.

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

    Descrizioni flag di comando

    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 la documentazione di riferimento di gcloud.

  7. 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 mask-rcnn-tutorial --zone=${ZONE}
  8. Installa i requisiti di TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  9. Imposta la variabile nome Cloud TPU.

    (vm)$ export TPU_NAME=local
  10. Configura le seguenti variabili di ambiente, sostituendo bucket-name con il nome del bucket Cloud Storage in cui è archiviato il set di dati COCO:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
  11. Aggiungi le variabili di ambiente per le directory dei dati e dei modelli.

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn
  12. Aggiungi alcune altre variabili di ambiente richieste:

    (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
  13. Imposta la variabile di ambiente PYTHONPATH:

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
  14. 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
  15. Passa alla directory in cui è archiviato il modello:

    (vm)$ cd /usr/share/tpu/models/official/vision

Lo script seguente esegue un addestramento di esempio per 10 passaggi di addestramento e 10 passaggi di valutazione. Il completamento richiede circa 6 minuti su una TPU v3-8. L’addestramento per la convergenza richiede circa 22.500 passi e circa 6 ore su una TPU v3-8.

  1. Esegui il seguente comando per addestrare il modello Mask-RCNN:

    (vm)$ python3 train.py \
      --tpu=${TPU_NAME} \
      --experiment=maskrcnn_resnetfpn_coco \
      --mode=train_and_eval \
      --config_file=configs/experiments/maskrcnn/r50fpn_640_coco_scratch_tpu4x4.yaml \
      --model_dir=${MODEL_DIR} \
      --params_override="task.train_data.input_path=${TRAIN_FILE_PATTERN},task.validation_data.input_path=${EVAL_FILE_PATTERN},task.annotation_file=${VAL_JSON_FILE},runtime.distribution_strategy=tpu,trainer.train_steps=10,trainer.validation_steps=10,task.train_data.global_batch_size=8,task.validation_data.global_batch_size=8"

    Descrizioni dei flag dei comandi

    strategy_type
    La strategia di distribuzione.
    tpu
    Il nome della tua TPU.
    model_dir
    Specifica la directory in cui sono archiviati i checkpoint e i riepiloghi durante l'addestramento del modello. Se la cartella non è presente, il programma crea uno. Se utilizzi un Cloud TPU, model_dir deve essere un percorso Cloud Storage ("gs://..."). Puoi riutilizzare una cartella esistente per caricare i dati del checkpoint corrente e per archiviare checkpoint aggiuntivi, a condizione che i checkpoint precedenti siano stati creati utilizzando una TPU delle stesse dimensioni e della stessa versione di TensorFlow.

    Al termine dell'addestramento, viene visualizzato un messaggio simile al seguente:

    {'frcnn_box_loss': 0.033865165,
     'frcnn_cls_loss': 1.2535654,
     'learning_rate': 0.008266499,
     'mask_loss': 1.2039567,
     'model_loss': 2.821458,
     'rpn_box_loss': 0.034982488,
     'rpn_score_loss': 0.2950886,
     'total_loss': 4.340171,
     'training_loss': 4.340171}
    train | step:     10 | steps/sec:    0.1 | output:
    {'frcnn_box_loss': 0.033865165,
     'frcnn_cls_loss': 1.2535654,
     'learning_rate': 0.008266499,
     'mask_loss': 1.2039567,
     'model_loss': 2.821458,
     'rpn_box_loss': 0.034982488,
     'rpn_score_loss': 0.2950886,
     'total_loss': 4.340171,
     'training_loss': 4.340171}
    

    seguito dall'output dei passaggi di valutazione.

    Hai completato l'addestramento e la valutazione su un singolo dispositivo. Utilizza la i seguenti passaggi per eliminare le risorse TPU su singolo dispositivo attuali.

  2. Disconnettiti dall'istanza Compute Engine:

    (vm)$ exit

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

  3. Elimina la risorsa TPU.

    $ gcloud compute tpus tpu-vm delete mask-rcnn-tutorial \
        --zone=europe-west4-a

    Descrizioni flag di comando

    zone
    La zona in cui si trovava la tua Cloud TPU.

A questo punto, puoi concludere questo tutorial ed eseguire le operazioni di pulizia oppure continuare ed esplorare l'esecuzione del modello sui pod Cloud TPU.

Scalabilità del modello con i pod Cloud TPU

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

Addestramento di pod 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 per utilizzare il progetto in cui vuoi creare con Cloud TPU.

    gcloud config set project ${PROJECT_ID}

    La prima volta che esegui questo comando in una nuova VM Cloud Shell, viene visualizzata una paginaAuthorize Cloud Shell. Fai clic su Authorize in basso della 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.

    Gli account di servizio consentono al servizio Cloud TPU di accedere ad altre 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. Se in precedenza hai preparato il set di dati COCO e lo hai spostato nel tuo spazio di archiviazione di archiviazione, puoi utilizzarlo di nuovo per l'addestramento dei pod. Se non hai ancora preparato il set di dati COCO, preparalo ora e torna qui per configurare l'addestramento.

  6. avvia un pod di Cloud TPU

    Questo tutorial specifica un pod v3-32. Per altre opzioni di pod, consulta Versioni TPU.

    $ gcloud compute tpus tpu-vm create mask-rcnn-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.
  7. 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 mask-rcnn-tutorial --zone=${ZONE}
  8. Installa i requisiti di TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  9. Lo script di addestramento richiede un pacchetto aggiuntivo. Installalo ora:

    (vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
  10. Imposta la variabile del nome Cloud TPU.

    (vm)$ export TPU_NAME=mask-rcnn-tutorial
  11. Configura le seguenti variabili di ambiente, sostituendo bucket-name con il nome del tuo bucket Cloud Storage:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
  12. Aggiungi altre variabili di ambiente obbligatorie:

    (vm)$ export RESNET_CHECKPOINT=gs://cloud-tpu-checkpoints/retinanet/resnet50-checkpoint-2018-02-07
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    (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
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-pod
  13. Imposta la variabile di ambiente PYTHONPATH:

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

    (vm)$ cd /usr/share/tpu/models/official/vision
    (vm)$ cd /usr/share/models/official/legacy/detection
  15. Addestra il modello:

    Questa procedura addestra il modello sul set di dati COCO per 10 passaggi di addestramento. L'addestramento richiede circa 10 minuti su una Cloud TPU v3-32.

    (vm)$ python3 train.py \
      --tpu=${TPU_NAME} \
      --experiment=maskrcnn_resnetfpn_coco \
      --mode=train_and_eval \
      --config_file=configs/experiments/maskrcnn/r50fpn_640_coco_scratch_tpu4x4.yaml \
      --model_dir=${MODEL_DIR} \
      --params_override="task.train_data.input_path=${TRAIN_FILE_PATTERN},task.validation_data.input_path=${EVAL_FILE_PATTERN},task.annotation_file=${VAL_JSON_FILE},runtime.distribution_strategy=tpu,trainer.train_steps=10,trainer.validation_steps=10,task.train_data.global_batch_size=256,task.validation_data.global_batch_size=256"

    Descrizioni flag di comando

    tpu
    Il nome della TPU.
    model_dir
    Specifica la directory in cui sono archiviati i checkpoint e i riepiloghi durante l'addestramento del modello. Se la cartella non è presente, il programma crea uno. Quando utilizzi una Cloud TPU, model_dir deve essere un percorso Cloud Storage (gs://...). Puoi riutilizzare una cartella esistente per caricare i dati dei checkpoint attuali e archiviare checkpoint aggiuntivi, purché i precedenti checkpoint siano creata utilizzando Cloud TPU delle stesse dimensioni e TensorFlow completamente gestita.
    params_override
    Una stringa JSON che sostituisce i parametri dello script predefiniti.

Al termine dell'addestramento, viene visualizzato un messaggio simile al seguente:

 I0706 19:47:16.108213 139955064548416 controller.py:457] train | step: 10 | steps/sec:    0.1 | output:
    {'frcnn_box_loss': 0.05632668,
     'frcnn_cls_loss': 1.3012192,
     'learning_rate': 0.008266499,
     'mask_loss': 1.2371812,
     'model_loss': 2.9746659,
     'rpn_box_loss': 0.08227444,
     'rpn_score_loss': 0.2976642,
     'total_loss': 4.493513,
     'training_loss': 4.493513}
train | step:     10 | steps/sec:    0.1 | output:
    {'frcnn_box_loss': 0.05632668,
     'frcnn_cls_loss': 1.3012192,
     'learning_rate': 0.008266499,
     'mask_loss': 1.2371812,
     'model_loss': 2.9746659,
     'rpn_box_loss': 0.08227444,
     'rpn_score_loss': 0.2976642,
     'total_loss': 4.493513,
     'training_loss': 4.493513}
 

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.

Dopo aver eseguito l'addestramento, elimina la VM TPU e rimuovi il bucket di archiviazione.

  1. Disconnettiti dall'istanza Compute Engine, se non lo hai già fatto Fatto:

    (vm)$ exit

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

  2. Elimina le risorse Cloud TPU e Compute Engine.

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

    $ gcloud compute tpus tpu-vm list --zone=${ZONE}
  4. Esegui gcloud CLI come mostrato, sostituendo bucket-name con il nome del bucket Cloud Storage creato per questo tutorial:

    $ 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 il sample dello strumento di conversione dei set di dati per convertire un set di dati di classificazione delle immagini 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, vedi 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 i modelli supportati da TPU su GitHub. Le informazioni sugli iperparametri specifici del modello sono disponibili nel codice fonte di ciascun modello. Per ulteriori informazioni sull'ottimizzazione degli iperparametri, consulta la Panoramica dell'ottimizzazione degli iperparametri e Ottimizzare gli iperparametri.

Inferenza

Una volta addestrato il modello, puoi utilizzarlo per l'inferenza (chiamata anche previsione). Puoi utilizzare lo strumento di conversione per l'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 su Cloud TPU v5e.

Esplora gli strumenti TPU in TensorBoard.