Como executar o Transformer com o Tensor2Tensor

Neste tutorial, mostramos como treinar o modelo do Transformer (em inglês), apresentado no artigo Attention Is All You Need, usando o Tensor2Tensor na Cloud TPU.

Descrição do modelo

O modelo do Transformer usa pilhas de camadas de autoatenção e de encaminhamento de feed para processar entradas sequenciais como texto. Ele é compatível com as variantes a seguir:

  • transformer: somente decodificador, para modelagem de sequência única. Exemplo de caso de uso: modelagem de linguagem.
  • transformer: codificador e decodificador, para modelagem de sequência a sequência. Exemplo de caso de uso: tradução.
  • transformer_encoder: somente codificador, para a sequência na modelagem de classe. Exemplo de caso de uso: classificação de sentimento.

O Transformer é apenas um dos modelos na biblioteca do Tensor2Tensor. Tensor2Tensor (T2T) é uma biblioteca de modelos de aprendizado profundo e conjuntos de dados, além de um conjunto de scripts que permite treinar os modelos, fazer o download e preparar os dados.

Antes de começar

Se você planeja treinar em uma fração do pod da TPU, analise este documento que explica as considerações especiais ao treinar em uma fração de Pod.

Antes de começar o tutorial, siga as etapas abaixo para verificar 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. 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. Verifique se você tem cota suficiente para usar dispositivos TPU ou pods.

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

Para armazenar os dados usados para treinar o modelo e os resultados do treinamento, você precisa de um intervalo do Cloud Storage. 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 e do nó da TPU. As VMs e os nós da 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
    • Default storage class: Standard
    • Local: especifique um local de intervalo na mesma região em que você planeja criar seu nó de TPU. Veja tipos e zonas de TPU para saber onde vários tipos de TPU estão disponíveis.

Usar a ferramenta ctpu

Nesta seção, você verá como usar a ferramenta de provisionamento da Cloud TPU (em inglês), ctpu, para criar e gerenciar recursos de projeto da Cloud TPU. Os recursos incluem uma máquina virtual (VM, na sigla em inglês) e um recurso da 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. Para mais informações e detalhes consulte a página como criar e excluir TPUs.

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 no qual você quer criar o Cloud TPU.

  3. Execute ctpu up especificando as sinalizações mostradas para um dispositivo Cloud TPU ou para uma fração de pod. Para opções e descrições de sinalização, consulte Referência do CTPU.

  4. Configure um dispositivo Cloud TPU ou uma fração de pod:

Dispositivo TPU

Configure um dispositivo 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 da Cloud TPU.

Pod de TPU

Configure uma fatia do Cloud TPU na VM e na zona em que você está trabalhando:

$ ctpu up --zone=us-central1-a --tpu-size=v2-32 --machine-type n1-standard-8 

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 da Cloud TPU.

O comando ctpu up cria uma máquina virtual (VM) e serviços da Cloud TPU.

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

Verificar a VM do Compute Engine

Quando o comando ctpu up for concluído, verifique se o prompt do shell é username@tpuname, o que mostra que você está conectado à VM do Compute Engine.

Determinar se você precisa adicionar espaço em disco à VM

Por questões práticas, o T2T empacota a geração de dados de muitos conjuntos comuns de código aberto no script t2t-datagen. Ele faz o download e o pré-processamento dos dados, além de prepará-los para o treinamento. Para isso, é necessário pelo menos 200 GB de espaço no disco local.

É possível ignorar esta etapa se você tiver usado ctpu up para criar a VM do Compute Engine, porque ele fornece 250 GB de espaço em disco para a VM. Se você configurou a VM do Compute Engine usando os comandos do gcloud ou o Console do Cloud e não especificou o tamanho do disco da VM com pelo menos 200 GB, siga as instruções abaixo.

  • Siga o guia do Compute Engine para adicionar um disco à VM do Compute Engine.
  • Defina o tamanho do disco como 200 GB (mínimo recomendado).
  • Defina Ao excluir uma instância como Excluir disco para garantir que o disco seja removido quando você excluir a VM.

Anote o caminho do novo disco. Por exemplo, /mnt/disks/mnt-dir.

Gerar o conjunto de dados de treinamento

Na VM do Compute Engine:

  1. Crie as variáveis de ambiente a seguir:

    (vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
    (vm)$ export DATA_DIR=$STORAGE_BUCKET/data
    (vm)$ export TMP_DIR=YOUR-TMP-DIRECTORY

    em que:

    • YOUR-BUCKET-NAME é o nome do intervalo do Cloud Storage.
    • DATA_DIR é um local no Cloud Storage que contém os dados de treinamento e avaliação.
    • YOUR-TMP_DIRECTORY é um local usado para armazenar dados temporários. Se você adicionou um disco à VM do Compute Engine, será um local no disco adicionado, por exemplo, /mnt/disks/mnt-dir/t2t_tmp. Caso contrário, será um diretório temporário na VM, por exemplo, /tmp/t2t_tmp.
  2. Se você adicionou um novo disco à VM do Compute Engine, crie um diretório temporário no disco adicionado.

    (vm)$ mkdir /mnt/disks/mnt-dir/t2t_tmp
  3. Adicione o caminho para os scripts tensor2tensor usados para processar os dados do modelo:

    (vm)$ export PATH=.local/bin:$PATH
  4. Use o script t2t-datagen para gerar os dados de avaliação e treinamento no intervalo do Cloud Storage. Assim, o Cloud TPU pode acessar os dados:

    (vm)$ t2t-datagen --problem=translate_ende_wmt32k_packed --data_dir=$DATA_DIR --tmp_dir=$TMP_DIR

O processo de download, pré-processamento e upload para o Cloud Storage leva aproximadamente duas horas. É possível visualizar os dados no Cloud Storage:

  1. Navegue até o Console do Google Cloud Platform.
  2. Selecione Armazenamento no menu à esquerda.
  3. Clique no nome do intervalo criado para este tutorial.

Você verá os arquivos fragmentados translate_ende_wmt32k_packed-train e translate_ende_wmt32k_packed-dev.

Treinar um modelo de linguagem em uma única TPU ou em um pod do Cloud TPU

Você pode usar o modelo transformer para modelagem de linguagem. Para gerar os dados de treinamento e especificar o arquivo de saída, execute os seguintes comandos:

(vm)$ export OUT_DIR=$STORAGE_BUCKET/training/transformer_lang_model
(vm)$ t2t-datagen --problem=languagemodel_lm1b32k_packed --data_dir=$DATA_DIR --tmp_dir=$TMP_DIR

O processo de download, pré-processamento e upload para o Cloud Storage leva aproximadamente duas horas.

Para treinar e avaliar o modelo em um único dispositivo ou pod do Cloud TPU, execute o seguinte comando:

Dispositivo TPU

  1. (vm)$ t2t-trainer \
      --model=transformer \
      --hparams_set=transformer_tpu \
      --problem=languagemodel_lm1b32k_packed \
      --train_steps=10 \
      --eval_steps=3 \
      --data_dir=$DATA_DIR \
      --output_dir=$OUT_DIR \
      --use_tpu=True \
      --cloud_tpu_name=$TPU_NAME
  • --cloud_tpu_name 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).
  • --data_dir especifica o caminho do Cloud Storage para a entrada do treinamento. Ele é definido como um diretório de dados em um intervalo do Cloud Storage.
  • --output_dir especifica o diretório em que os checkpoints e resumos são armazenados durante o treinamento de modelo. Se a pasta não existir, ela será criada pelo programa.

O comando acima executa 10 etapas de treinamento e três de avaliação. A execução leva aproximadamente 5 minutos em um nó de TPU v3-8. Para deixar esse modelo mais preciso, é necessário aumentar o número de passos de treinamento ajustando a sinalização --train_steps. É recomendado treinar o modelo usando pelo menos 40 mil etapas. O modelo costuma atingir qualidade máxima após aproximadamente 250 mil etapas.

Pod de TPU

  1. (vm)$ t2t-trainer \
        --problem=languagemodel_lm1b32k_packed \
        --use_tpu \
        --model=transformer \
        --hparams_set=transformer_tpu \
        --cloud_tpu_name=$TPU_NAME \
        --data_dir=$DATA_DIR \
        --output_dir=$OUT_DIR \
        --tpu_num_shards=32  \
        --schedule=train \
        --train_steps=25000 \
        --eval_steps=3
    
    • --cloud_tpu_name 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).
    • --data_dir especifica o caminho do Cloud Storage para a entrada do treinamento.
    • --output_dir especifica o diretório em que os checkpoints e resumos são armazenados durante o treinamento de modelo. Se a pasta não existir, ela será criada pelo programa.

O comando acima executa 25 mil etapas de treinamento e três de avaliação. Esse treinamento leva aproximadamente 30 minutos para ser concluído em um Cloud TPU v2-32. É recomendado treinar o modelo usando pelo menos 40 mil etapas. O modelo costuma atingir qualidade máxima após aproximadamente 250 mil etapas.

Treinar um modelo de tradução inglês-alemão em uma única TPU

Execute os comandos a seguir na VM do Compute Engine:

  1. Configure uma variável de ambiente no diretório de treinamento, que precisa ser um local do Cloud Storage:

    (vm)$ OUT_DIR=$STORAGE_BUCKET/training/transformer_ende_1
  2. Execute t2t-trainer para treinar e avaliar o modelo:

    (vm)$ t2t-trainer \
      --model=transformer \
      --hparams_set=transformer_tpu \
      --problem=translate_ende_wmt32k_packed \
      --train_steps=10 \
      --eval_steps=3 \
      --data_dir=$DATA_DIR \
      --output_dir=$OUT_DIR \
      --use_tpu=True \
      --cloud_tpu_name=$TPU_NAME

    O comando acima executa 10 etapas de treinamento e três de avaliação. A execução leva aproximadamente 5 minutos em um nó de TPU v3-8. É possível (e recomendável) aumentar o número de etapas de treinamento ajustando a sinalização --train_steps. As traduções geralmente se tornam razoáveis após cerca de 40 mil etapas. O modelo costuma atingir qualidade máxima após aproximadamente 250 mil etapas.

  3. Para ver a saída no intervalo do Cloud Storage, acesse o Console do Google Cloud Platform e selecione Armazenamento no menu à esquerda. Clique no nome do intervalo que você criou para este tutorial. No intervalo, acesse o diretório de treinamento para ver a saída do modelo. Por exemplo, /training/transformer_ende_1.

  4. Para ver as métricas de treinamento e avaliação, inicie o TensorBoard e indique o diretório de treinamento no Cloud Storage.

Treinar um classificador de sentimento em uma única Cloud TPU

Você pode usar o modelo transformer_encoder para classificação de sentimento. Execute os comandos a seguir para gerar os dados de treinamento e especificar o arquivo de saída:

(vm)$ t2t-datagen --problem=sentiment_imdb --data_dir=$DATA_DIR --tmp_dir=$TMP_DIR
(vm)$ OUT_DIR=$STORAGE_BUCKET/training/transformer_sentiment_classifier

Execute o comando a seguir para treinar e avaliar o modelo:

(vm)$ t2t-trainer \
  --model=transformer_encoder \
  --hparams_set=transformer_tiny_tpu \
  --problem=sentiment_imdb \
  --train_steps=10 \
  --eval_steps=1 \
  --data_dir=$DATA_DIR \
  --output_dir=$OUT_DIR \
  --use_tpu=True \
  --cloud_tpu_name=$TPU_NAME

O comando acima executa 10 etapas de treinamento e três de avaliação. A execução leva aproximadamente 5 minutos em um nó de TPU v3-8. Esse modelo atinge aproximadamente 85% de precisão após cerca de 2.000 etapas.

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 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 a Cloud TPU para excluir a VM do Compute Engine e a Cloud TPU:

    $ ctpu delete [optional: --zone]
    
  3. Execute ctpu status para verificar se não há instâncias alocadas e evitar cobranças desnecessárias pelo uso da 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, como mostrado, substituindo 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.