Como executar o MNIST no Cloud TPU

Neste tutorial, você encontra uma descrição detalhada do modelo do MNIST, instruções sobre o download da amostra de código da TPU para MNIST no TensorFlow e um guia para executá-la no Cloud TPU.

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.

Descrição do modelo

O conjunto de dados MNIST contém um grande número de imagens de dígitos escritos à mão no intervalo de 0 a 9, bem como os marcadores que identificam o dígito em cada imagem.

Neste tutorial, treinamos um modelo de machine learning para classificar imagens com base nesse conjunto. Após o treinamento, o modelo classifica as imagens recebidas em dez categorias (0 a 9) com base no que ele aprendeu sobre as imagens manuscritas do conjunto de dados MNIST. Em seguida, envie ao modelo uma imagem que ele não tenha visto antes, e o modelo identifica o dígito nela com base no que aprendeu durante o treinamento.

O conjunto de dados MNIST foi dividido em três partes:

  • 55.000 exemplos de dados de treinamento;
  • 10.000 exemplos de dados de teste;
  • 5.000 exemplos de dados de validação.

Você encontra mais informações sobre o conjunto de dados no site do banco de dados do MNIST.

O modelo inclui sete camadas:

  • duas de convolução
  • duas de pool máximo
  • duas densas (totalmente conectadas)
  • uma de dropout

A perda é calculada por meio da função softmax.

Esta versão do modelo do MNIST usa o tf.estimator, que é uma API detalhada do TensorFlow recomendada para criar e executar um modelo de aprendizado de máquina em um Cloud TPU.

A API Tensorflow Estimator simplifica o processo de desenvolvimento do modelo ao ocultar a maior parte da implementação de nível baixo. Isso também facilita a alternância entre a TPU e outras plataformas de teste como GPUs e CPUs.

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. No Console do GCP, na página do seletor de projetos, selecione ou crie um projeto do GCP.

    Acesse a página do seletor de projetos

  3. Verifique se o faturamento foi ativado no projeto do Google Cloud Platform. Saiba como confirmar que o faturamento está ativado para seu projeto.

  4. Este tutorial inclui componentes faturáveis do Google Cloud Platform. Consulte a página de preços do Cloud TPU para fazer uma estimativa dos custos. Para evitar cobranças desnecessárias, não se esqueça de apagar os recursos criados ao terminar de usá-los.

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.

Criar 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 local do intervalo precisa estar na mesma região da máquina virtual (VM, na sigla em inglês) e do nó do TPU. As VMs e os nós do TPU estão localizados em zonas específicas, que são subdivisões dentro de uma região.

  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: Standard
    • Local: especifique um local para o intervalo na mesma região em que você planeja criar seu nó da TPU. Consulte Tipos e zonas de TPU para saber onde vários tipos de TPU estão disponíveis.

Usar 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. Consulte a página Como criar e excluir TPUs para aprender todas as maneiras de configurar e gerenciar a VM do Compute Engine e os recursos do Cloud TPU.

Executar 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 o Cloud TPU será criado.

  3. Execute ctpu up especificando as sinalizações mostradas para um dispositivo Cloud TPU ou para uma fração de pod. Consulte a Referência da CTPU para ver as opções de sinalização e descrições.

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

O comando ctpu up cria uma máquina virtual e serviços do Cloud TPU.

Daqui em diante, o prefixo (vm)$ significa que é preciso executar o comando na instância de VM do Compute Engine.

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

Buscar os dados

O conjunto de dados do MNIST é hospedado no site do banco de dados dele. Siga as instruções abaixo para fazer o download dos dados, convertê-los para o formato necessário e fazer o upload deles para o Cloud Storage.

Fazer o download e converter os dados do MNIST

Com o script convert_to_records.py, você faz o download dos dados e os converte para o formato TFRecord necessário no modelo de exemplo do MNIST.

Use os comandos a seguir para executar o script e descompactar os arquivos:

