Como treinar o Mask RCNN na Cloud TPU

Visão geral

Neste tutorial, você verá como executar o modelo Mask RCNN usando a Cloud TPU com o conjunto de dados COCO (em inglês).

Mask RCNN é uma rede neural profunda projetada para abordar a detecção de objetos e a segmentação de imagens, um dos desafios mais difíceis da visão computacional.

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

Neste tutorial, tf.contrib.tpu.TPUEstimator (em inglês) é usado para treinar o modelo. A API TPUEstimator é uma API do TensorFlow de alto nível e é recomendada para criar e executar um modelo de machine learning na Cloud TPU. A API simplifica o processo de desenvolvimento do modelo ao ocultar a maior parte da implementação de nível baixo. Isso facilita a alternância entre a TPU e outras plataformas, como GPU ou CPU.

Antes de começar

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

Se você planeja treinar em uma fração do pod da TPU, veja como realizar o treinamento em pods de TPU para entender as alterações de parâmetros necessárias para frações de pod.

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

Objetivos

  • Criar um intervalo do Cloud Storage para armazenar o conjunto de dados e a saída do modelo.
  • Preparar o conjunto de dados COCO
  • Configurar uma VM do Compute Engine e um nó da Cloud TPU para treinamento e avaliação
  • Executar treinamento e avaliação em uma única Cloud TPU ou um pod da Cloud TPU

Custos

Neste tutorial, há componentes faturáveis do Google Cloud Platform, entre eles:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Use a calculadora de preços para gerar uma estimativa de custos baseada na projeção de uso. Os novos usuários do GCP podem estar qualificados para uma avaliação gratuita.

Antes de começar

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

  1. Abra uma janela do Cloud Shell.

    Abrir o Cloud Shell

  2. Crie uma variável para o nome do projeto.

        export PROJECT_NAME=your-project_name
    
  3. Configure a ferramenta de linha de comando da gcloud para usar o projeto em que a Cloud TPU será criada.

        gcloud config set project ${PROJECT_NAME}
    
  4. Crie um intervalo do Cloud Storage usando o seguinte comando:

        gsutil mb -p ${PROJECT_NAME} -c standard -l europe-west4 -b on gs://your-bucket-name
    

    Esse intervalo do Cloud Storage armazena os dados usados para treinar o modelo e os resultados do treinamento.

    A VM do Compute Engine, o nó da Cloud TPU e o intervalo do Cloud Storage precisam estar todos localizados na mesma região.

  5. Inicie uma VM do Compute Engine usando o comando ctpu up.

    $ ctpu up --vm-only --machine-type=n1-standard-8 --zone=europe-west4-a
    

    Após executar o ctpu up, uma mensagem será exibida mostrando a configuração proposta e você precisará confirmar a configuração:

    OK to create your Cloud TPU resources with the above configuration? [Yn]:
  6. Pressione y para criar a VM do Compute Engine.

    Quando o comando ctpu up terminar a execução, verifique se o prompt do shell foi alterado de username@project para username@tpuname. Essa alteração mostra que você fez login na VM do Compute Engine.

    Caso não esteja conectado à instância do Compute Engine, execute o seguinte comando:

        gcloud compute ssh username --zone=europe-west4-a
    

Ao seguir essas instruções, execute cada comando iniciado por (vm)$ na janela de sessão da VM.

Prepare os dados

  1. Execute o script download_and_preprocess_coco.sh para converter o conjunto de dados COCO em um conjunto de TFRecords (*.tfrecord) esperado pelo aplicativo de treinamento.

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

    Isso instala as bibliotecas necessárias e executa o script de pré-processamento. Ele gera uma série de arquivos *.tfrecord no diretório de dados locais. O script de download e conversão do COCO leva aproximadamente 1 hora para ser concluído.

  2. Copie os dados para o intervalo do Cloud Storage

    Depois de converter os dados para TFRecords, use o comando gsutil para copiá-los do armazenamento local para o intervalo do Cloud Storage. Também é preciso copiar os arquivos de anotação. Eles ajudam a validar o desempenho do modelo.

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

Configure e inicie a Cloud TPU

