Como treinar o Mask RCNN no Cloud TPU

Este tutorial mostra como treinar o modelo Mask RCNN no Cloud TPU.

Visão geral

Este tutorial demonstra como executar o modelo Mask RCNN usando o Cloud TPU. O modelo Mask RCNN é uma rede neural profunda. Ele aborda um dos desafios mais difíceis do visual computacional: a segmentação de instâncias. A segmentação de instâncias é a tarefa de detectar e distinguir vários objetos em uma única imagem.

Para realizar a segmentação de instâncias, o modelo Mask RCNN gera caixas delimitadoras e máscaras de segmentação para cada instância de um objeto na imagem. O modelo é baseado na rede de pirâmide de recursos (FPN, na sigla em inglês) e em um backbone ResNet50

Este tutorial usa o tf.contrib.tpu.TPUEstimator para treinar o modelo. A API TPU Estimator é uma API de alto nível do TensorFlow. Ela é recomendada para criar e executar um modelo de machine learning no Cloud TPU. A API simplifica o processo de desenvolvimento de modelos ao ocultar a maior parte da implementação de nível inferior. Isso facilita a alternância entre a TPU e outras plataformas, como GPU e CPU.

Antes de começar

Antes de começar o tutorial, verifique se o projeto do Google Cloud Platform foi configurado corretamente.

  1. Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se.

  2. Selecione ou crie um projeto do GCP.

    Acessar a página Gerenciar recursos

  3. Verifique se o faturamento foi ativado para o projeto.

    Saiba como ativar o faturamento

  4. Verifique se você tem cota suficiente para usar dispositivos TPU ou Pods.

Como configurar os recursos

Nesta seção, você verá como configurar os recursos de armazenamento, a VM e o Cloud TPU do Cloud Storage para tutoriais.

Crie um intervalo do Cloud Storage

É preciso um intervalo do Cloud Storage para armazenar os dados usados para treinar o modelo e os resultados do treinamento. A ferramenta ctpu up usada neste tutorial configura permissões padrão para a conta de serviço do Cloud TPU. Caso queira permissões mais específicas, confira as permissões de nível de acesso.

O intervalo criado precisa residir na mesma região que sua máquina virtual (VM, na sigla em inglês) e seu dispositivo Cloud TPU ou fatia do Cloud TPU (vários dispositivos TPU).

  1. Acesse a página do Cloud Storage no Console do GCP.

    Acessar a página do Cloud Storage

  2. Crie um novo intervalo especificando as opções a seguir:

    • Um nome exclusivo à sua escolha
    • classe de armazenamento padrão: Regional
    • localização: se quiser usar um dispositivo Cloud TPU, aceite o padrão apresentado. Caso queira usar uma fatia do pod do Cloud TPU, especifique uma região em que eles estão disponíveis.

Use a ferramenta ctpu

Nesta seção, mostraremos o uso da ferramenta de provisionamento do Cloud TPU (ctpu) para criar e gerenciar recursos do projeto no Cloud TPU. Os recursos são compostos por uma máquina virtual (VM, na sigla em inglês) e um recurso do Cloud TPU com o mesmo nome. Eles precisam residir na mesma região/zona que o intervalo recém-criado.

Também é possível configurar os recursos de VM e TPU usando comandos gcloud ou o Console do Cloud. Para mais informações, consulte Como gerenciar recursos de VM e TPU.

Execute o ctpu up para criar recursos

  1. Abra uma janela do Cloud Shell.

    Abrir o Cloud Shell

  2. Execute ctpu up especificando os sinalizadores mostrados para um dispositivo Cloud TPU ou para uma fatia de Pod. Para opções e descrições do sinalizador, consulte Referência do CTPU.

  3. Configure um dispositivo do Google Cloud TPU ou uma fatia do Pod:

Dispositivo TPU

Configure um dispositivo do Cloud TPU:

$ ctpu up --machine-type n1-standard-8 --tpu-size v3-8

A seguinte mensagem de configuração será exibida:

ctpu will use the following configuration:

