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. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

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

  4. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  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

Nesta seção, descrevemos como configurar recursos da Cloud TPU e treinar o modelo EfficientNet usando um único dispositivo 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 seguinte formato:

    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. O comando gcloud compute tpus execution-groups 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 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 os tutoriais e reduzir os requisitos de tempo e armazenamento normalmente associados à execução de um modelo com o 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ê estiver conectado para a 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. 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 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 período tem 1251 etapas, totalizando 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 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:

    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 do Cloud TPU

O treinamento do seu modelo em pods da Cloud TPU pode exigir algumas alterações ao 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 seguinte formato:

    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ê estiver conectado para a 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, esse 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. 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 anteriormente gerados e armazenar checkpoints adicionais, desde que o 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 um período (312 total de etapas de treinamento e 12 etapas de avaliação). Esse treinamento leva aproximadamente 2 minutos em um 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 um modelo para inferência, é possível treinar os dados em uma conjunto de dados ou seu próprio conjunto de dados. Modelos do TensorFlow treinados em Cloud TPUs geralmente exigem que os conjuntos de dados estejam TFRecord.

Você pode usar a ferramenta de conversão do conjunto de dados sample para converter uma imagem conjunto de dados de classificação 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 o desempenho do modelo com o conjunto de dados, é possível ajustar a e ajustar 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 a Visão geral do ajuste de hiperparâmetros e Ajuste e ajustar os hiperparâmetros.

Inferência

Depois de treinar seu modelo, você pode usá-lo para inferência (também chamado de previsão). Use o conversor de inferência do Cloud TPU ferramenta para preparar e otimizar Modelo do TensorFlow para inferência no Cloud TPU v5e. Para mais informações sobre inferência no Cloud TPU v5e, consulte Inferência do Cloud TPU v5e introdução.

  • 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 script de exemplo de conversão de dados de classificação de imagem para converter um conjunto de dados brutos para classificação de imagens em TFRecord utilizáveis por modelos do Cloud TPU Tensorflow.

  • 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.