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 no 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. O Tensor2Tensor (T2T) é uma biblioteca de conjuntos de dados e modelos de aprendizado profundo. Ele também fornece um grupo de scripts para treinar os modelos, além de fazer o download dos dados e prepará-los.

Antes de começar

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

    Acessar a página Gerenciar recursos

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

    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.

Crie um intervalo do Cloud Storage

É preciso um intervalo do Cloud Storage para armazenar os dados usados para treinar o modelo e os resultados do treinamento. 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 intervalo criado precisa residir na mesma região que a máquina virtual (VM, na sigla em inglês) e o dispositivo Cloud TPU ou fração do Cloud TPU (vários dispositivos TPU).

  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: Regional
    • localização: se quiser usar um dispositivo Cloud TPU, aceite o padrão apresentado. Caso queira usar uma fatia do pod do Cloud TPU, especifique uma região em que eles estão disponíveis.

Use a ferramenta ctpu

Nesta seção, mostramos o uso da ferramenta de provisionamento do Cloud TPU (ctpu) para criar e gerenciar recursos do projeto no Cloud TPU. Os recursos são compostos por uma máquina virtual (VM, na sigla em inglês) e um recurso do 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, consulte Como gerenciar recursos de VM e TPU.

Execute o 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 em que 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 do sinalizador, consulte Referência do CTPU.

  4. Configure um dispositivo do Google Cloud TPU ou uma fatia do Pod:

Dispositivo TPU

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

O comando ctpu up cria uma máquina virtual (VM, na sigla em inglês) e serviços do Cloud TPU.

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

Verifique 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;
    • YOUR-TMP_DIRECTORY é um local 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 um pod do Cloud TPU

É possível usar o modelo do transformer para modelar a 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 passa 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 pontos de verificação e resumos são armazenados durante o treinamento do 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. Para tornar esse modelo mais preciso, ajuste a sinalização --train_steps para aumentar o número de etapas de treinamento. É 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 passa 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 pontos de verificação e resumos são armazenados durante o treinamento do 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. Recomendamos que você aumente o número de etapas de treinamento. Basta ajustar 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 TPU

Use o modelo do transformer_encoder na 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

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 precisa 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 o Cloud TPU, para excluir a VM do Compute Engine e o 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 conforme 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…