Como treinar o EfficientNet no Cloud TPU (TF 2.x)


Neste tutorial, mostramos como treinar um modelo do Keras EfficientNet no Cloud TPU usando tf.distribute.TPUStrategy.

Se você não estiver familiarizado com o Cloud TPU, é altamente recomendável confira o guia de início rápido para aprender a criar um Cloud TPU e VM do Compute Engine.

Objetivos

  • Criar um bucket do Cloud Storage para armazenar o conjunto de dados e a saída do modelo.
  • Preparar um conjunto de dados ImageNet fictício que seja semelhante ao conjunto de dados do ImageNet.
  • Executar o job de treinamento.
  • Verificar os resultados da saída.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

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

  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. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  6. Este tutorial usa componentes faturáveis do Google Cloud. Consulte a página de preços da Cloud TPU para fazer uma estimativa dos custos. Não se esqueça de limpar os recursos de VM da TPU criados. quando terminar de usá-las, para evitar cobranças desnecessárias.

Treinamento de dispositivo único do Cloud TPU

Esta seção descreve como configurar recursos do Cloud TPU e treinar o modelo EfficientNet usando um único dispositivo do Cloud TPU.

  1. Abra uma janela do Cloud Shell.

    Abrir o Cloud Shell

  2. Crie uma variável para o ID do seu projeto.

    export PROJECT_ID=project-id
  3. Configurar a CLI do Google Cloud para usar o projeto em que você quer criar Cloud TPU:

    gcloud config set project ${PROJECT_ID}

    Na primeira vez que você executar esse comando em uma nova VM do Cloud Shell, será exibida uma página Authorize Cloud Shell. Clique em Authorize na parte de baixo da página para permitir que gcloud faça chamadas de API com suas credenciais.

    Para mais informações sobre o comando gcloud, consulte a Referência da gcloud.

  4. Crie uma conta de serviço para o projeto da Cloud TPU.

    As contas de serviço permitem que o serviço do Cloud TPU acesse outros serviços do Google Cloud.

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID

    O comando retorna uma conta de serviço do Cloud TPU com o formato a seguir:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. Exportar variáveis de configuração da TPU

    Defina a zona em que você treinará o modelo e armazenará todos os dados relacionados ao treinamento.

    $ export ZONE=europe-west4-a
  6. Crie um bucket do Cloud Storage usando o seguinte comando:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4

    Esse bucket do Cloud Storage armazena os dados usados para treinar o modelo e os resultados do treinamento. Use o comando gcloud compute tpus tpu-vm para configurar permissões padrão para a conta de serviço do Cloud TPU configurada na etapa anterior. Caso queira permissões mais específicas, consulte as permissões de nível de acesso.

    O local do bucket precisa estar na mesma região que o Compute Engine (VM) e o nó da Cloud TPU.

  7. Preparar o conjunto de dados ou usar fake_imagenet

    O ImageNet é um banco de dados de imagens. As imagens do banco de dados são organizadas hierarquicamente, com cada nó da hierarquia representado por centenas e milhares de imagens.

    Neste tutorial, usamos uma versão de demonstração do conjunto de dados completo do ImageNet, conhecido como fake_imagenet. Essa versão de demonstração permite testar o tutorial e, ao mesmo tempo, reduzir os requisitos de tempo e armazenamento normalmente associados à execução de um modelo com base no conjunto de dados completo do ImageNet.

    O conjunto de dados do fake_imagenet está neste local no Cloud Storage:

    gs://cloud-tpu-test-datasets/fake_imagenet

    O conjunto de dados do fake_imagenet é útil apenas para entender como usar um Cloud TPU e validar o desempenho de ponta a ponta. Os números de acurácia e o modelo salvo não são importantes.

    Se você quiser usar o conjunto de dados completo do ImageNet, consulte Como fazer o download, o pré-processamento e o upload do conjunto de dados do ImageNet.

  8. Inicie os recursos de TPU usando o comando gcloud.

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

    Descrições de sinalizações de comando

    zone
    A zona em que você planeja criar a Cloud TPU.
    accelerator-type
    O tipo de acelerador especifica a versão e o tamanho do Cloud TPU que você quer criar. Para mais informações sobre os tipos de aceleradores compatíveis com cada versão de TPU, consulte Versões de TPU.
    version
    A versão do software do Cloud TPU.

    Para mais informações sobre o comando gcloud, consulte a Referência da gcloud.

  9. Conecte-se à instância do Compute Engine usando SSH. Quando você está conectado à VM, o prompt do shell muda de username@projectname para username@vm-name:

    gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=${ZONE}
  10. Defina a variável de nome da Cloud TPU.

    (vm)$ export TPU_NAME=local
  11. Definir variáveis de bucket do Cloud Storage

    Substitua bucket-name pelo nome do seu intervalo do Cloud Storage:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x
    (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet

    O aplicativo de treinamento precisa que os dados de treinamento sejam acessíveis no Cloud Storage. Ele também usa o bucket do Cloud Storage para armazenar checkpoints durante o treinamento.

  12. Ao criar sua TPU, se você definir o parâmetro --version como uma versão que termina com -pjrt, defina as seguintes variáveis de ambiente para ativar o ambiente de execução PJRT:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
  13. Instale os requisitos do TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  14. O script de treinamento do EfficientNet requer pacotes extras. Instale-os agora:

    (vm)$ sudo pip3 install tensorflow-addons
    (vm)$ sudo pip3 install tensorflow-model-optimization>=0.1.3
  15. Defina algumas variáveis de ambiente obrigatórias:

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"

    O modelo EfficientNet vem pré-instalado na VM do Cloud TPU.

  16. Mude para o diretório que armazena o modelo:

    (vm)$ cd /usr/share/tpu/models/official/legacy/image_classification
  17. Treine o modelo. Ele usa um conjunto de dados false_imagenet e treina o EfficientNet por uma época.

    (vm)$ python3 classifier_trainer.py \
      --mode=train_and_eval \
      --model_type=efficientnet \
      --dataset=imagenet \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
      --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"

    Descrições de sinalizações de comando

    mode
    Um de train, eval ou train_and_eval.
    model_type
    O tipo do modelo. Por exemplo, efficientnet.
    dataset
    O nome do conjunto de dados. Por exemplo, imagenet.
    tpu
    O nome do Cloud TPU para executar treinamento ou avaliação.
    data_dir
    Especifica o caminho do Cloud Storage para a entrada de treinamento. Ele está definido como no conjunto de dados fake_imagenet do exemplo.
    model_dir
    O caminho do Cloud Storage em que os checkpoints e resumos são armazenados durante treinamento de modelo. É possível reutilizar uma pasta atual para carregar checkpoints gerados anteriormente e armazenar outros checkpoints, desde que os anteriores tenham sido criados usando um Cloud TPU do mesmo tamanho e versão do TensorFlow.
    config_file
    O caminho para o arquivo json que contém o EfficientNet pré-treinado um modelo de machine learning. Esse arquivo contém a arquitetura do modelo.
    params_override
    Uma string JSON que modifica parâmetros de script padrão. Para mais informações sobre parâmetros de script, consulte /usr/share/models/official/legacy/detection/main.py.

    Isso vai treinar o EfficientNet por 1 período e concluir em um modelo v3-8 nó do Cloud TPU em aproximadamente 40 minutos. Quando o script de treinamento for concluído, uma saída semelhante a esta será exibida:

    Run stats:
    {
      'accuracy_top_1': 0.0010172526817768812,
      'eval_loss': 7.104171276092529,
      'loss': 7.113735675811768,
      'training_accuracy_top_1': 0.0009773431811481714,
      'step_timestamp_log': [
        'BatchTimestamp<batch_index: 0,
        timestamp: 1604960724.2224622>',
        'BatchTimestamp<batch_index: 1251,
        timestamp: 1604961281.3745298>'
      ],
      'train_finish_time': 1604961342.6359076,
      'avg_exp_per_second': 2071.493269569079
    }
    

    Para treinar o EfficientNet para convergência no conjunto de dados do ImageNet, execute-o 90 períodos, conforme mostrado no script a seguir. O treinamento e a avaliação são feitos juntos. Cada época tem 1.251 etapas para um total de 112.590 etapas de treinamento e 48 etapas de avaliação.

    (vm)$ python3 classifier_trainer.py \
         --mode=train_and_eval \
         --model_type=efficientnet \
         --dataset=imagenet \
         --tpu=${TPU_NAME} \
         --data_dir=${DATA_DIR} \
         --model_dir=${MODEL_DIR} \
         --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
         --params_override="train_dataset.builder=records, validation_dataset.builder=records"

    Descrições de sinalizações de comando

    mode
    Um de train, eval ou train_and_eval.
    model_type
    O tipo do modelo. Por exemplo, efficientnet.
    dataset
    O nome do conjunto de dados. Por exemplo, imagenet.
    tpu
    O nome do Cloud TPU para executar treinamento ou avaliação.
    data_dir
    Especifica o caminho do Cloud Storage para a entrada de treinamento. Ele está definido como no conjunto de dados fake_imagenet do exemplo.
    model_dir
    O caminho do Cloud Storage em que os checkpoints e resumos são armazenados durante treinamento de modelo. Você pode reutilizar uma pasta existente para carregar pontos de verificação gerados anteriormente e armazenar novos pontos desde que os checkpoints anteriores tenham sido criados usando uma Cloud TPU do mesmo tamanho e versão do TensorFlow.
    config_file
    O caminho para o arquivo JSON que contém o modelo EfficientNet pré-treinado. Esse arquivo contém a arquitetura do modelo.
    params_override
    Uma string JSON que modifica parâmetros de script padrão. Para mais informações sobre parâmetros de script, consulte /usr/share/models/official/legacy/detection/main.py:

    Como o treinamento foi feito no conjunto de dados fake_imagenet, a saída os resultados não refletem as saídas reais que apareceriam se o treinamento fosse em um conjunto de dados real.

    Você concluiu o treinamento para dispositivos únicos. Siga estas etapas para exclua os recursos atuais de TPU de dispositivo único.

  18. Desconecte-se da instância do Compute Engine:

    (vm)$ exit

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

  19. Exclua o recurso da TPU.

    $ gcloud compute tpus tpu-vm delete efficientnet-tutorial \
     --zone=${ZONE}

    Descrições de sinalizações de comando

    zone
    A zona em que o Cloud TPU reside.

Neste ponto, é possível concluir este tutorial e limpar ou continuar executando o modelo nos Pods do Cloud TPU.

Escalone seu modelo com os pods da Cloud TPU

O treinamento do modelo em pods da Cloud TPU pode exigir algumas mudanças no script de treinamento. Para mais informações, consulte Treinamento em pods de TPU.

Treinamento de pod do Cloud TPU

Nesta seção, você verá informações sobre como configurar um bucket do Cloud Storage e recursos do Cloud TPU para treinamento de Pod.

  1. Abra uma janela do Cloud Shell.

    Abrir o Cloud Shell

  2. Crie uma variável para o ID do seu projeto.

    export PROJECT_ID=project-id
  3. Configurar a CLI do Google Cloud para usar o projeto em que você quer criar Cloud TPU:

    gcloud config set project ${PROJECT_ID}

    Na primeira vez que você executar esse comando em uma nova VM do Cloud Shell, será exibida uma página Authorize Cloud Shell. Clique em Authorize na parte de baixo da página para permitir que gcloud faça chamadas de API do Google Cloud com suas credenciais.

  4. Crie uma conta de serviço para o projeto da Cloud TPU.

    As contas de serviço permitem que o serviço do Cloud TPU acesse outros serviços do Google Cloud.

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID

    O comando retorna uma conta de serviço do Cloud TPU com o formato a seguir:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. Crie um bucket do Cloud Storage usando o comando a seguir ou use um bucket criado anteriormente para o projeto:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4

    Esse bucket do Cloud Storage armazena os dados usados para treinar o modelo e os resultados do treinamento. O comando gcloud usado neste tutorial configura permissões padrão para a conta de serviço do Cloud TPU configurada na etapa anterior. Caso queira permissões mais específicas, consulte as permissões de nível de acesso.

    O local do bucket precisa estar na mesma região que a VM da TPU.

  6. Exportar variáveis de configuração da TPU

    Defina a zona em que você treinará o modelo e armazenará todos os dados relacionados ao treinamento.

    $ export ZONE=europe-west4-a

  7. Prepare your dataset or use fake_imagenet

    ImageNet is an image database. The images in the database are organized into a hierarchy, with each node of the hierarchy depicted by hundreds and thousands of images.

    The default Pod training accesses a demonstration version of the full ImageNet dataset, referred to as fake_imagenet. This demonstration version allows you to test Pod training, while reducing the storage and time requirements typically associated with training a model against the full ImageNet database.

    The fake_imagenet dataset is only useful for understanding how to use a Cloud TPU and validating end-to-end performance. The accuracy numbers and saved model will not be meaningful.

    If you want to use the full ImageNet dataset, see Downloading, preprocessing, and uploading the ImageNet dataset.

  8. Launch your Cloud TPU resources using the gcloud command.

    For more information on the gcloud command, see the gcloud Reference. This tutorial specifies a v3-32 Pod. For other Pod options, see the available TPU types page.

    This tutorial specifies a v3-32 Pod. For other Pod options, see the available TPU types page.

    $ gcloud compute tpus tpu-vm create efficientnet-tutorial \
     --zone=${ZONE} \
     --accelerator-type=v3-32 \
     --version=tpu-vm-tf-2.17.0-pod-pjrt

    Descrições de sinalizações de comando

    zone
    A zona em que você planeja criar a Cloud TPU.
    accelerator-type
    O tipo de acelerador especifica a versão e o tamanho do Cloud TPU que você quer criar. Para mais informações sobre os tipos de aceleradores compatíveis com cada versão de TPU, consulte versões de TPU.
    version
    A versão do software do Cloud TPU.
  9. Conecte-se à instância do Compute Engine usando SSH. Quando você está conectado à VM, o prompt do shell muda de username@projectname para username@vm-name:

    gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=europe-west4-a
  10. Exporte as variáveis de configuração da TPU:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export TPU_NAME=efficientnet-tutorial
    (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x-pod

    O aplicativo de treinamento precisa que os dados de treinamento sejam acessíveis no Cloud Storage. Ele também usa o bucket do Cloud Storage para armazenar checkpoints durante o treinamento.

  11. Instale os requisitos do TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  12. Defina algumas variáveis de ambiente obrigatórias:

    (vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}"
    (vm)$ export TPU_LOAD_LIBRARY=0
  13. Mude para o diretório que armazena o modelo:

    (vm)$ cd /usr/share/tpu/models/official/legacy/image_classification/
  14. Treine o modelo.

    (vm)$ python3 classifier_trainer.py \
    --mode=train_and_eval \
    --model_type=efficientnet \
    --dataset=imagenet \
    --tpu=${TPU_NAME} \
    --data_dir=${DATA_DIR} \
    --model_dir=${MODEL_DIR} \
    --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
    --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"

    Descrições de sinalizações de comando

    mode
    Quando definido como train_and_eval, esse script treina e avalia o modelo. Quando definido como export_only, este script exporta um modelo salvo.
    model_type
    O tipo do modelo. Por exemplo, efficientnet.
    dataset
    O nome do conjunto de dados. Por exemplo, imagenet.
    tpu
    Usa o nome especificado na variável TPU_NAME.
    data_dir
    Especifica o caminho do Cloud Storage para a entrada de treinamento. Neste exemplo, ele está definido como o conjunto de dados fake_imagenet.
    model_dir
    O caminho do Cloud Storage em que os checkpoints e resumos são armazenados durante treinamento de modelo. Você pode reutilizar uma pasta existente para carregar anteriormente gerados e armazenar pontos de verificação adicionais, desde que checkpoints anteriores foram criados usando um Cloud TPU da mesmo tamanho e versão do TensorFlow.
    config_file
    O caminho para o arquivo json que contém o EfficientNet pré-treinado um modelo de machine learning. Esse arquivo contém a arquitetura do modelo.
    params_override
    Uma string JSON que modifica parâmetros de script padrão. Para mais informações sobre parâmetros de script, consulte /usr/share/models/official/legacy/detection/main.py.

O procedimento treina o modelo no conjunto de dados fake_imagenet para uma época (total de 312 etapas de treinamento e 12 etapas de avaliação). O treinamento leva aproximadamente dois minutos em uma Cloud TPU v3-32. Quando os processos de treinamento e avaliação for concluída, uma mensagem semelhante a esta será exibida:

Run stats:
{
  'accuracy_top_1': 0.0009969075908884406,
  'eval_loss': 7.105168342590332,
  'loss': 7.114983081817627,
  'training_accuracy_top_1': 0.0010031675919890404,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1605041621.4997303>',
    'BatchTimestamp<batch_index: 312,
    timestamp: 1605041970.8633356>'
  ],
  'train_finish_time': 1605042032.2274444,
  'avg_exp_per_second': 3111.5120716536226
}

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.

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

    (vm)$ exit

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

  2. Exclua os recursos do Cloud TPU e do Compute Engine.

    $ gcloud compute tpus tpu-vm delete efficientnet-tutorial \
    --zone=${ZONE}
  3. Execute gcloud compute tpus execution-groups list para verificar se os recursos foram excluídos. A exclusão pode levar vários minutos. A saída do comando a seguir não deve incluir nenhum dos recursos de TPU criados neste tutorial:

    $ gcloud compute tpus execution-groups list --zone=${ZONE}
  4. Exclua o bucket do Cloud Storage usando a CLI gcloud, conforme mostrado no exemplo a seguir. Substitua bucket-name pelo nome do bucket do Cloud Storage.

    $ gcloud storage rm gs://bucket-name --recursive

A seguir

Geralmente, os tutoriais do Cloud TPU do TensorFlow treinam o modelo usando um conjunto de dados de amostra. Os resultados desse treinamento não são utilizáveis para inferência. Para usar um modelo para inferência, é possível treinar os dados em um conjunto de dados disponível publicamente ou no seu próprio conjunto de dados. Modelos do TensorFlow treinados em Cloud TPUs geralmente exigem que os conjuntos de dados estejam TFRecord.

Use a amostra da ferramenta de conversão de conjunto de dados para converter um conjunto de dados de classificação de imagem no formato TFRecord. Se você não estiver usando uma imagem modelo de classificação, você terá que converter seu conjunto de dados para Formato do TFRecord você mesmo. Para mais informações, consulte TFRecord e tf.Example.

Ajuste de hiperparâmetros

Para melhorar a performance do modelo com seu conjunto de dados, ajuste os hiperparâmetros. É possível encontrar informações sobre hiperparâmetros comuns a todos Modelos com suporte a TPU em GitHub. As informações sobre hiperparâmetros específicos do modelo podem ser encontradas na fonte para cada um modelo de machine learning. Para mais informações sobre o ajuste de hiperparâmetros, consulte Visão geral do ajuste de hiperparâmetros e Ajustar hiperparâmetros.

Inferência

Depois de treinar seu modelo, você pode usá-lo para inferência (também chamado de previsão). Você pode usar a ferramenta de conversão de inferência da Cloud TPU para preparar e otimizar um modelo do TensorFlow para inferência na Cloud TPU v5e. Para mais informações sobre a inferência no Cloud TPU v5e, consulte Introdução à inferência do Cloud TPU v5e.

  • Saiba como treinar e avaliar usando seus dados no lugar dos conjuntos de dados false_imagenet ou ImageNet seguindo o tutorial de conversão do conjunto de dados. O tutorial explica como usar o conversor de dados de classificação de imagens exemplo de script para converter um conjunto de dados bruto para classificação de imagem em TFRecords utilizáveis por modelos do TensorFlow do Cloud TPU.

  • Execute um colab da Cloud TPU que demonstra como executar um modelo de classificação de imagem usando seus próprios dados de imagem.

  • Explore os outros tutoriais da Cloud TPU.

  • Aprenda a usar as ferramentas de monitoramento de TPU no TensorBoard.