Esta página foi traduzida pela API Cloud Translation.
Switch to English

Como treinar o ResNet na Cloud TPU com o GKE

Objetivos

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

No tutorial, você conhecerá as etapas para treinar o modelo usando um conjunto de dados fictício fornecido para teste:

  • Crie um bucket 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.

Requisitos e limitações

Ao definir sua 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. Veja mais informações sobre a versão na documentação do SDK.
  • Use a versão 1.15.3 ou posterior do TensorFlow. Determine a versão do TensorFlow usada pela Cloud TPU na especificação do pod do Kubernetes, conforme descrito abaixo.
  • É preciso criar o cluster do GKE e os pools de nós em uma zona em que a Cloud TPU esteja disponível. Também é possível criar os buckets do Cloud Storage para manter seus dados e modelos de treinamento na mesma região que o cluster do GKE. Este tutorial usa a zona us-central1-b.
  • Cada contêiner pode solicitar, no máximo, uma Cloud TPU. No entanto, é permitido que vários contêineres em um pod solicitem uma.
  • O autoescalador de clusters aceita o Cloud TPU no GKE 1.11.4-gke.12 e versões posteriores.
  • Seu cluster do GKE precisa ser um cluster nativo de VPC.

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

    Acessar a página do seletor de projetos

  3. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  4. Ao usar o 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 seguintes APIs no Console do Cloud:

Criar uma conta de serviço e um bucket do Cloud Storage

Você precisa ter um bucket do Cloud Storage para armazenar os resultados do treinamento do seu modelo de machine learning.

  1. Abra uma janela do Cloud Shell.

    Abrir o Cloud Shell

  2. Crie uma variável para o ID do seu projeto.

    export PROJECT_ID=project-id
    
  3. Crie uma conta de serviço para o projeto da Cloud TPU.

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    O comando retorna uma conta de serviço do Cloud TPU com o formato a seguir:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    
  4. Acesse a página do Cloud Storage no Console do Cloud.

    Acessar a página do Cloud Storage

  5. Crie um novo bucket especificando as opções a seguir:

    • Um nome exclusivo à sua escolha
    • Tipo de local: region
    • Local: us-central1
    • Classe de armazenamento padrão: Standard
    • Controle de acesso: fine-grained

    Antes de usar o bucket de armazenamento, autorize a conta de serviço do Cloud TPU a acessar o bucket. Use o link de controle de acesso acima para definir ACLs refinadas para sua conta de serviço da Cloud TPU.

Crie um cluster do GKE compatível com a Cloud TPU

É possível ativar o suporte do Cloud TPU em um novo cluster do GKE.

Como criar um novo cluster compatível com o Cloud TPU

É possível criar um cluster compatível com o Cloud TPU usando o Console do Cloud ou a ferramenta 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 Cloud.

    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.

  4. Em Tipo de local, selecione zonal e selecione a zona desejada em que você planeja usar um recurso do Cloud TPU. Neste tutorial, selecione a zona us-central1-b.

  5. Confirme se a Versão principal está definida como 1.13.4-gke.5 ou posterior, para garantir que ela seja compatível com o Cloud TPU.

  6. No painel de navegação, no pool de nós que você quer configurar, clique em Segurança.

  7. Selecione Permitir acesso completo a todas as APIs do Cloud. Isso garante que todos os nós no cluster tenham acesso ao bucket do Cloud Storage. O cluster e o bucket 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.

  8. No painel de navegação, em Cluster, clique em Rede.

  9. Selecione Ativar roteamento de tráfego nativo VPC (usa IP do alias), você precisará criar uma rede VPC, se não existir uma para o projeto atual.

  10. No painel de navegação, em Cluster, clique em Recursos.

  11. Selecione Ativar o Cloud TPU.

  12. Configure as outras opções do cluster como quiser. Você pode deixar as opções 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 da gcloudgcloud seja exibido. Execute-o em um Cloud Shell para se conectar.

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

  1. Instale os componentes gcloud, necessários para executar o GKE com o Cloud TPU:

    $ gcloud components install kubectl 
  2. Configure gcloud om o ID do projeto do Google Cloud:

    $ gcloud config set project project-name
    

    Substitua project-name pelo nome do projeto do Google Cloud.

    Na primeira vez que você executar esse comando em uma nova VM do Cloud Shell, será exibida uma página Authorize Cloud Shell. Clique em Authorize na parte inferior da página para permitir que gcloud faça chamadas de API do GCP com suas credenciais.

  3. Configure gcloud com a zona em que você planeja usar um recurso do Cloud TPU. Neste tutorial, use a zona us-central1-b:

    $ gcloud config set compute/zone us-central1-b
    
  4. Use o comando gcloud container clusters create para criar um cluster no GKE com suporte para o Cloud TPU. No comando a seguir, substitua cluster-name pelo nome de cluster de sua escolha:

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

    Descrições de sinalizações de comando

    cluster-version
    Indica que o cluster usará a versão mais recente do Kubernetes 1.16. Use a versão 243.0.0 1.13.4-gke.5 ou posterior.
    scopes
    Garante que todos os nós do cluster tenham acesso ao bucket do Cloud Storage. O cluster e o bucket 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 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.
    tpu-ipv4-cidr (opcional, não especificado acima)
    Indica o intervalo CIDR a ser usado para o Cloud TPU. Especifique IP_RANGE na forma de IP/20, como 10.100.0.0/20. Se essa sinalização não for especificada, um intervalo de CIDR de tamanho /20 será alocado e atribuído automaticamente.

    Quando o cluster for criado, você verá uma mensagem semelhante a esta:

    NAME             LOCATION       MASTER_VERSION    MASTER_IP     MACHINE_TYPE   NODE_VERSION      NUM_NODES  STATUS
    cluster-resnet  us-central1-b  1.16.15-gke.4901  34.71.245.25  n1-standard-1  1.16.15-gke.4901  3          RUNNING
    

