Como treinar o ResNet com a Cloud TPU e o GKE

Neste tutorial, você verá como treinar o modelo TensorFlow ResNet-50 (em inglês) na Cloud TPU e no GKE.

Em resumo, você seguirá os passos a seguir para executar o modelo usando um conjunto de dados fictício fornecido para teste:

  • Criar um intervalo do Cloud Storage para armazenar a saída do modelo.
  • Crie um cluster do GKE para gerenciar os recursos da Cloud TPU.
  • Faça o download de uma especificação de job do Kubernetes que descreva os recursos necessários para treinar o ResNet-50 com o TensorFlow em uma Cloud TPU.
  • Para começar a treinar o modelo, execute o job no cluster do GKE.
  • Verificar os registros e a saída do modelo.

Antes de começar

  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. Ao usar a Cloud TPU com o GKE, são utilizados componentes faturáveis do Google Cloud Platform no projeto. Para fazer uma estimativa de custos, verifique os preços da Cloud TPU e os preços do GKE. Siga as instruções para limpar os recursos quando não forem mais necessários.

  5. Ative as APIs a seguir no Console do GCP:

Escolher um shell e instalar as ferramentas de linha de comando, se necessário

É possível usar o Cloud Shell (link em inglês) ou o shell local para concluir este tutorial. O Cloud Shell já vem pré-instalado com as ferramentas de linha de comando da gcloud e da kubectl. gcloud é a interface de linha de comando para o GCP e kubectl fornece a interface de linha de comando para executar comandos nos clusters do Kubernetes.

Se preferir usar o shell local, instale as ferramentas de linha de comando gcloud e kubectl em seu ambiente.

Cloud Shell

Para iniciar o Cloud Shell, execute os seguintes passos:

  1. Acesse o Console do Google Cloud Platform.

  2. Clique no botão Ativar o Cloud Shell no canto superior direito do console.

Uma sessão do Cloud Shell será aberta dentro de um frame na parte inferior do console. Use este shell para executar os comandos gcloud e kubectl.

Shell local

Para instalar gcloud e kubectl, execute os seguintes passos:

  1. Instale o SDK do Google Cloud, que inclui a ferramenta de linha de comando gcloud.

  2. Execute o seguinte comando para instalar a ferramenta de linha de comando kubectl:

    $ gcloud components install kubectl
  3. Instale os componentes gcloud, necessários para executar o GKE com a Cloud TPU.

    $ gcloud components install

Requisitos e limitações

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

  • Use o GKE na versão 1.13.4-gke.5 ou posterior. Para especificá-la, adicione o parâmetro --cluster-version ao comando gcloud container clusters create, conforme descrito abaixo. Para mais informações, consulte a documentação do SDK.
  • Use a versão 1.13 ou posterior do TensorFlow. Insira a versão do TensorFlow na especificação de pod do Kubernetes, como a configuração do resnet.
  • É preciso criar o cluster do GKE e os pools de nós em uma zona em que o Cloud TPU esteja disponível. Também é possível criar os intervalos do Cloud Storage para manter seus dados e modelos de treinamento na mesma região que seu cluster do GKE. As zonas a seguir estão disponíveis:

    EUA

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB us-central1-b
    us-central1-c
    (us-central1-f somente TFRC, em inglês)
    v2-32 (Beta) 32 256 GiB us-central1-a
    v2-128 (Beta) 128 1 TiB us-central1-a
    v2-256 (Beta) 256 2 TiB us-central1-a
    v2-512 (Beta) 512 4 TiB us-central1-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memória total de TPU Zonas disponíveis
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    (us-central1-f somente TFRC, em inglês)

    Europa

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB europe-west4-a
    v2-32 (Beta) 32 256 GiB europe-west4-a
    v2-128 (Beta) 128 1 TiB europe-west4-a
    v2-256 (Beta) 256 2 TiB europe-west4-a
    v2-512 (Beta) 512 4 TiB europe-west4-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memória total de TPU Zonas disponíveis
    v3-8 8 128 GiB europe-west4-a
    v3-32 (Beta) 32 512 GiB europe-west4-a
    v3-64 (Beta) 64 1 TiB europe-west4-a
    v3-128 (Beta) 128 2 TiB europe-west4-a
    v3-256 (Beta) 256 4 TiB europe-west4-a
    v3-512 (Beta) 512 8 TiB europe-west4-a
    v3-1024 (Beta) 1024 16 TiB europe-west4-a
    v3-2048 (Beta) 2048 32 TiB europe-west4-a

    Ásia-Pacífico

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB asia-east1-c
  • Cada contêiner pode solicitar, no máximo, uma Cloud TPU. No entanto, é permitido que vários contêineres em um pod solicitem um.
  • O escalador automático de clusters é compatível com a Cloud TPU no GKE 1.11.4-gke.12 e versões posteriores.