Name: [your TPU's name]
Zone: [your project's zone]
GCP Project: [your project's name]
TensorFlow Version: 1.13
VM:
  Machine Type: [your machine type]
  Disk Size: [your disk size]
  Preemptible: [true or false]
Cloud TPU:
  Size: [your TPU size]
  Preemptible: [true or false]

OK to create your Cloud TPU resources with the above configuration? [Yn]:

Pressione y para criar os recursos do Cloud TPU.

Pod do TPU

Configure uma fatia do Cloud TPU na VM e na zona em que você está trabalhando:

$ ctpu up --zone=us-central1-a --tpu-size=v2-128 --machine-type n1-standard-8

A seguinte mensagem de configuração será exibida:

ctpu will use the following configuration:

Name: [your TPU's name]
Zone: [your project's zone]
GCP Project: [your project's name]
TensorFlow Version: 1.13
VM:
  Machine Type: [your machine type]
  Disk Size: [your disk size]
  Preemptible: [true or false]
Cloud TPU:
  Size: [your TPU size]
  Preemptible: [true or false]

OK to create your Cloud TPU resources with the above configuration? [Yn]:

Pressione y para criar os recursos do Cloud TPU.

O comando ctpu up cria uma máquina virtual (VM, na sigla em inglês) e serviços do Cloud TPU.

Daqui em diante, o prefixo (vm)$ significa que você precisa executar o comando na instância de VM do Compute Engine.

Verifique a VM do Compute Engine

Quando o comando ctpu up for concluído, verifique se o prompt do shell é username@tpuname, o que mostra que você está conectado à VM do Compute Engine.

Instalar pacotes extras

O aplicativo de treinamento Mask RCNN requer vários pacotes extras. Instale-os agora:

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

Atualizar os valores keepalive da conexão da VM

Este tutorial requer uma conexão de longa duração com a instância do Compute Engine. Para garantir que a instância não seja desconectada, execute o seguinte comando:

(vm)$ sudo /sbin/sysctl \
       -w net.ipv4.tcp_keepalive_time=60 \
       net.ipv4.tcp_keepalive_intvl=60 \
       net.ipv4.tcp_keepalive_probes=5

Verificar os arquivos do modelo Mask RCNN

Execute os seguintes comandos para acessar os arquivos mais recentes do Mask RCNN.

(vm)$ git clone https://github.com/tensorflow/tpu/

Definir valores de parâmetros

Em seguida, você precisa definir vários valores de parâmetro. Use esses parâmetros para treinar e avaliar seu modelo.

As variáveis que você precisa definir são as seguintes:

  • STORAGE_BUCKET. Este é o nome do intervalo do Cloud Storage criado na seção Antes de começar.
  • GCS_MODEL_DIR. Este é o diretório que contém os arquivos de modelo. O tutorial usa uma pasta no intervalo do Cloud Storage. Não é preciso criar essa pasta antecipadamente. O script cria a pasta, se ela ainda não existir.
  • CHECKPOINT. Esta variável especifica um ponto de verificação pré-treinado. O modelo Mask RCNN requer um modelo de classificação de imagens pré-treinado, como o Resnet, para ser usado como uma rede de backbone. Este tutorial usa um checkpoint pré-treinado criado com o modelo de demonstração ResNet. É possível treinar o próprio modelo ResNet e especificar um checkpoint no diretório desse modelo.
  • BACKBONE (apenas dispositivo TPU). A rede de backbone para o MaskRCNN. Neste tutorial, você configurará o backbone para resnet50.
  • PATH_GCS_MASKRCNN. É o endereço do intervalo do Cloud Storage em que você quer armazenar os artefatos do treinamento de modelo. Assim como na variável GCS_MODEL_DIR, este tutorial usa uma pasta no intervalo do Cloud Storage.

Para definir essas variáveis, use o comando export para criar diversas variáveis bash e usá-las em uma string de configuração. Se você estiver usando um único dispositivo TPU, defina essas variáveis usando um arquivo config.yaml.

Dispositivo TPU

Como usar variáveis bash:

(vm)$ export STORAGE_BUCKET=gs://[YOUR_BUCKET_NAME]
    
(vm)$ export GCS_MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-model; \
export CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603; \
export BACKBONE='resnet50'; \
export PATH_GCS_MASKRCNN=${STORAGE_BUCKET}/coco
    

Como usar um arquivo config.yaml:

checkpoint: gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603
backbone: 'resnet50'
use_bfloat16: True
train_batch_size: 64
eval_batch_size: 8
training_file_pattern: gs://[YOUR_BUCKET_NAME]/train-*
validation_file_pattern: gs://[YOUR_BUCKET_NAME]/val-*
val_json_file: gs://[YOUR_BUCKET_NAME]/instances_val2017.json
total_steps: 22500
      

Pod do TPU

(vm)$ export STORAGE_BUCKET=gs://[YOUR_BUCKET_NAME]
    
(vm)$ export GCS_MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-model; \
export CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603; \
export PATH_GCS_MASKRCNN=${STORAGE_BUCKET}/coco
    

Preparar os dados

O modelo Mask RCNN treina usando o COCO, um conjunto de dados de detecção, segmentação e legendagem de objetos em grande escala. Nesta etapa, você converte esse conjunto de dados em um conjunto de TFRecords (*.tfrecord) que o aplicativo de treinamento pode usar. Para converter o conjunto de dados, use o script tpu/tools/datasets/download_and_preprocess_coco.sh.

(vm)$ cd tpu/tools/datasets && \
bash download_and_preprocess_coco.sh ./data/dir/coco

Copiar os dados para o intervalo do Cloud Storage

Depois de converter os dados para TFrecords, copie-os para o intervalo do Cloud Storage usando o comando gsutil.

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

É preciso copiar também os arquivos de anotação. Eles ajudam a validar o desempenho do modelo.

Executar o treinamento e a avaliação

Agora, está tudo pronto para executar o modelo nos dados de COCO pré-processados. O script mask_rcnn_main.py é usado para fazer isso.

Dispositivo TPU

Usando um dispositivo TPU, é possível executar o treinamento e a avaliação ao mesmo tempo, por meio das variáveis bash ou de um arquivo config.yaml.

Como usar variáveis bash:

(vm)$ python ~/tpu/models/official/mask_rcnn/mask_rcnn_main.py \
    --use_tpu=True \
    --tpu=${TPU_NAME:?} \
    --model_dir=${GCS_MODEL_DIR:?} \
    --num_cores=8 \
    --mode="train_and_eval" \
    --config="checkpoint=${CHECKPOINT},backbone=${BACKBONE},use_bfloat16=true,train_batch_size=64,eval_batch_size=8,training_file_pattern=${PATH_GCS_MASKRCNN:?}/train-*,validation_file_pattern=${PATH_GCS_MASKRCNN:?}/val-*,val_json_file=${PATH_GCS_MASKRCNN:?}/instances_val2017.json,total_steps=22500"

Como usar um arquivo config.yaml:

(vm)$ python ~/tpu/models/official/mask_rcnn/mask_rcnn_main.py \
--use_tpu=True \
--tpu=${TPU_NAME:?} \
--model_dir="gs://[YOUR_BUCKET_NAME]/mask-rcnn-model" \
--config="[PATH_TO_CONFIG_FILE]" \
--mode="train_and_eval"

Pod do TPU

Ao usar um pod do TPU, é necessário primeiro treinar o modelo com ele. Em seguida, você inicia um único dispositivo TPU para executar a avaliação.

  1. Inicie o script de treinamento.

    (vm)$ python ~/tpu/models/official/mask_rcnn/mask_rcnn_main.py  \
    --tpu=${TPU_NAME} \
    --config=${CONFIG_SCRIPT} \
    --iterations_per_loop=500 \
    --mode=train  \
    --model_dir=${GCS_MODEL_DIR} \
    --num_cores=128  \
    --use_tpu
    
  2. Depois de terminar o treinamento, saia do pod do TPU.

    (vm)$ exit
  3. Inicie um novo dispositivo TPU, mask-rcnn-eval.

    $ ctpu up --tpu-size=v3-8 --name=mask-rcnn-eval --zone=us-central1-a
  4. Crie suas variáveis ambientais.

    (vm)$ export STORAGE_BUCKET=gs://[YOUR_BUCKET_NAME]
    $ export GCS_MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-model; \
    export CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603; \
    export PATH_GCS_MASKRCNN=${STORAGE_BUCKET}/coco
  5. Clone o repositório Mask RCNN.

    (vm)$ git clone https://github.com/tensorflow/tpu/
  6. Instale os pacotes necessários para executar a avaliação.

    (vm)$ sudo apt-get install -y python-tk && \
    pip install Cython matplotlib opencv-python-headless pyyaml && \
    (vm)$ pip install 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI'
    
  7. Inicie a avaliação.

    (vm)$ python ~/tpu/models/official/mask_rcnn/mask_rcnn_main.py \
    --tpu=mask-rcnn-eval \
    --config="use_bfloat16=True,init_learning_rate=0.28,learning_rate_levels=[0.028, 0.0028, 0.00028],learning_rate_steps=[6000, 8000, 10000],momentum=0.95,num_batch_norm_group=1,num_steps_per_eval=500,global_gradient_clip_ratio=0.02,checkpoint=${CHECKPOINT},total_steps=11250,train_batch_size=512,training_file_pattern=${PATH_GCS_MASKRCNN}/train-*,val_json_file=${PATH_GCS_MASKRCNN}/instances_val2017.json,validation_file_pattern=${PATH_GCS_MASKRCNN}/val-*,warmup_steps=1864" \
    --iterations_per_loop=500 \
    --mode=eval \
    --model_dir=${GCS_MODEL_DIR} \
    --use_tpu

Limpeza

As etapas abaixo mostram como evitar cobranças na sua conta do GCP pelo uso de recursos.

  1. Encerre a conexão com a VM do Compute Engine:

    (vm)$ exit
    

    Agora, o prompt precisa ser user@projectname, mostrando que você está no Cloud Shell.

  2. No Cloud Shell, execute ctpu delete com a sinalização --zone usada ao configurar o Cloud TPU para excluir a VM do Compute Engine e o Cloud TPU:

    $ ctpu delete [optional: --zone]
    
  3. Execute ctpu status para verificar se não há instâncias alocadas e evitar cobranças desnecessárias pelo uso do TPU. A exclusão pode levar vários minutos. Uma resposta como esta indica que não há mais instâncias alocadas:

    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. Execute gsutil, conforme mostrado, substituindo YOUR-BUCKET-NAME pelo nome do intervalo do Cloud Storage criado para este tutorial:

    $ gsutil rm -r gs://YOUR-BUCKET-NAME
    

A seguir

Aprenda a executar o TensorBoard para visualizar e analisar o desempenho do programa. Para mais informações, consulte Como configurar o TensorBoard.

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…