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.

Neste tutorial, usamos 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 Google Cloud Platform.

    Acessar a página Gerenciar recursos

  3. Verifique se o faturamento foi ativado no projeto do Google Cloud Platform.

    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, consulte as permissões de nível de acesso.

O intervalo criado precisa residir na mesma região que a máquina virtual (VM, na sigla em inglês) e o dispositivo Cloud TPU ou fração 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, mostramos 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 do 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 gcloud config set project <Your-Project> para usar o projeto em que você quer criar o Cloud TPU.

  3. Execute ctpu up especificando as sinalizações mostradas para um dispositivo Cloud TPU ou para uma fração de pod. Para opções e descrições do sinalizador, consulte Referência do CTPU.

  4. 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.14
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.14
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

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 é o nome do intervalo do Cloud Storage criado na seção Antes de começar.
  • ACCELERATOR_TYPE é a versão do acelerador e o número de núcleos que você quer usar, por exemplo, v2-128 (128 núcleos). Consulte as versões compatíveis de TPU para saber os tamanhos de TPU compatíveis.
  • GCS_MODEL_DIR é 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.
  • 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.

Dispositivo TPU

(vm)$ export STORAGE_BUCKET=gs://[YOUR_BUCKET_NAME]; \
export ACCELERATOR_TYPE=[YOUR_ACCELERATOR_TYPE]
    
(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
    

Pod de TPU

(vm)$ export STORAGE_BUCKET=gs://[YOUR_BUCKET_NAME]; \
export ACCELERATOR_TYPE=[YOUR_ACCELERATOR_TYPE]
    
(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 /usr/share/tpu/tools/datasets/download_and_preprocess_coco.sh.

(vm)$ cd /usr/share/tpu/tools/datasets && \
sudo 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.

(vm)$ cd /usr/share/ && 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_file="/usr/share/tpu/models/official/mask_rcnn/cloud/config/${ACCELERATOR_TYPE}.yaml" \
--params_override="checkpoint=${CHECKPOINT},training_file_pattern=${PATH_GCS_MASKRCNN:?}/train-*,validation_file_pattern=${PATH_GCS_MASKRCNN:?}/val-*,val_json_file=${PATH_GCS_MASKRCNN:?}/instances_val2017.json"

Pod de 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)$ cd /usr/share/ && python tpu/models/official/mask_rcnn/mask_rcnn_main.py \
    --use_tpu=True \
    --tpu=${TPU_NAME} \
    --iterations_per_loop=500 \
    --model_dir=${GCS_MODEL_DIR} \
    --num_cores=128 \
    --mode=train \
    --config_file="/usr/share/tpu/models/official/mask_rcnn/cloud/config/${ACCELERATOR_TYPE}.yaml" \
    --params_override="checkpoint=${CHECKPOINT},training_file_pattern=${PATH_GCS_MASKRCNN:?}/train-*,validation_file_pattern=${PATH_GCS_MASKRCNN:?}/val-*,val_json_file=${PATH_GCS_MASKRCNN:?}/instances_val2017.json"
    
  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. 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'
    
  6. Inicie a avaliação.

    (vm)$ cd /usr/share/ && python tpu/models/official/mask_rcnn/mask_rcnn_main.py \
    --use_tpu=True \
    --tpu=mask-rcnn-eval \
    --iterations_per_loop=500 \
    --mode=eval \
    --model_dir=${GCS_MODEL_DIR} \
    --config_file="/usr/share/tpu/models/official/mask_rcnn/cloud/config/v3-8.yaml" \
    --params_override="checkpoint=${CHECKPOINT},training_file_pattern=${PATH_GCS_MASKRCNN}/train-*,val_json_file=${PATH_GCS_MASKRCNN}/instances_val2017.json,validation_file_pattern=${PATH_GCS_MASKRCNN}/val-*,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,total_steps=11250,train_batch_size=512,warmup_steps=1864"
    

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 da 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…