Como executar o Transformer com o Tensor2Tensor

Neste tutorial, veja como treinar o modelo do Transformer, apresentado no artigo Attention Is All You Need, usando o Tensor2Tensor em um 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: codificador e decodificador, para modelagem de sequência a sequência. Exemplo de caso de uso: tradução.
  • transformer: somente decodificador, para modelagem de sequência única. Exemplo de caso de uso: modelagem de linguagem.
  • 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. Estas instruções incluem componentes faturáveis do Google Cloud Platform. Consulte a página de preços do Cloud TPU para estimar os custos. Depois, siga as instruções para limpar os recursos quando eles não forem mais necessários.

Criar um intervalo do Cloud Storage

Você precisa de um intervalo do Cloud Storage para armazenar os dados usados para treinar o modelo de aprendizado de máquina, bem como os resultados do treinamento.

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

Abrir o Cloud Shell e usar a ferramenta ctpu

Neste guia, usamos o Cloud TPU Provisioning Utility (ctpu) como uma ferramenta simples para configurar e gerenciar o Cloud TPU. O guia executa o ctpu a partir de um Cloud Shell. Para encontrar opções de configuração mais avançadas, consulte a configuração personalizada.

A ferramenta ctpu vem pré-instalada no Cloud Shell. Siga estas etapas para verificar a configuração do ctpu:

  1. Abra uma janela do Cloud Shell.

    Abrir o Cloud Shell

  2. Para verificar a configuração do ctpu, digite o seguinte no Cloud Shell:

    $ ctpu print-config
    

    Você verá uma mensagem como esta:

    2018/04/29 05:23:03 WARNING: Setting zone to "us-central1-b"
    ctpu configuration:
            name: [your TPU's name]
            project: [your-project-name]
            zone: us-central1-b
    If you would like to change the configuration for a single command invocation, please use the command line flags.
    

  3. Confira os comandos do ctpu:

    $ ctpu

    Você verá um guia de uso, incluindo uma lista de subcomandos e sinalizações com uma breve descrição de cada.

Criar uma VM do Compute Engine e um Cloud TPU

Execute o comando a seguir para configurar uma máquina virtual (VM, na sigla em inglês) do Compute Engine e um Cloud TPU com serviços associados. Essa combinação de recursos e serviços é chamada de lote do Cloud TPU:

$ ctpu up

Com o comando ctpu up, você executa as tarefas a seguir:

  • Ativar os serviços do Cloud TPU e Compute Engine.
  • Criar uma VM do Compute Engine com a última versão estável do TensorFlow pré-instalada. A zona padrão é us-central1-b. Como referência, o Cloud TPU está disponível nas zonas a seguir:

    • Estados Unidos (EUA)
      • us-central1-b
      • us-central1-c
      • us-central1-f (apenas o programa TFRC)
    • Europa (EU)
      • europe-west4-a
    • Ásia-Pacífico (APAC)
      • asia-east1-c

  • Criar um Cloud TPU com a versão correspondente do TensorFlow e transmitir o nome do Cloud TPU para a VM do Compute Engine como uma variável de ambiente (TPU_NAME).

  • Garantir que o Cloud TPU tenha acesso aos recursos necessários no projeto do GCP. Isso é feito ao conceder papéis específicos do IAM à conta de serviço do Cloud TPU.
  • Executar várias outras verificações.
  • Fazer login na nova VM do Compute Engine.

É possível executar ctpu up quantas vezes quiser. Por exemplo, se você perder a conexão SSH com a VM do Compute Engine, basta executar ctpu up para restaurá-la.

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 a execução do comando ctpu up terminar, siga as seguintes etapas:

  1. Verifique se o prompt do shell mudou de username@project para username@username. Essa alteração mostra que você fez login na VM do Compute Engine.

  2. Execute o comando a seguir para verificar a instalação do TensorFlow:

    (vm)$ python -c "import tensorflow; print(tensorflow.VERSION)"
    

    Você verá uma mensagem de aviso seguida por uma linha que exibe o número da versão do TensorFlow. Por exemplo: 1.8.0.

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 espaço no disco local.

Pule esta etapa se você executa o t2t-datagen na máquina local (execute pip install tensor2tensor e depois consulte o comando t2t-datagen 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)$ STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
    (vm)$ DATA_DIR=$STORAGE_BUCKET/data/
    (vm)$ TMP_DIR=/mnt/disks/mnt-dir/t2t_tmp

    em que:

    • YOUR-BUCKET-NAME é o nome do intervalo do Cloud Storage;
    • DATA_DIR é um local no Cloud Storage;
    • TMP_DIR é um local no disco que você adicionou à VM do Compute Engine no início do tutorial.
  2. Crie um diretório temporário no disco que você adicionou à VM do Compute Engine no início do tutorial:

    (vm)$ mkdir /mnt/disks/mnt-dir/t2t_tmp

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

Para ver os dados no 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. Você verá arquivos fragmentados chamados de translate_ende_wmt32k_packed-train e translate_ende_wmt32k_packed-dev.

Treinar um modelo de tradução de inglês para alemão

Execute os comandos a seguir na VM do Compute Engine:

  1. Configure variáveis de ambiente na porta e endereço IP da máquina do TPU. Para encontrar o endereço IP, execute o comando a seguir:

    (vm)$ gcloud compute tpus list

    O comando acima exibe o endereço IP em NETWORK_ENDPOINT:

    NAME       ZONE           ACCELERATOR_TYPE  NETWORK_ENDPOINT   NETWORK  RANGE          STATUS
    demo-tpu   us-central1-b  v2-8              10.240.1.2:8470    default  10.240.1.0/29  READY
    

    Defina estas variáveis de ambiente:

    (vm)$ TPU_IP=10.240.1.2
    (vm)$ TPU_MASTER=grpc://$TPU_IP:8470

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

  3. 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 \
      --master=$TPU_MASTER

    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.

  4. 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. É possível iniciar o tensorboard apontando para esse diretório e ver as métricas de treinamento e avaliação.

Treinar um modelo de linguagem

Você também pode usar o modelo do transformer na modelagem da linguagem. Execute os comandos a seguir para gerar os dados de treinamento e especificar o arquivo de saída:

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

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

(vm)$ t2t-trainer \
  --model=transformer \
  --hparams_set=transformer_tpu \
  --problem=languagemodel_lm1b8k_packed \
  --train_steps=10 \
  --eval_steps=8 \
  --data_dir=$DATA_DIR \
  --output_dir=$OUT_DIR \
  --use_tpu=True \
  --master=$TPU_MASTER

Esse modelo converge depois de aproximadamente 250.000 etapas.

Treinar um classificador de sentimento

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=2 \
  --data_dir=$DATA_DIR \
  --output_dir=$OUT_DIR \
  --use_tpu=True \
  --master=$TPU_MASTER

Esse modelo atinge aproximadamente 85% de precisão após cerca de 2.000 etapas.

Limpar

  1. Encerre a conexão com a VM do Compute Engine:

    (vm)$ exit
    

    O prompt agora será user@projectname, mostrando que você está no Cloud Shell.

  2. No Cloud Shell, execute o comando a seguir para excluir a VM do Compute Engine e o Cloud TPU:

    $ ctpu delete
    

  3. Execute ctpu status para garantir que você não tenha instâncias alocadas. A exclusão pode levar até dois 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.
            GCE VM:     --
            Cloud TPU:  --
    

  4. Quando você não precisar mais do intervalo do Cloud Storage criado neste tutorial, use o comando gsutil para excluí-lo. Substitua YOUR-BUCKET-NAME pelo nome do intervalo no Cloud Storage:

    $ gsutil rm -r gs://YOUR-BUCKET-NAME
    

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

Próximas etapas

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

Enviar comentários sobre…