Configurar os dados e o intervalo de armazenamento

Use o conjunto de dados fictício fornecido com este tutorial ou, se preferir, os dados completos do ImageNet para treinar seu modelo. De qualquer forma, é necessário configurar um intervalo do Cloud Storage conforme descrito abaixo.

Usar o conjunto de dados fictício ou do ImageNet

Nas instruções abaixo, considera-se que você queira testar o modelo usando um conjunto de dados fictício gerado aleatoriamente. Como alternativa, é possível seguir as instruções usando o conjunto de dados completo do ImageNet.

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

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

O conjunto de dados fictício é útil apenas para entender como usar uma 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.

Crie um intervalo do Cloud Storage

Você precisa ter um intervalo do Cloud Storage para armazenar os resultados do treinamento do seu modelo de machine learning. Ao usar dados de treinamento reais em vez do conjunto de dados fictício deste tutorial, será possível armazená-los nesse mesmo intervalo.

  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: us-central1

    O local do intervalo precisa estar na mesma região do recurso do TPU provisionado no cluster do GKE.

Autorizar o acesso do Cloud TPU ao intervalo da Cloud Storage

É necessário conceder à Cloud TPU acesso de leitura/gravação aos objetos do Cloud Storage. Para isso, conceda o acesso necessário à conta de serviço usada pela Cloud TPU. Siga as instruções do guia para conceder acesso ao intervalo de armazenamento.

Criar um cluster no GKE

É possível criar um cluster do GKE no Console do GCP ou usando a ferramenta de linha de comando gcloud. Selecione uma das opções abaixo para ver as instruções pertinentes:

Console

Siga estas instruções para criar um cluster do GKE compatível com a Cloud TPU:

  1. Acesse a página do GKE no Console do GCP.

    Acessar a página do GKE

  2. Clique em Criar cluster.

  3. Na página de clusters do GKE, especifique um nome para o cluster. Ele precisa ser exclusivo no projeto e na zona. Por exemplo, tpu-models-cluster.

  4. Especifique a Zona em que você planeja usar um recurso da Cloud TPU. Por exemplo, selecione a zona us-central1-b.

    A Cloud TPU está disponível nas seguintes zonas:

    EUA

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB us-central1-b
    us-central1-c
    (us-central1-f somente TFRC, em inglês)
    v2-32 (Beta) 32 256 GiB us-central1-a
    v2-128 (Beta) 128 1 TiB us-central1-a
    v2-256 (Beta) 256 2 TiB us-central1-a
    v2-512 (Beta) 512 4 TiB us-central1-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memória total de TPU Zonas disponíveis
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    (us-central1-f somente TFRC, em inglês)

    Europa

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB europe-west4-a
    v2-32 (Beta) 32 256 GiB europe-west4-a
    v2-128 (Beta) 128 1 TiB europe-west4-a
    v2-256 (Beta) 256 2 TiB europe-west4-a
    v2-512 (Beta) 512 4 TiB europe-west4-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memória total de TPU Zonas disponíveis
    v3-8 8 128 GiB europe-west4-a
    v3-32 (Beta) 32 512 GiB europe-west4-a
    v3-64 (Beta) 64 1 TiB europe-west4-a
    v3-128 (Beta) 128 2 TiB europe-west4-a
    v3-256 (Beta) 256 4 TiB europe-west4-a
    v3-512 (Beta) 512 8 TiB europe-west4-a
    v3-1024 (Beta) 1024 16 TiB europe-west4-a
    v3-2048 (Beta) 2048 32 TiB europe-west4-a

    Ásia-Pacífico

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB asia-east1-c
  5. Verifique se você tem cota suficiente alocada para o nó da Cloud TPU na zona especificada na etapa anterior.

  6. Para que a Versão do cluster seja compatível com o Cloud TPU, verifique se ela está definida como 1.13.4-gke.5 ou posterior.

  7. Role até a parte inferior da página e clique em Mais opções.

  8. Defina Acessar escopos como Permitir acesso total a todas as APIs do Cloud. Isso garante que todos os nós no cluster tenham acesso ao intervalo do Cloud Storage. Para que isso funcione, o cluster e o intervalo de armazenamento precisam estar no mesmo projeto. Por padrão, os pods herdam os escopos dos nós em que são implantados. Para limitar o acesso por pod, veja como autenticar com contas de serviço no guia do GKE.

  9. Na parte inferior da página, clique em Disponibilidade, rede, segurança e outros recursos. Isso abrirá uma janela na mesma página.

  10. Ative Nativo de VPC (usando IP de alias).

  11. Ative a Cloud TPU.

  12. Configure as outras opções do cluster como quiser. É possível deixá-las com os valores padrão.

  13. Clique em Criar.

  14. Conecte-se ao cluster. Para fazer isso, selecione o cluster na página de clusters do Console do Kubernetes e clique no botão CONECTAR. Isso fará com que o comando gcloud seja exibido. Execute-o em um Cloud Shell para conectar o kubectl a esse novo cluster.

