Cloud TPU での Tensor2Tensor を使用した Transformer の実行

このチュートリアルでは、Cloud TPU で Tensor2Tensor を使用して Transformer モデル(Attention Is All You Need のモデル)をトレーニングする方法を説明します。

モデルの説明

Transformer モデルは、数多くの自己注意レイヤとフィードフォワード レイヤを使用して、テキストなどの順次入力を処理します。次のバリアントがサポートされています。

  • 単一のシーケンスのモデリング用の transformer(デコーダのみ)。ユースケース: 言語モデリング。
  • シーケンスからシーケンスへのモデリング用の transformer(エンコーダ - デコーダ)。ユースケース: 翻訳。
  • transformer_encoder(エンコーダのみ)は、シーケンスからクラスへのモデリング用のエンコーダのみを実行します。使用例: 勘定分類。

Transformer は、Tensor2Tensor ライブラリのモデルの 1 つにすぎません。Tensor2Tensor(T2T)は、ディープ ラーニング モデルとデータセットのライブラリであり、モデルのトレーニングとデータのダウンロードや準備を行えるスクリプトのセットです。

目標

  • トレーニング データセットを生成する
  • 単一の Cloud TPU または Cloud TPU Pod で言語モデルをトレーニングする
  • 単一の Cloud TPU で英語 - ドイツ語の翻訳モデルをトレーニングする
  • 単一の Cloud TPU で感情分類子をトレーニングする
  • Cloud TPU リソースをクリーンアップする

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

TPU Pod スライスのトレーニングを行う場合は、TPU ポッドでのトレーニングをお読みいただき、Pod スライスのトレーニングについて特に留意すべき事項をご確認ください。

このチュートリアルを開始する前に、次のステップに従って、Google Cloud プロジェクトが正しく設定されていることを確認します。

このセクションでは、Cloud Storage バケットと Compute Engine VM の設定について説明します。

  1. Cloud Shell ウィンドウを開きます。

    Cloud Shell を開く

  2. プロジェクト ID の変数を作成します。

    export PROJECT_ID=project-id
    
  3. Cloud TPU を作成するプロジェクトを使用するように gcloud コマンドライン ツールを構成します。

    gcloud config set project ${PROJECT_ID}
    
  4. 次のコマンドを使用して Cloud Storage バケットを作成します。

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 -b on gs://bucket-name
    

    この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。

  5. ctpu up コマンドを使用して、Compute Engine VM を起動します。

    ctpu up --zone=europe-west4-a \
    --vm-only \
    --disk-size-gb=300 \
    --machine-type=n1-standard-8 \
    --tf-version=1.15.3 \
    --name=transformer-tutorial
    
  6. 指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。

  7. ctpu up コマンドの実行が終了したら、shell プロンプトが username@projectname から username@vm-name に変更されたことを確認します。変更されていれば、Compute Engine VM にログインしていることになります。

    gcloud compute ssh transformer-tutorial --zone=europe-west4-a
    

    これらの手順を続行する場合は、VM セッション ウィンドウで、(vm)$ で始まる各コマンドを実行します。

Compute Engine VM の場合:

  1. 次の環境変数を作成します。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/transformer
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
    (vm)$ export TMP_DIR=${HOME}/t2t_tmp
  2. 一時ファイルを保存するためのディレクトリを作成します。

    (vm)$ mkdir ${TMP_DIR}
  3. モデルデータの処理に使用される tensor2tensor スクリプトへのパスを追加します。

    (vm)$ export PATH=.local/bin:${PATH}

単一の Cloud TPU で言語モデルをトレーニングする

  1. 言語モデルのトレーニング データセットを生成します。

    (vm)$ t2t-datagen --problem=languagemodel_lm1b32k_packed \
     --data_dir=${DATA_DIR} \
     --tmp_dir=${TMP_DIR}
  2. 次のコマンドを実行して Cloud TPU リソースを作成します。

    (vm)$ ctpu up --tpu-only \
     --tf-version=1.15.3 \
     --name=transformer-tutorial
  3. TPU 名の環境変数を設定します。

    (vm)$ export TPU_NAME=transformer-tutorial
  4. トレーニング スクリプトを実行します。

    (vm)$ t2t-trainer \
     --model=transformer \
     --hparams_set=transformer_tpu \
     --problem=languagemodel_lm1b32k_packed \
     --eval_steps=3 \
     --data_dir=${DATA_DIR} \
     --output_dir=${MODEL_DIR}/language_lm1b32k \
     --use_tpu=True \
     --cloud_tpu_name=${TPU_NAME} \
     --train_steps=10

    上記のコマンドは 10 ステップのトレーニングを行い、その後、3 ステップの評価を行います。v3-8 TPU ノードでは約 5 分で実行されます。このモデルをより正確にするには、--train_steps フラグを調整してトレーニング ステップ数を増やす必要があります。モデルのトレーニングには、少なくとも 40,000 のステップを使用することをおすすめします。このモデルは通常、約 250,000 ステップ後に最大限の品質に収束します。

  5. 作成した Cloud TPU リソースを削除します。

    (vm)$ ctpu delete --tpu-only --zone=europe-west4-a --name=transformer-tutorial