Visualizar as operações

A ativação do suporte do Cloud TPU inicia uma operação de atualização. Para clusters zonais, essa operação leva cerca de 5 minutos e, para clusters regionais, ela leva cerca de 15 minutos, dependendo da região do cluster.

Para listar todas as operações concluídas e em execução no cluster, execute o seguinte comando:

   $ gcloud container operations list
   

Para mais informações sobre uma operação específica, execute o seguinte comando:

   $ gcloud container operations describe operation-id
   

Substitua operation-id pelo ID da operação específica.

A especificação do Job do GKE/ResNet

A especificação de job usada por este tutorial (mostrada abaixo) solicita um dispositivo preemptivo do Cloud TPU v2 com TensorFlow 2.3. Ele também inicia um processo de processo do TensorBoard.

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

apiVersion: batch/v1
kind: Job
metadata:
  name: resnet-tpu
spec:
  template:
    metadata:
      annotations:
        # The Cloud TPUs that will be created for this Job will support
        # TensorFlow 2.3. This version MUST match the
        # TensorFlow version that your model is built on.
        tf-version.cloud-tpus.google.com: "2.3"
    spec:
      restartPolicy: Never
      containers:
      - name: resnet-tpu
        # The official TensorFlow 2.3.0 image.
        # https://hub.docker.com/r/tensorflow/tensorflow
        image: tensorflow/tensorflow:2.3.0
        command:
        - bash
        - -c
        - |
          pip install tf-models-official==2.3.0
          python3 -m official.vision.image_classification.resnet.resnet_ctl_imagenet_main \
            --tpu=$(KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS) \
            --distribution_strategy=tpu \
            --steps_per_loop=500 \
            --log_steps=500 \
            --use_synthetic_data=true \
            --dtype=fp32 \
            --enable_tensorboard=true \
            --train_epochs=90 \
            --epochs_between_evals=1 \
            --batch_size=1024 \
            --model_dir=gs://bucket-name/resnet
        resources:
          limits:
            # Request a single Preemptible v2-8 Cloud TPU device to train the
            # model. A single v2-8 Cloud TPU device consists of 4 chips, each of
            # which has 2 cores, so there are 8 cores in total.
            cloud-tpus.google.com/preemptible-v2: 8
      - name: tensorboard
        image: tensorflow/tensorflow:2.2.0
        command:
        - bash
        - -c
        - |
          pip install tensorboard-plugin-profile==2.3.0 cloud-tpu-client
          tensorboard --logdir=gs://bucket-name/resnet --port=6006
        ports:
        - containerPort: 6006

Crie o job

Siga estas etapas para criar o job no cluster do GKE:

  1. Usando um editor de texto, crie uma especificação de job, example-job.yaml, e copie e cole na especificação de job mostrada acima. Lembre-se de substituir a variável bucket-name no parâmetro --model_dir e no comando do Tensorflow pelo nome do bucket de armazenamento.

  2. Execute o job:

    $ kubectl create -f example-job.yaml
    

    Esse comando cria o job que programa o pod automaticamente e retorna a saída a seguir.

    job "resnet-tpu" created
  3. Verifique se o pod foi programado e se os nós da Cloud TPU foram provisionados. Um pod que solicita nós da Cloud TPU pode permanecer pendente por até cinco minutos antes de ser executado. Até que o pod seja programado, a resposta será semelhante à mostrada a seguir.

    $ kubectl get pods -w
    
    A resposta inicial precisa exibir:
    
    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   0/1       Pending   0          1m
    

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

    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   1/1       Running   0          6m
    

  4. Quando STATUS mostrar running, o treinamento terá iniciado. Digite CTRL-C para sair do processo kubectl get pods -w.

