Como treinar o EfficientNet no Cloud TPU

Neste tutorial, você verá como treinar o modelo Tensorflow EfficientNet usando um dispositivo Cloud TPU ou uma fração do pod do Cloud TPU (vários dispositivos TPU). Os modelos EfficientNet são uma família de modelos de classificação de imagens com precisão de última geração, além de serem menores e mais rápidos do que outros modelos.

Descrição do modelo

O modelo neste tutorial é baseado em EfficientNet: repensando o escalonamento de modelos para redes neurais convolucionais (em inglês). Ele usa duas variantes em especial: efficientnet-b0 e efficientnet-b3. O tutorial demonstra o treinamento do modelo usando a TPUEstimator (em inglês).

Como configurar o projeto

Antes de iniciar este tutorial, verifique se o projeto do Google Cloud Platform está configurado corretamente ou configure um novo.

  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 

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 de 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-32 --disk-size-gb=500 --machine-type n1-standard-8 --preemptible

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.

Como exportar o intervalo de armazenamento

Para especificar um intervalo de armazenamento para armazenar checkpoints durante o treinamento e gravar os registros dele, configure a variável de ambiente STORAGE_BUCKET, substituindo YOUR-BUCKET-NAME pelo nome do intervalo do Cloud Storage:

(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME

O aplicativo de treinamento precisa que os dados de treinamento sejam acessíveis no Cloud Storage.

Como configurar o TensorBoard (opcional)

No TensorBoard, há um conjunto de ferramentas projetadas para apresentar visualmente os dados do TensorFlow. Quando o TensorBoard é usado para monitoramento, é possível identificar gargalos no processamento e receber sugestões para melhorar o desempenho.

Caso não seja necessário monitorar a saída do modelo no momento, ignore as etapas de configuração do TensorBoard.

Caso queira monitorar a saída e o desempenho do modelo, siga o guia para configurar o TensorBoard.

Como executar o modelo EfficientNet com fake_imagenet

Nas etapas a seguir, o prefixo (vm)$ significa que você precisa executar o comando na VM do Compute Engine:

  1. Adicione a pasta de nível superior /models ao caminho do Python com o comando

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  2. Navegue até o diretório.

    (vm)$ cd /usr/share/tpu/models/official/efficientnet/
    
  3. Execute o script de treinamento para um único dispositivo do Compute Engine ou Pod da seguinte forma:

Dispositivo TPU

Usando o modelo efficientnet-b0 como exemplo, executamos o treinamento em uma instância do TPU v2 com oito núcleos.

(vm)$ python main.py \
  --tpu=${TPU_NAME} \
  --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
  --model_dir=${STORAGE_BUCKET}/efficientnet-b0-v2-8 \
  --model_name='efficientnet-b0' \
  --skip_host_call=true \
  --train_batch_size=2048 \
  --train_steps=218948
  • --tpu especifica o nome da TPU. Observe que ctpu passa esse nome para a VM do Compute Engine como uma variável de ambiente (TPU_NAME).
  • --data_dir especifica o caminho do Cloud Storage para a entrada do treinamento.
  • --model_dir especifica o diretório em que os checkpoints e resumos são armazenados durante o treinamento de modelo. Se a pasta não existir, o programa criará uma. Ao usar um Cloud TPU, o model_dir precisa ser um caminho do Cloud Storage (gs://...). É possível reutilizar uma pasta atual para carregar os dados do ponto de verificação atual e armazenar os novos.

Para um único dispositivo do Cloud TPU, o procedimento treina o modelo EfficientNet (variante efficientnet-b0) por 350 períodos e avalia cada número fixo de etapas. Usando as sinalizações especificadas, o modelo é treinado em cerca de 23 horas. Com dados reais do imagenet, as configurações precisam ter aproximadamente 76,5% de precisão no primeiro nível do conjunto de dados de validação do ImageNet. O melhor ponto de verificação do modelo e o resultado da avaliação correspondente estão dentro da pasta archive no diretório do modelo: ${STORAGE_BUCKET}/efficientnet-b0-v2-8/archive.

Pod de TPU

Usando o modelo efficientnet-b3 como exemplo, executamos o treinamento em uma parte do pod do TPU v3 com 32 núcleos.

(vm)$ python main.py \
  --tpu=${TPU_NAME} \
  --data_dir=gs://cloud-tpu-test-datasets/fake_imagenet \
  --model_dir=${STORAGE_BUCKET}/efficientnet-b3-v3-32 \
  --model_name='efficientnet-b3' \
  --skip_host_call=true \
  --mode=train \
  --train_steps=109474 \
  --train_batch_size=4096 \
  --iterations_per_loop=100
  • --tpu especifica o nome da TPU. Observe que ctpu passa esse nome para a VM do Compute Engine como uma variável de ambiente (TPU_NAME).
  • --data_dir especifica o caminho do Cloud Storage para a entrada do treinamento.
  • --model_dir especifica o diretório em que os checkpoints e resumos são armazenados durante o treinamento de modelo. Se a pasta não existir, o programa criará uma. Ao usar um Cloud TPU, o model_dir precisa ser um caminho do Cloud Storage (gs://...). É possível reutilizar uma pasta atual para carregar os dados do ponto de verificação atual e armazenar os novos.

O procedimento treina o modelo EfficientNet (variante efficientnet-b3) por 350 períodos. O modelo precisa ter 81,1% de acurácia no conjunto de desenvolvimento do ImageNet, o que deve terminar em cerca de 20 horas. O melhor ponto de verificação do modelo e o resultado da avaliação correspondente estão dentro da pasta archive no diretório do modelo: ${STORAGE_BUCKET}/efficientnet-b3-v3-32/archive.

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

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

Enviar comentários sobre…