gcloud

Siga as instruções abaixo para configurar o ambiente e criar um cluster do GKE compatível com a Cloud TPU usando a ferramenta de linha de comando gcloud:

  1. Especifique o projeto do GCP:

    $ gcloud config set project YOUR-CLOUD-PROJECT
    

    em que YOUR-CLOUD-PROJECT é o nome do projeto do GCP.

  2. Especifique a zona em que você planeja usar um recurso da Cloud TPU. Para este exemplo, use a zona us-central1-b:

    $ gcloud config set compute/zone us-central1-b
    

    A Cloud TPU está disponível nas seguintes zonas:

    EUA

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB us-central1-b
    us-central1-c
    (us-central1-f somente TFRC, em inglês)
    v2-32 (Beta) 32 256 GiB us-central1-a
    v2-128 (Beta) 128 1 TiB us-central1-a
    v2-256 (Beta) 256 2 TiB us-central1-a
    v2-512 (Beta) 512 4 TiB us-central1-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memória total de TPU Zonas disponíveis
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    (us-central1-f somente TFRC, em inglês)

    Europa

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB europe-west4-a
    v2-32 (Beta) 32 256 GiB europe-west4-a
    v2-128 (Beta) 128 1 TiB europe-west4-a
    v2-256 (Beta) 256 2 TiB europe-west4-a
    v2-512 (Beta) 512 4 TiB europe-west4-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memória total de TPU Zonas disponíveis
    v3-8 8 128 GiB europe-west4-a
    v3-32 (Beta) 32 512 GiB europe-west4-a
    v3-64 (Beta) 64 1 TiB europe-west4-a
    v3-128 (Beta) 128 2 TiB europe-west4-a
    v3-256 (Beta) 256 4 TiB europe-west4-a
    v3-512 (Beta) 512 8 TiB europe-west4-a
    v3-1024 (Beta) 1024 16 TiB europe-west4-a
    v3-2048 (Beta) 2048 32 TiB europe-west4-a

    Ásia-Pacífico

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB asia-east1-c
  3. Use o comando gcloud container clusters para criar um cluster no GKE com suporte para a Cloud TPU. Observe que o cluster do GKE e seus pools de nós precisam ser criados em uma zona em que a Cloud TPU esteja disponível, conforme descrito na seção sobre variáveis de ambiente acima. O comando a seguir cria um cluster chamado tpu-models-cluster:

    $ gcloud container clusters create tpu-models-cluster \
      --cluster-version=1.13 \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu
    

    No comando acima:

    • --cluster-version=1.13 indica que o cluster usará a versão mais recente do Kubernetes 1.13. Use a versão 1.13.4-gke.5 ou posterior.
    • --scopes=cloud-platform garante que todos os nós no cluster tenham acesso ao intervalo do Cloud Storage no GCP definido como YOUR-CLOUD-PROJECT acima. Para que isso funcione, o cluster e o intervalo de armazenamento precisam estar no mesmo projeto. Por padrão, os pods herdam os escopos dos nós em que são implantados. Portanto, --scopes=cloud-platform fornece o escopo cloud-platform a todos os pods em execução no cluster. Para limitar o acesso por pod, veja como autenticar com contas de serviço no guia do GKE.
    • --enable-ip-alias indica que o cluster usa intervalos de IP do alias. Isso é necessário para usar a Cloud TPU no GKE.
    • --enable-tpu indica que o cluster precisa ser compatível com a Cloud TPU.

      Quando o comando terminar a execução, será exibida uma mensagem de confirmação semelhante a esta:

      kubeconfig entry generated for tpu-models-cluster. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS tpu-models-cluster us-central1-b 1.10.4-gke.2 35.232.204.86 n1-standard-2 1.10.4-gke.2 3 RUNNING

Executar o modelo ResNet-50