O treinamento é executado em 22.500 etapas e leva aproximadamente 5 horas em um nó da TPU v2-8 e cerca de 3 horas e meia em um nó da TPU v3-8.

  1. Execute o comando a seguir para criar a Cloud TPU.

    (vm)$ ctpu up --tpu-only --tpu-size=v3-8 --zone=europe-west4-a
    
    Parâmetro Descrição
    tpu-size Especifica o tamanho da Cloud TPU. Neste tutorial, é usado um tamanho de TPU v3-8 para o treinamento e a avaliação de um único dispositivo.
    zone A zona em que você planeja criar a Cloud TPU. Ela precisa ser a mesma zona usada para a VM do Compute Engine. Por exemplo, europe-west4-a.

    Depois de executar o ctpu up para iniciar a Cloud TPU, será exibida uma mensagem mostrando a configuração proposta, incluindo a VM do Compute Engine. Será preciso confirmar a configuração:

    OK to create your Cloud TPU resources with the above configuration? [Yn]:
  2. Pressione y para criar a Cloud TPU. Levará alguns minutos para que ela seja criada.

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 --user Cython matplotlib opencv-python-headless pyyaml Pillow && \
          pip install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI' && \
          pip install --user -U gast==0.2.2

Atualizar os valores de sinal de atividade da conexão da VM

Para este tutorial, é necessária 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=120 \
       net.ipv4.tcp_keepalive_intvl=120 \
       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 o modelo.

As variáveis que precisam ser definidas são descritas na tabela a seguir:

Parâmetro Descrição
STORAGE_BUCKET Esse é o nome do intervalo do Cloud Storage criado na seção Antes de começar.
TPU_NAME Esse é o nome da VM do Compute Engine e da Cloud TPU. A VM do Compute Engine e o nome da Cloud TPU precisam ser os mesmos. Como a VM do Compute Engine foi definida com o valor padrão, o nome de usuário, defina a Cloud TPU com o mesmo valor.
ACCELERATOR_TYPE Essa é a versão do acelerador e o número de núcleos a serem usados, por exemplo, v2-128 (128 núcleos). Neste tutorial, será usado um tipo de TPU v3-8 ao treinar em um único dispositivo TPU.
GCS_MODEL_DIR Esse é o diretório que contém os arquivos de modelo. Ele usa uma pasta no intervalo do Cloud Storage. Não é preciso criar essa pasta antecipadamente. Caso ela ainda não exista, o script a criará.
CHECKPOINT Essa variável especifica um checkpoint pré-treinado. O modelo Mask RCNN requer um modelo de classificação de imagens pré-treinado, como o ReNset, para ser usado como uma rede de backbone. Neste tutorial, é usado um checkpoint pré-treinado criado com o modelo de demonstração ResNet. Também é possível treinar o próprio modelo ResNet e especificar um checkpoint no diretório dele.
PATH_GCS_MASKRCNN Esse é o endereço do intervalo do Cloud Storage em que os artefatos do treinamento de modelo serão armazenados. Assim como na variável GCS_MODEL_DIR, este tutorial usa uma pasta no intervalo do Cloud Storage.
Use o comando export para definir essas variáveis.