Ver o status e os registros dos contêineres do Cloud TPU e do TensorBoard

Siga estas etapas para verificar o status e visualizar os registros das instâncias do Cloud TPU e do TensorBoard usadas pelos pods do Kubernetes.

  1. Crie especificações de implantação e serviço usando as seguintes etapas:

    Acessar a página do GKE

  2. Na barra de navegação à esquerda, clique em Cargas de trabalho.

  3. Selecione o job. Isso leva você a uma página que inclui um cabeçalho Pods gerenciados.

  4. Em Pods gerenciados, selecione o pod do Kubernetes. Isso levará você a uma página que inclui um cabeçalho Contêineres.

  5. Em Contêineres, uma lista de contêineres é exibida. A lista inclui todas as instâncias do Cloud TPU e do TensorBoard. Para cada contêiner, são exibidas as seguintes informações:

    1. O status de execução
    2. Link para os registros do contêiner

Como usar o TensorBoard para visualizar métricas e analisar o desempenho

No TensorBoard, há um conjunto de ferramentas projetadas para apresentar visualmente as métricas do TensorFlow. Com o TensorBoard é possível identificar gargalos no processamento e receber sugestões para melhorar o desempenho.

O TensorFlow Profiler (em inglês) é um plug-in do TensorBoard usado para capturar um perfil em um Cloud TPU individual ou um Pod do Cloud TPU, que pode ser visualizado no TensorBoard. Consulte a documentação sobre ferramentas da TPU para ver detalhes sobre as ferramentas de visualização e quais informações podem ser capturadas.

Siga estas etapas para executar o TensorBoard no cluster do GKE:

  1. Siga as etapas para visualizar o status do TensorBoard e verificar se a instância do TensorBoard está sendo executada em um contêiner.

  2. Encaminhe o encaminhamento para o pod do Kubernetes Kubernetes:

    $ kubectl port-forward pod/resnet-tpu-pod-id 6006
    

    em que pod-id é o último conjunto de dígitos do nome do pod do GKE mostrado no Console em: Kubernetes Engine > Cargas de trabalho > Pods gerenciados. Exemplo: resnet-tpu-wxskc.

  3. Na barra do canto superior direito do Cloud Shell, clique no botão Web preview e abra a porta 6006 para ver a saída do TensorBoard. A interface do usuário do TensorBoard aparecerá no seu navegador como uma guia.

  4. Selecione PROFILE no menu suspenso no canto superior direito da página do TensorBoard.

  5. Clique no botão CAPTURE PROFILE na página PROFILE.

  6. No menu pop-up, selecione o tipo de endereço do nome da TPU e insira o nome. O nome da TPU aparece na página Compute Engine > TPUs do Console do Cloud com o seguinte formato:

    gke-cluster-name-cluster-id-tpu-tpu-id
    
    Por exemplo:
    gke-demo-cluster-25cee208-tpu-4b90f4c5

  7. Selecione o botão CAPTURE no menu pop-up quando estiver pronto para começar a criação de perfil e aguarde alguns segundos para que o perfil seja concluído.

  8. Atualize seu navegador para ver dados de rastreamento na guia PROFILE no TensorBoard.

Para mais informações sobre como capturar e interpretar perfis, consulte o guia do criador de perfil do TensorFlow (em inglês).

Limpeza

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

Console

Exclua seu Cluster do GKE:

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

    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 bucket do Cloud Storage criado durante este tutorial:

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

    Acessar a página do Cloud Storage

  2. Marque a caixa de seleção ao lado do bucket 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

  1. Execute o seguinte comando para excluir o cluster do GKE, substituindo cluster-name pelo nome do cluster e project-name pelo nome do projeto do Google Cloud:

    $ gcloud container clusters delete cluster-name --zone=us-central1-b --project=project-name
    

    Esse comando exclui o cluster, o contêiner e o Cloud TPU.

  2. Ao terminar de examinar os dados, use o comando gsutil para excluir o bucket do Cloud Storage criado durante este tutorial. Substitua bucket-name pelo nome do seu bucket do Cloud Storage:

    $ gsutil rm -r gs://bucket-name
    

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

A seguir

  • Use uma das especificações de job abaixo para executar mais modelos e jobs de recuperação de conjuntos de dados: