Cloud Bigtable para streaming de dados

O Cloud Bigtable é um sistema de armazenamento estruturado, de baixa latência, escalonável e de linha ampla que pode armazenar e fornecer dados de treinamento para seu modelo de machine learning. Com o Cloud Bigtable, seus dados de treinamento podem ser transmitidos em altíssima velocidade para uso eficiente do Cloud TPU.

Este tutorial mostra como treinar o modelo TensorFlow ResNet-50 no Cloud TPU usando o Cloud Bigtable para hospedar seus dados de treinamento. O processo usa a integração do TensorFlow com o Cloud Bigtable.

Exoneração de responsabilidade

Este tutorial usa um conjunto de dados de terceiros. O Google não oferece declarações, proteções ou outras garantias sobre a validade ou quaisquer outros aspectos desse conjunto de dados.

Requisitos e limitações

Ao definir sua configuração, observe o seguinte:

  • Use a versão 1.11 ou superior do TensorFlow para ter compatibilidade com o Cloud Bigtable.
  • O Cloud Bigtable é recomendado para jobs de treinamento de alto desempenho (dimensão de pod) com quantidades massivas de dados, processando de centenas de gigabytes (GB) a centenas de terabytes (TB), em uma taxa de dezenas a centenas de gigabits por segundo (Gbps). Recomendamos o uso do Cloud Storage para cargas de trabalho que não se encaixem nessa descrição. Observação: também recomendamos o Cloud Bigtable para uso em cargas de trabalho de aprendizado por reforço (RL, na sigla em inglês), em que os dados de treinamento são gerados imediatamente.

Sobre o modelo e os dados

O modelo deste tutorial é baseado no artigo Deep Residual Learning for Image Recognition, que foi o primeiro a apresentar a arquitetura de rede residual ou ResNet. É usada a variante de 50 camadas, conhecida como ResNet-50.

O conjunto de dados de treinamento é o ImageNet, que é uma opção bastante usada para sistemas de treinamento de reconhecimento de imagem.

No tutorial, usamos o TPUEstimator para treinar o modelo. O TPUEstimator é baseado em tf.estimator, uma API TensorFlow de alto nível, e é recomendado para criar e executar um modelo de machine learning no Cloud TPU. O processo de desenvolvimento de modelos é simplificado pela API com a ocultação da maior parte da implementação de nível inferior, o que facilita a alternância entre o Cloud 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.

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

    Acessar a página Gerenciar recursos

  3. Verifique se o faturamento foi ativado para o projeto.

    Saiba como ativar o faturamento

  4. Nestas instruções, estão incluídos componentes faturáveis do GCP. Verifique a página de preços do Cloud TPU para fazer uma estimativa de custos e siga as instruções para limpar os recursos quando não forem mais necessários.

  5. Instale o Cloud SDK, incluindo a ferramenta de linha de comando gcloud.

    Instalar o SDK do Cloud

Criar um intervalo do Cloud Storage

É necessário criar um intervalo do Cloud Storage para armazenar os checkpoints e pesos aprendidos ao treinar seu modelo.

  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 de sua escolha
    • classe de armazenamento padrão: Regional
    • localização: us-central1

Criar uma instância do Cloud Bigtable

Crie uma instância do Cloud Bigtable para transmitir seus dados de treinamento:

  1. Acesse a página do Cloud Bigtable no Console do GCP.

    Acessar a página do Cloud Bigtable

  2. Crie uma instância especificando as opções a seguir:

    • Nome da instância: nome para ajudá-lo a identificar a instância.
    • Código da instância: identificador permanente para a instância.
    • Tipo de instância: selecione Produção para garantir melhor desempenho.
    • Tipo de armazenamento: selecione HDD.
    • Código do cluster: identificador permanente do cluster.
    • Região: selecione uma região. Por exemplo: us-central1. Consulte o guia das regiões e zonas disponíveis para o Cloud TPU.
    • Zona: selecione uma zona. Por exemplo: us-central1-b. Consulte o guia das regiões e zonas disponíveis para o Cloud TPU.

    É possível deixar os outros valores com as configurações padrão. Para saber mais, consulte o guia Como criar uma instância do Cloud Bigtable.

Fazer o download da ferramenta ctpu e configurá-la

Neste guia, usaremos o Serviço de provisionamento do Cloud TPU (ctpu) como uma ferramenta simples para configurar e gerenciar o Cloud TPU. Presumimos que você queira executar o ctpu e o SDK do Cloud localmente, em vez de usar o Cloud Shell. O ambiente do Cloud Shell não é adequado para procedimentos demorados, como o download dos dados do ImageNet, já que o Cloud Shell expira após um período de inatividade.

  1. Siga o guia do ctpu para fazer o download, instalar e configurar o ctpu.

  2. Defina o projeto, a zona e a região para o ambiente da ferramenta gcloud, substituindo YOUR-PROJECT-ID pelo código do projeto do GCP:

    $ gcloud config set project YOUR-PROJECT-ID
    $ gcloud config set compute/region us-central1
    $ gcloud config set compute/zone us-central1-b
    
  3. Para verificar a configuração do ctpu, digite o seguinte no Cloud Shell:

    $ ctpu print-config
    

    Você verá uma mensagem como esta:

    2018/04/29 05:23:03 WARNING: Setting zone to "us-central1-b"
    ctpu configuration:
            name: [your TPU's name]
            project: [your-project-id]
            zone: us-central1-b
    If you would like to change the configuration for a single command invocation, please use the command line flags.
    If you would like to change the configuration generally, see `gcloud config configurations`.
    

    Na mensagem de saída, name é o nome do Cloud TPU (o padrão é o nome de usuário) e zone é a zona geográfica padrão (o padrão é us-central1-b) dos recursos do Compute Engine. Veja a lista de regiões e zonas disponíveis para o Cloud TPU. Para alterar o nome, a zona e outras propriedades, execute ctpu up conforme descrito abaixo.

Definir permissões de acesso para o Cloud TPU

Defina as seguintes permissões de acesso para a conta de serviço do Cloud TPU:

  1. Conceda ao Cloud TPU acesso ao Cloud Bigtable referente ao seu projeto do GCP. Observe que o ctpu aplica algumas permissões de acesso por padrão, mas esta não.

    $ ctpu auth add-bigtable
    

    Execute o comando a seguir para verificar as permissões do Cloud TPU:

    $ ctpu auth list
    
  2. Atualize as permissões do Cloud Storage (opcional). O comando ctpu up define as permissões padrão para o Cloud Storage. Se quiser permissões mais amplas, revise e atualize as permissões de nível de acesso.

Criar uma VM do Compute Engine e um Cloud TPU

Execute o comando a seguir para configurar uma máquina virtual (VM, na sigla em inglês) do Compute Engine e um Cloud TPU com serviços associados. Essa combinação de recursos e serviços é chamada de lote do Cloud TPU:

$ ctpu up [optional: --name --zone]

Será exibida uma mensagem que segue este padrão:

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.13
   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]:

Digite y e pressione Enter para criar os recursos do Cloud TPU.

Execute as tarefas a seguir com o comando ctpu up:

  • Ative os serviços do Cloud TPU e Compute Engine.
  • Crie uma instância de VM do Compute Engine com a última versão estável do TensorFlow pré-instalada.
  • Crie um Cloud TPU com a versão correspondente do TensorFlow e transmita o nome do Cloud TPU à instância da VM do Compute Engine como uma variável de ambiente (TPU_NAME).
  • Garanta que a Cloud TPU tenha acesso aos recursos necessários no projeto do GCP. Isso é feito ao serem concedidos papéis específicos do IAM à conta de serviço do Cloud TPU.
  • Execute várias outras verificações.
  • Faça login na nova instância de VM do Compute Engine.

É possível executar ctpu up quantas vezes quiser. Por exemplo, se você perder a conexão SSH com a instância de VM do Compute Engine, execute ctpu up para restaurá-la. Se tiver alterado os valores padrão para --name e --zone, será necessário especificá-los novamente a cada execução do ctpu up. Para mais detalhes, leia a documentação do ctpu.

Verificar se está conectado à instância de VM

Quando a execução do comando ctpu up for concluída, verifique se o prompt do shell mudou de username@project para username@tpuname. Essa alteração mostra que você está conectado à sua instância de VM do Compute Engine.