(vm)$ python /usr/share/tensorflow/tensorflow/examples/how_tos/reading_data/convert_to_records.py --directory=./data
(vm)$ gunzip ./data/*.gz

Fazer o upload dos dados para o Cloud Storage

Faça upload dos dados para o intervalo do Cloud Storage para que o servidor de TPU possa acessá-los. Ao definir a variável nos comandos abaixo, substitua YOUR-BUCKET-NAME pelo nome do intervalo do Cloud Storage:

(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
(vm)$ gsutil cp -r ./data ${STORAGE_BUCKET}

Executar o modelo de TPU do MNIST

O modelo de TPU do MNIST vem pré-instalado na VM do Compute Engine no diretório a seguir:

/usr/share/models/official/mnist/

O código-fonte do modelo de TPU do MNIST também está disponível no GitHub. É possível executar o modelo no Cloud TPU. Como opção, consulte como executar o modelo em uma máquina local.

Como executar o modelo no Cloud TPU

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

  1. Execute o modelo do MNIST:

    (vm)$ python /usr/share/models/official/mnist/mnist_tpu.py \
      --tpu=$TPU_NAME \
      --data_dir=${STORAGE_BUCKET}/data \
      --model_dir=${STORAGE_BUCKET}/output \
      --use_tpu=True \
      --iterations=500 \
      --train_steps=2000
    
    • --tpu especifica o nome do Cloud TPU. O ctpu transfere esse nome para a VM do Compute Engine como uma variável de ambiente TPU_NAME. No entanto, se você perder a conexão com a VM, execute ctpu up novamente para se reconectar. TPU_NAME não será definido se você se conectar à VM executando gcloud compute ssh.
    • --data_dir especifica o caminho do Cloud Storage para a entrada de treinamento.
    • --model_dir especifica o diretório em que os checkpoints e os resumos são armazenados durante o treinamento do modelo. Se a pasta não existir, ela será criada pelo programa. Ao usar um Cloud TPU, o model_dir precisa um caminho do Cloud Storage (gs://...). Reutilize uma pasta atual para carregar os dados do checkpoint atual e armazenar os novos.
    • --iterations especifica o número de etapas de treinamento a serem executadas na TPU em cada chamada antes de devolver o controle ao Python. Pode haver muita sobrecarga de comunicação se esse número for muito pequeno, o que afeta negativamente o desempenho. Por exemplo, menor que 100.
    • --train_steps especifica o número total de etapas, ou lotes, para executar no treinamento.

Como executar o modelo em uma máquina local (não TPU)

Para executar o modelo em uma máquina não TPU, omita --tpu e defina a seguinte sinalização:

--use_tpu=False

Isso faz com que o cálculo ocorra em uma GPU, se você tiver uma. Caso contrário, o cálculo volta para a CPU.

O que esperar

Por padrão, o modelo do tf.estimator informa o valor da perda e o horário da etapa no formato a seguir:

    INFO:tensorflow:Calling model_fn.
    INFO:tensorflow:Create CheckpointSaverHook.
    INFO:tensorflow:Done calling model_fn.
    INFO:tensorflow:TPU job name tpu_worker
    INFO:tensorflow:Graph was finalized.
    INFO:tensorflow:Running local_init_op.
    INFO:tensorflow:Done running local_init_op.
    INFO:tensorflow:Init TPU system
    INFO:tensorflow:Start infeed thread controller
    INFO:tensorflow:Starting infeed thread controller.
    INFO:tensorflow:Start outfeed thread controller
    INFO:tensorflow:Starting outfeed thread controller.
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:Saving checkpoints for 500 into gs://ctpu-mnist-test/output/model.ckpt.
    INFO:tensorflow:loss = 0.08896458, step = 0
    INFO:tensorflow:loss = 0.08896458, step = 0
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:global_step/sec: 242.829
    INFO:tensorflow:examples/sec: 248715
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:Saving checkpoints for 2000 into gs://ctpu-mnist-test/output/model.ckpt.
    INFO:tensorflow:Stop infeed thread controller
    INFO:tensorflow:Shutting down InfeedController thread.
    INFO:tensorflow:InfeedController received shutdown signal, stopping.
    INFO:tensorflow:Infeed thread finished, shutting down.
    INFO:tensorflow:Stop output thread controller
    INFO:tensorflow:Shutting down OutfeedController thread.
    INFO:tensorflow:OutfeedController received shutdown signal, stopping.
    INFO:tensorflow:Outfeed thread finished, shutting down.
    INFO:tensorflow:Shutdown TPU system.
    INFO:tensorflow:Loss for final step: 0.044236258.

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 garantir que não haja instâncias alocadas e evitar cobranças desnecessárias no 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. Substitua 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.