Cloud TPU Pod で言語モデルをトレーニングする

  1. 使用する Pod スライスを指定するための tpu-sizeパラメータを使用して、ctpu up コマンドを実行します。たとえば、次のコマンドは v2-32 Pod スライスを使用します。

    (vm)$ ctpu up --tpu-only \
     --tpu-size=v2-32 \
     --zone=europe-west4-a \
     --tf-version=1.15.3 \
     --name=transformer-tutorial-pod
  2. 新しい TPU 名の環境変数を設定します。

    (vm)$ export TPU_NAME=transformer-tutorial-pod
  3. トレーニング スクリプトを実行します。

    (vm)$ t2t-trainer \
     --model=transformer \
     --hparams_set=transformer_tpu \
     --problem=languagemodel_lm1b32k_packed \
     --eval_steps=3 \
     --data_dir=${DATA_DIR} \
     --output_dir=${MODEL_DIR}/language_lm1b32k_pod \
     --use_tpu=True \
     --cloud_tpu_name=${TPU_NAME} \
     --tpu_num_shards=32  \
     --schedule=train \
     --train_steps=25000

    上記のコマンドは 25,000 ステップのトレーニングを行った後、3 ステップの評価を行います。Cloud TPU v2-32 では、このトレーニングの完了までに約 30 分かかります。

    モデルのトレーニングには、少なくとも 40,000 のステップを使用することをおすすめします。このモデルは通常、約 250,000 ステップ後に最大限の品質に収束します。

  4. 単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。

    (vm)$ ctpu delete --tpu-only \
     --zone=europe-west4-a \
     --name=transformer-tutorial-pod

単一の Cloud TPU で英語 - ドイツ語の翻訳モデルをトレーニングする

  1. t2t-datagen スクリプトを使用して、Cloud Storage バケットの翻訳モデルのトレーニング データと評価データを生成します。

    (vm)$ t2t-datagen \
     --problem=translate_ende_wmt32k_packed \
     --data_dir=${DATA_DIR} \
     --tmp_dir=${TMP_DIR}
  2. 次のコマンドを実行して Cloud TPU リソースを作成します。

    (vm)$ ctpu up --tpu-only \
     --tf-version=1.15.3 \
     --name=transformer-tutorial
  3. 新しい TPU 名の環境変数を設定します。

    (vm)$ export TPU_NAME=transformer-tutorial
  4. t2t-trainer を実行して、モデルのトレーニングと評価を行います。

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

    上記のコマンドは 10 ステップのトレーニングを行い、その後、3 ステップの評価を行います。v3-8 TPU ノードでは約 5 分で実行されます。--train_steps フラグを調整して、トレーニングのステップ数を増やします。翻訳は、通常、約 40,000 ステップ後に妥当になります。このモデルは、通常、約 25 万ステップ後に最高品質に収束します。

  5. 単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。

    (vm)$ ctpu delete --tpu-only --zone=europe-west4-a --name=transformer-tutorial

単一の Cloud TPU で感情分類子モデルをトレーニングする

  1. 感情分類子モデルのデータセットを生成します。

    (vm)$ t2t-datagen --problem=sentiment_imdb \
     --data_dir=${DATA_DIR} \
     --tmp_dir=${TMP_DIR}
  2. 次のコマンドを実行して Cloud TPU リソースを作成します。

    (vm)$ ctpu up --tpu-only \
     --tf-version=1.15.3 \
     --name=transformer-tutorial
  3. トレーニング スクリプトを実行します。

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

    上記のコマンドは 10 ステップのトレーニングを行い、その後、3 ステップの評価を行います。v3-8 TPU ノードでは約 5 分で実行されます。このモデルは、約 2,000 ステップ後に約 85% の精度を達成します。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

  1. Compute Engine インスタンスとの接続を切断していない場合は切断します。

    (vm)$ exit
    

    プロンプトが username@projectname に変わります。これは、現在、Cloud Shell 内にいることを示しています。

  2. Cloud Shell で、Cloud TPU の設定時に使用した --zone フラグを指定して ctpu delete を実行し、Compute Engine VM と Cloud TPU を削除します。

    $ ctpu delete --zone=europe-west4-a \
    --name=transformer-tutorial
    
  3. 次のコマンドを実行して、Compute Engine VM と Cloud TPU がシャットダウンされたことを確認します。

    $ ctpu status --zone=europe-west4-a
    

    削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

    2018/04/28 16:16:23 WARNING: Setting zone to "europe-west4-a"
    No instances currently exist.
     Compute Engine VM:     --
     Cloud TPU:             --
    
  4. 次に示すように gsutil を実行します。bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えてください。

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

次のステップ