Configurar algumas variáveis úteis

Nas etapas a seguir, um prefixo de (vm)$ mostra que você precisa executar o comando na instância de VM do Compute Engine no lote do Cloud TPU.

Configure algumas variáveis de ambiente para simplificar os comandos deste tutorial:

  1. Configure uma variável PROJECT, substituindo YOUR-PROJECT-ID pelo código do projeto do GCP:

    (vm)$ export PROJECT=YOUR-PROJECT-ID
    
  2. Configure uma variável STORAGE_BUCKET, substituindo YOUR-BUCKET-NAME pelo nome do intervalo do Cloud Storage:

    (vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
    
  3. Configure uma variável BIGTABLE_INSTANCE, substituindo YOUR-INSTANCE-ID pelo código da instância do Cloud Bigtable criado anteriormente:

    (vm)$ export BIGTABLE_INSTANCE=YOUR-INSTANCE-ID
    

Preparar os dados

No aplicativo de treinamento, espera-se que os dados de treinamento sejam acessíveis no Cloud Bigtable. Nesta seção, mostramos como fazer o download dos dados do ImageNet, convertê-los em arquivos TFRecord e, em seguida, fazer o upload dos dados para o Cloud Bigtable.

Observe que pode demorar algumas horas para que o download seja feito e o conjunto de dados do ImageNet seja processado.

Também é possível usar um conjunto de dados fictício para um teste rápido do processo de treinamento do modelo.

Usar um conjunto de dados fictício para testar (opcional)

Para um teste rápido, é possível usar um conjunto de dados fictício gerado aleatoriamente, em vez do conjunto completo de dados do ImageNet. O conjunto de dados fictício é útil apenas para entender como usar um Cloud TPU e validar o procedimento de ponta a ponta. Os números de precisão resultantes e o modelo salvo não são relevantes, e o processo de treinamento não testa efetivamente a transmissão de dados do Cloud Bigtable.

O conjunto de dados fictício está neste local no Cloud Storage:

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

Para usar o conjunto de dados fictício:

  1. Defina a variável de ambiente a seguir:

    (vm)$ export TRAINING_DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    
  2. Acesse diretamente a seção que aborda como copiar dados para o Cloud Bigtable.

Verificar o espaço em disco

Nas seções a seguir, presume-se que você queira usar o conjunto de dados completo do ImageNet.

Você precisa de aproximadamente 500 GB de espaço livre na máquina local ou instância de VM para executar o script que faz o download e converte os dados do ImageNet.

Se quiser processar os dados na instância de VM do Compute Engine, siga estas etapas para adicionar espaço em disco a ela:

  • Siga o guia do Compute Engine para adicionar um disco à instância de VM.
  • Defina o tamanho do disco como 500 GB ou mais.
  • Defina Ao excluir uma instância como Excluir disco para garantir que o disco seja removido quando você excluir a instância de VM.
  • Anote o caminho do novo disco. Por exemplo: /mnt/disks/mnt-dir.

Fazer o download dos dados do ImageNet e convertê-los

Nas instruções a seguir, presume-se que você esteja processando os dados na sua instância de VM do Compute Engine.

Faça o download dos dados do ImageNet e converta-os para o formato TFRecord:

  1. Inscreva-se em uma conta do ImageNet. Anote o usuário e a senha usados para criar a conta.

  2. Configure uma variável TRAINING_DATA_DIR para armazenar os arquivos de dados criados pelo script de download dos dados. A variável precisa especificar um local na máquina local ou na instância de VM do Compute Engine. Por exemplo, o local a seguir presume que você adicionou espaço em disco à sua instância de VM do Compute Engine:

    (vm)$ export TRAINING_DATA_DIR=/mnt/disks/mnt-dir/imagenet-data
    

    Também é possível configurar um local no diretório $HOME:

    (vm)$ export TRAINING_DATA_DIR=$HOME/imagenet-data
    
  3. Faça o download do script imagenet_to_gcs.py no GitHub:

    (vm)$ wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/imagenet_to_gcs.py
    
  4. Instale a ferramenta de linha de comando do Cloud Storage:

    (vm)$ pip install gcloud google-cloud-storage
    
  5. Execute o script imagenet_to_gcs.py conforme mostrado abaixo. Em vez de fazer o download e depois upload para o Cloud Storage, use a opção --nogcs_upload para fazer apenas o download dos arquivos.

    (vm)$ python imagenet_to_gcs.py \
      --local_scratch_dir=${TRAINING_DATA_DIR} \
      --nogcs_upload \
      --imagenet_username=YOUR-IMAGENET-USERNAME \
      --imagenet_access_key=YOUR-IMAGENET-PASSWORD
    

    Observação: fazer o download e o pré-processamento dos dados pode levar muitas horas, dependendo da velocidade da rede e do computador. Não interrompa o script.

    O script produz diretórios contendo imagens dos dados de treinamento e validação no seguinte padrão:

    • dados de treinamento: ${TRAINING_DATA_DIR}/train/n03062245/n03062245_4620.JPEG
    • dados de validação: ${TRAINING_DATA_DIR}/validation/ILSVRC2012_val_00000001.JPEG
    • rótulos de validação: ${TRAINING_DATA_DIR}/synset_labels.txt

Copiar os dados para o Cloud Bigtable

O script a seguir é usado para copiar os dados de treinamento do drive local ou instância de VM para o Cloud Bigtable, para transmitir ao aplicativo de treinamento. Se você optar pelo uso do conjunto de dados fictício, o script copiará os dados diretamente do Cloud Storage para o Cloud Bigtable, conforme definido na variável de ambiente TRAINING_DATA_DIR.

  1. Faça o download do script tfrecords_to_bigtable no GitHub:

    (vm)$ wget https://raw.githubusercontent.com/tensorflow/tpu/master/tools/datasets/tfrecords_to_bigtable.py
    
  2. Instale a ferramenta cbt, que é uma interface da linha de comando do Cloud Bigtable:

    (vm)$ sudo apt install google-cloud-sdk-cbt
    
  3. Crie um arquivo .cbtrc no diretório principal para armazenar suas configurações de projeto padrão para o Cloud Bigtable:

    (vm)$ echo -e "project = $PROJECT\ninstance = $BIGTABLE_INSTANCE" > ~/.cbtrc
    
  4. Crie uma tabela do Cloud Bigtable e um grupo de colunas para os dados de treinamento. O exemplo abaixo configura algumas variáveis de ambiente, cria uma tabela do Cloud Bigtable chamada imagenet-data e um grupo de colunas chamado tfexample:

    (vm)$ export TABLE_NAME=imagenet-data
    (vm)$ export FAMILY_NAME=tfexample
    (vm)$ export COLUMN_QUALIFIER=example
    (vm)$ export ROW_PREFIX_TRAIN=train_
    (vm)$ export ROW_PREFIX_EVAL=validation_
    (vm)$ cbt createtable $TABLE_NAME
    (vm)$ cbt createfamily $TABLE_NAME $FAMILY_NAME
    
  5. Execute o script tfrecords_to_bigtable.py para copiar os dados de treinamento para o Cloud Bigtable:

    (vm)$ pip install --upgrade google-cloud-bigtable
    (vm)$ python tfrecords_to_bigtable.py \
      --source_glob=$TRAINING_DATA_DIR/train* \
      --bigtable_instance=$BIGTABLE_INSTANCE \
      --bigtable_table=$TABLE_NAME \
      --column_family=$FAMILY_NAME \
      --column=$COLUMN_QUALIFIER \
      --row_prefix=$ROW_PREFIX_TRAIN
    

    O script pode levar muitos minutos para ser executado. Quando estiver concluído, o resultado será semelhante ao exemplo a seguir:

    Found 1024 files (from "gs://cloud-tpu-test-datasets/fake_imagenet/train-00000-of-01024" to "gs://cloud-tpu-test-datasets/fake_imagenet/train-01023-of-01024")
    --project was not set on the command line, attempting to infer it from the metadata service...
    Dataset ops created; about to create the session.
    2018-10-12 21:07:12.585287: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
    Starting transfer...
    Complete!
    
  6. Execute o script tfrecords_to_bigtable.py novamente, dessa vez para copiar os dados de avaliação para o Cloud Bigtable:

    (vm)$ python tfrecords_to_bigtable.py \
      --source_glob=$TRAINING_DATA_DIR/validation* \
      --bigtable_instance=$BIGTABLE_INSTANCE \
      --bigtable_table=$TABLE_NAME \
      --column_family=$FAMILY_NAME \
      --column=$COLUMN_QUALIFIER \
      --row_prefix=$ROW_PREFIX_EVAL
    

    Exemplo de saída:

    Found 128 files (from "gs://cloud-tpu-test-datasets/fake_imagenet/validation-00000-of-00128" to "gs://cloud-tpu-test-datasets/fake_imagenet/validation-00127-of-00128")
    --project was not set on the command line, attempting to infer it from the metadata service...
    Dataset ops created; about to create the session.
    2018-10-12 22:21:56.891413: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
    Starting transfer...
    Complete!
    

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 de configuração do TensorBoard.

Executar o modelo ResNet-50

Agora já está tudo pronto para treinar e avaliar o modelo ResNet-50 no Cloud TPU e transmitir os dados de treinamento do Cloud Bigtable. O modelo treinado e os checkpoints intermediários são gravados no Cloud Storage pelo aplicativo de treinamento.

Execute os comandos a seguir na instância de VM do Compute Engine:

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

    (vm)$ export PYTHONPATH="$PYTHONPATH:/usr/share/tpu/models"
    
  2. Acesse o diretório na instância de VM do Compute Engine em que o modelo ResNet-50 está pré-instalado:

    (vm)$ cd /usr/share/tpu/models/official/resnet/
    
  3. Execute o script de treinamento:

    (vm)$ python resnet_main.py \
      --tpu=$TPU_NAME \
      --model_dir=${STORAGE_BUCKET}/resnet \
      --bigtable_project=$PROJECT \
      --bigtable_instance=$BIGTABLE_INSTANCE \
      --bigtable_table=$TABLE_NAME \
      --bigtable_column_family=$FAMILY_NAME \
      --bigtable_column_qualifier=$COLUMN_QUALIFIER \
      --bigtable_train_prefix=$ROW_PREFIX_TRAIN \
      --bigtable_eval_prefix=$ROW_PREFIX_EVAL
    
    • --tpu especifica o nome do Cloud TPU. Observe que o ctpu transmite esse nome para a instância de VM do Compute Engine como uma variável de ambiente (TPU_NAME).
    • --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 um diretório para carregar os dados do checkpoint atual e armazenar novos checkpoints.
    • --bigtable_project especifica o identificador do projeto do GCP referente à instância do Cloud Bigtable que contém seus dados de treinamento. Se você não fornecer esse valor, o programa presumirá que o Cloud TPU e a instância do Cloud Bigtable estão no mesmo projeto do GCP.
    • --bigtable_instance especifica o código da instância do Cloud Bigtable que contém seus dados de treinamento.
    • --bigtable_table especifica o nome da tabela do Cloud Bigtable que contém os dados de treinamento.
    • --bigtable_column_family especifica o nome do grupo do Cloud Bigtable.
    • --bigtable_column_qualifier especifica o nome do qualificador de colunas do Cloud Bigtable. Para ver uma descrição do modelo de armazenamento, consulte a visão geral do Cloud Bigtable.

O que esperar

O modelo ResNet-50 é treinado pelo procedimento acima por 90 períodos e avaliado a cada 1.251 etapas. Para informações sobre os valores padrão usados pelo modelo e as sinalizações que possibilitam a alteração dos padrões, consulte o código e o README para o modelo TensorFlow ResNet-50. Com as sinalizações padrão, o modelo é treinado com precisão maior que 76%.

Em nossos testes, o Cloud Bigtable fornece um desempenho de alta capacidade para cargas de trabalho, como treinamento ImageNet, com capacidade de verificação de centenas de megabytes por segundo por nó.

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 do 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
    
  1. Quando não precisar mais dos dados de treinamento no Cloud Bigtable, execute o comando a seguir no Cloud Shell para excluir a instância do Cloud Bigtable. A variável BIGTABLE_INSTANCE precisa representar o código da instância do Cloud Bigtable usada anteriormente.

    $ cbt deleteinstance $BIGTABLE_INSTANCE
    

A seguir

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

Enviar comentários sobre…