Como treinar o ResNet com a 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 GCP.

    Acessar a página Gerenciar recursos

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

    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 da 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 contém 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 a Cloud TPU:

    $ gcloud components install

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

Use 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

Autorize o acesso da Cloud TPU ao intervalo do Cloud Storage

É necessário conceder à Cloud TPU acesso de leitura/gravação aos objetos do Cloud Storage. Para tanto, 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. Especifique o Nome do 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

    Cloud TPU v2 e Preemptiva v2 us-central1-b
    us-central1-c
    us-central1-f (apenas o programa TFRC)
    Cloud TPU v3 e Preemptiva v3 us-central1-a
    us-central1-b
    us-central1-f
    (apenas o programa TFRC)
    Cloud TPU v2 Pod (versão Beta) us-central1-a

    Europa

    Cloud TPU v2 e Preemptiva v2 europe-west4-a
    Cloud TPU v3 e Preemptiva v3 europe-west4-a
    Cloud TPU v2 Pod (versão Beta) europe-west4-a
    Cloud TPU v3 Pod (versão Beta) europe-west4-a

    Ásia-Pacífico

    Cloud TPU v2 e Preemptiva v2 asia-east1-c
  5. Para que a Versão do cluster seja compatível com a Cloud TPU, verifique se ela está definida como 1.10.4-gke.2 ou posterior.

  6. Role até a parte inferior da página e clique em Mais.

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

  8. Ative a Cloud TPU.

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

  10. Configure as outras opções do cluster como quiser. Você pode deixá-las com os valores padrão.

  11. Clique em Criar.

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

    EUA

    Cloud TPU v2 e Preemptiva v2 us-central1-b
    us-central1-c
    us-central1-f (apenas o programa TFRC)
    Cloud TPU v3 e Preemptiva v3 us-central1-a
    us-central1-b
    us-central1-f
    (apenas o programa TFRC)
    Cloud TPU v2 Pod (versão Beta) us-central1-a

    Europa

    Cloud TPU v2 e Preemptiva v2 europe-west4-a
    Cloud TPU v3 e Preemptiva v3 europe-west4-a
    Cloud TPU v2 Pod (versão Beta) europe-west4-a
    Cloud TPU v3 Pod (versão Beta) europe-west4-a

    Ásia-Pacífico

    Cloud TPU v2 e Preemptiva v2 asia-east1-c
  3. Use o comando gcloud container clusters para criar um cluster no GKE compatível com a Cloud TPU. Observe que o cluster 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 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.10 \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu
    

    No comando acima:

    • --cluster-version=1.10 indica que o cluster usará a versão mais recente do Kubernetes 1.10. É necessário usar a versão 1.10.4-gke.2 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 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…