Agora, está tudo pronto para você executar o modelo ResNet-50 usando a Cloud TPU e o GKE.

  1. Crie uma especificação de job em um arquivo chamado resnet_k8s.yaml:

    • Faça o download ou copie a especificação de job pronta do GitHub (em inglês).
    • Na especificação do job, altere <my-model-bucket> para o nome do intervalo do Cloud Storage criado anteriormente.

    Observe que a especificação do job se refere aos modelos de TPU do TensorFlow que estão disponíveis em um contêiner do Docker em gcr.io/tensorflow/tpu-models. Trata-se de um local no Container Registry.

  2. Crie o job no cluster do GKE:

    $ kubectl create -f resnet_k8s.yaml
    job "resnet-tpu" created
  3. Aguarde até que o job seja programado.

    $ kubectl get pods -w
    
    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   0/1       Pending   0          1m
    

    A vida útil dos nós da Cloud TPU é vinculada aos pods que os solicitam. A Cloud TPU é criada sob demanda quando o pod é programado e reciclada quando o pod é excluído.

    A programação do pod leva aproximadamente cinco minutos para ser concluída.

    Depois de cinco minutos, você verá algo semelhante a isto:

    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   1/1       Running   0          6m
    
  4. Confira os registros do pod para ver o desempenho do job:

    $ kubectl logs resnet-tpu-cmvlf

    Também é possível verificar a resposta no painel de cargas de trabalho do GKE, no Console do GCP.

    Observe que leva algum tempo para que a primeira entrada apareça nos registros. Você verá algo como isto:

    I0622 18:14:31.617954 140178400511808 tf_logging.py:116] Calling model_fn.
    I0622 18:14:40.449557 140178400511808 tf_logging.py:116] Create CheckpointSaverHook.
    I0622 18:14:40.697138 140178400511808 tf_logging.py:116] Done calling model_fn.
    I0622 18:14:44.004508 140178400511808 tf_logging.py:116] TPU job name worker
    I0622 18:14:45.254548 140178400511808 tf_logging.py:116] Graph was finalized.
    I0622 18:14:48.346483 140178400511808 tf_logging.py:116] Running local_init_op.
    I0622 18:14:48.506665 140178400511808 tf_logging.py:116] Done running local_init_op.
    I0622 18:14:49.135080 140178400511808 tf_logging.py:116] Init TPU system
    I0622 18:15:00.188153 140178400511808 tf_logging.py:116] Start infeed thread controller
    I0622 18:15:00.188635 140177578452736 tf_logging.py:116] Starting infeed thread controller.
    I0622 18:15:00.188838 140178400511808 tf_logging.py:116] Start outfeed thread controller
    I0622 18:15:00.189151 140177570060032 tf_logging.py:116] Starting outfeed thread controller.
    I0622 18:15:07.316534 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:15:07.316904 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:16:13.881397 140178400511808 tf_logging.py:116] Saving checkpoints for 100 into gs://<my-model-bucket>/resnet/model.ckpt.
    I0622 18:16:21.147114 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.148168 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.150870 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:16:21.151168 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:00.739207 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:17:00.739809 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:36.598773 140178400511808 tf_logging.py:116] global_step/sec: 2.65061
    I0622 18:17:37.040504 140178400511808 tf_logging.py:116] examples/sec: 2698.56
    I0622 18:17:37.041333 140178400511808 tf_logging.py:116] loss = 2.63023, step = 200 (75.893 sec)
    
  5. Visualize o modelo treinado em gs://<my-model-bucket>/resnet/model.ckpt. Confira os intervalos na página do navegador do Cloud Storage no Console do GCP.

Realizar a limpeza

Ao terminar de usar a Cloud TPU no GKE, limpe os recursos para evitar cobranças extras na conta do Google Cloud Platform.

Console

Exclua o cluster do GKE:

  1. Acesse a página do GKE no Console do GCP.

    Acessar a página do GKE

  2. Marque a caixa de seleção ao lado do cluster que você quer excluir.

  3. Clique em Excluir.

Ao terminar de examinar os dados, exclua o intervalo do Cloud Storage criado durante este tutorial:

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

    Acessar a página do Cloud Storage

  2. Marque a caixa de seleção ao lado do intervalo que você quer excluir.

  3. Clique em Excluir.

Consulte o guia de preços do Cloud Storage para se informar sobre os limites de armazenamento gratuito e outros preços.

gcloud

Caso não tenha definido o projeto e a zona para esta sessão, faça isso agora. Consulte as instruções ensinadas anteriormente neste guia. Depois, siga este procedimento de limpeza:

  1. Execute o seguinte comando para excluir o cluster do GKE, tpu-models-cluster, substituindo YOUR-PROJECT pelo nome do projeto do GCP:

    $ gcloud container clusters delete tpu-models-cluster --project=YOUR-PROJECT
    
  2. Ao terminar de examinar os dados, use o comando gsutil para excluir o intervalo do Cloud Storage criado durante este tutorial. Substitua YOUR-BUCKET pelo nome do seu intervalo no Cloud Storage.

    $ gsutil rm -r gs://YOUR-BUCKET
    

    Consulte o guia de preços do Cloud Storage para se informar sobre os limites de armazenamento gratuito e outros preços.

A seguir