Como treinar o ResNet com o Cloud TPU e o GKE

Neste tutorial, mostramos como treinar o modelo ResNet-50 do TensorFlow na Cloud TPU e no GKE.

Em resumo, este tutorial guia você pelas etapas a seguir para executar o modelo usando um conjunto de dados fictício fornecido para fins de teste:

  • Crie 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.
  • Verifique 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. Selecione ou crie um projeto do Google Cloud Platform.

    Acessar a página Gerenciar recursos

  3. Verifique se o faturamento foi ativado no projeto do Google Cloud Platform.

    Saiba como ativar o faturamento

  4. Quando você usa a Cloud TPU com o GKE, são utilizados componentes faturáveis do Google Cloud Platform no seu projeto. Para fazer uma estimativa de custos, verifique os preços do Cloud TPU e os preços do GKE. Siga as instruções para limpar os recursos quando eles não forem mais necessários.

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

Escolha um shell e instale as ferramentas de linha de comando, se necessário

Você pode usar o Cloud Shell ou o shell local para concluir este tutorial. O Cloud Shell vem pré-instalado com as ferramentas de linha de comando gcloud e kubectl. A gcloud é a interface de linha de comando do GCP, e a kubectl oferece a interface de linha de comando para executar comandos em clusters do Kubernetes.

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

Cloud Shell

Para iniciar o Cloud Shell, execute as seguintes etapas:

  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 se abrirá dentro de um frame na parte inferior do console. Use esse shell para executar os comandos da gcloud e da kubectl.

Shell local

Para instalar a gcloud e a kubectl, execute as seguintes etapas:

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

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

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

    $ gcloud components install

Requisitos e limitações

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

  • Use o GKE versão 1.13.4-gke.5 ou posterior. É possível especificar a versão adicionando 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:

    US

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB us-central1-a
    us-central1-b
    us-central1-c
    (us-central1-f apenas TFRC)
    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 Regiões disponíveis
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    (us-central1-f apenas TFRC)

    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 Regiões 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, um Cloud TPU. No entanto, é permitido que vários contêineres em um pod solicitem um.
  • O autoescalador de clusters aceita o 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 o conjunto de dados do ImageNet

Nas instruções abaixo, consideramos que você quer usar um conjunto de dados fictício gerado aleatoriamente para testar o modelo. 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. Se você decidir usar dados de treinamento reais (em vez do conjunto de dados fictício fornecido neste tutorial) poderá armazenar os dados 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
    • A classe de armazenamento padrão: Regional
    • O local: us-central1

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

Autorizar o acesso do Cloud TPU ao intervalo do Cloud Storage

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

Crie 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 do Cloud TPU. Por exemplo, selecione a zona us-central1-b.

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

    US

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB us-central1-a
    us-central1-b
    us-central1-c
    (us-central1-f apenas TFRC)
    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 Regiões disponíveis
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    (us-central1-f apenas TFRC)

    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 Regiões 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ó do 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 Escopos de acesso como Permitir acesso total a todas as APIs do Cloud. Dessa forma, todos os nós do cluster terão acesso ao intervalo do Cloud Storage. O cluster e o intervalo de armazenamento precisam estar no mesmo projeto para isso funcionar. 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 abre 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. Você pode 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 o Cloud TPU usando a ferramenta de linha de comando gcloud:

  1. Especifique seu projeto do GCP:

    $ gcloud config set project YOUR-CLOUD-PROJECT
    

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

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

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

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

    US

    Tipo de TPU (v2) Núcleos de TPU v2 Memória total de TPU Zonas disponíveis
    v2-8 8 64 GiB us-central1-a
    us-central1-b
    us-central1-c
    (us-central1-f apenas TFRC)
    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 Regiões disponíveis
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    (us-central1-f apenas TFRC)

    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 Regiões 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 compatível com o Cloud TPU. Observe que o cluster do GKE e os pools de nós dele precisam ser criados em uma zona em que o Cloud TPU esteja disponível, conforme descrito na seção acima sobre variáveis de ambiente. 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. É necessário usar 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. O cluster e o intervalo de armazenamento precisam estar no mesmo projeto para isso funcionar. Por padrão, os pods herdam os escopos dos nós em que são implantados. Portanto, --scopes=cloud-platform dá 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 de 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

Execute 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.
    • Na especificação do job, mude <my-model-bucket> para o nome do intervalo do Cloud Storage criado anteriormente.

    Observe que a especificação de 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. Veja 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.

Limpeza

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

Console

Exclua seu 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.

Quando terminar de examinar os dados, exclua o intervalo do Cloud Storage que você criou 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

Se você não tiver 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. Para excluir o cluster do GKE, execute o comando tpu-models-cluster. Substitua YOUR-PROJECT pelo nome do projeto do GCP:

    $ gcloud container clusters delete tpu-models-cluster --project=YOUR-PROJECT
    
  2. Quando 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 intervalo do 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

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

Enviar comentários sobre…