(vm)$ export STORAGE_BUCKET=gs://your-bucket-name
(vm)$ export TPU_NAME=username
(vm)$ export ACCELERATOR_TYPE=v3-8
(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

Executar o treinamento e a avaliação

Agora, está tudo pronto para executar o modelo nos dados de COCO pré-processados. Para executar o modelo, use o script mask_rcnn_main.py.

  1. Primeiro, adicione a pasta de nível superior /models ao caminho do Python com o comando:

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  2. Execute o seguinte comando para executar o treinamento e a avaliação.

    (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/configs/cloud/${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"
    

A partir daqui, é possível concluir este tutorial e limpar os recursos do GCP ou explorar a execução do modelo em um pod da Cloud TPU.

Como escalonar o modelo com os pods da Cloud TPU

Para resultados mais rápidos, escalone o modelo com os pods da Cloud TPU. O modelo Mask RCNN totalmente compatível pode funcionar com as seguintes frações de pod:

  • v2-32
  • v3-32

Ao trabalhar com pods da Cloud TPU, primeiro treine o modelo usando um pod e, em seguida, use um único dispositivo da Cloud TPU para avaliá-lo.

Como treinar com pods da Cloud TPU

O treinamento é executado em 11.250 passos e leva aproximadamente duas horas em um nó de TPU v3-32.

  1. Exclua o recurso da Cloud TPU criado para treinar o modelo em um único dispositivo da Cloud TPU.

    (vm)$ ctpu delete --tpu-only --zone=europe-west4-a
  2. Execute o comando ctpu up, usando o parâmetro tpu-size para especificar a fração de pod a ser usada. Por exemplo, o comando a seguir usa uma fração de pod v2-32.

    (vm)$ ctpu up --tpu-only --tpu-size=v3-32 --zone=europe-west4-a
    
  3. Instale os pacotes extras necessários para o Mask RCNN.

    (vm)$ sudo apt-get install -y python-tk && \
          pip install --user Cython matplotlib opencv-python-headless pyyaml Pillow && \
          pip install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI' && \
          pip install --user -U gast==0.2.2
    
  4. Atualize os valores de sinal de atividade da conexão da VM

    Para este tutorial, é necessária 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=120 \
       net.ipv4.tcp_keepalive_intvl=120 \
       net.ipv4.tcp_keepalive_probes=5
    
  5. Defina as variáveis necessárias para o treinamento em um pod. Use o comando export para criar diversas variáveis bash e usá-las em uma string de configuração.

    (vm)$ export STORAGE_BUCKET=gs://your-bucket-name
    (vm)$ export TPU_NAME=username
    (vm)$ export ACCELERATOR_TYPE=v3-32
    
    (vm)$ export GCS_MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-pod \
          export CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603 \
          export PATH_GCS_MASKRCNN=${STORAGE_BUCKET}/coco
    
  6. Adicione a pasta de nível superior /models ao caminho do Python.

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  7. 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=32 \
          --mode=train \
          --config_file="/usr/share/tpu/models/official/mask_rcnn/configs/cloud/${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"
    

Como avaliar o modelo

Nesta etapa, use um único nó da Cloud TPU para avaliar o modelo treinado acima em relação ao conjunto de dados COCO. A avaliação leva cerca de 10 minutos.

  1. Exclua o recurso da Cloud TPU criado para treinar o modelo em um pod.

    (vm)$ ctpu delete --tpu-only --zone=europe-west4-a
  2. Inicie um novo dispositivo de TPU para executar a avaliação.

    (vm)$ ctpu up --tpu-only --tpu-size=v3-8 --zone=europe-west4-a
    
  3. Instale os pacotes necessários para executar a avaliação.

    (vm)$ sudo apt-get install -y python-tk && \
          pip install --user Cython matplotlib opencv-python-headless pyyaml Pillow && \
          pip install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI' \
          pip install --user -U gast==0.2.2
    
  4. Crie as variáveis de ambiente.

      (vm)$ export STORAGE_BUCKET=gs://your-bucket-name
      (vm)$ export TPU_NAME=username
      (vm)$ export ACCELERATOR_TYPE=v3-8
      
      (vm)$ export GCS_MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-pod \
            export CHECKPOINT=gs://cloud-tpu-artifacts/resnet/resnet-nhwc-2018-02-07/model.ckpt-112603 \
            export PATH_GCS_MASKRCNN=${STORAGE_BUCKET}/coco
       
  1. Adicione a pasta de nível superior /models ao caminho do Python.

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  2. Inicie a avaliação.

    (vm)$ cd /usr/share/ && python tpu/models/official/mask_rcnn/mask_rcnn_main.py \
          --use_tpu=True \
          --tpu=${TPU_NAME:?} \
          --iterations_per_loop=500 \
          --mode=eval \
          --model_dir=${GCS_MODEL_DIR} \
          --config_file="/usr/share/tpu/models/official/mask_rcnn/configs/cloud/${ACCELERATOR_TYPE}.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

Para evitar cobranças dos recursos usados neste tutorial na conta do Google Cloud Platform:

Limpe a instância de VM do Compute Engine e os recursos da Cloud TPU.

  1. Desconecte-se da instância do Compute Engine, caso ainda não tenha feito isso:

    (vm)$ exit
    

    Agora, o prompt 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 a Cloud TPU para excluir a VM do Compute Engine e a Cloud TPU:

    $ ctpu delete --zone=europe-west4-a
    
  3. Execute o seguinte comando para verificar se a VM do Compute Engine e a Cloud TPU foram encerradas:

    $ ctpu status --zone=europe-west4-a
    

    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 "europe-west4-a"
    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

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

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.