Tensor2Tensor を使用して Transformer を実行する

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

モデルの説明

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

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

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

始める前に

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

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

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP Console のプロジェクト セレクタのページで、GCP プロジェクトを選択または作成します。

    プロジェクト セレクタのページに移動

  3. Google Cloud Platform プロジェクトに対して課金が有効になっていることを確認します。 詳しくは、課金を有効にする方法をご覧ください。

  4. TPU デバイスかポッドを使用するために十分な割り当て量があることを確認します。

リソースを設定する

このセクションでは、チュートリアルで使用する Cloud Storage のストレージ、VM、Cloud TPU の各リソースを設定する方法を説明します。

Cloud Storage バケットを作成する

モデルのトレーニングに使用するデータとトレーニング結果を格納するには、Cloud Storage バケットが必要です。このチュートリアルで使用する ctpu up ツールは、Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。

バケットのロケーションとしては、仮想マシン(VM)および TPU ノードと同じリージョン内のロケーションを指定する必要があります。VM と TPU ノードは、リージョン内のサブディビジョンである特定のゾーンにあります。

  1. GCP Console の Cloud Storage ページに移動します。

    Cloud Storage ページに移動

  2. 次のオプションを指定して新しいバケットを作成します。

    • 任意の一意の名前
    • デフォルトのストレージ クラス: Standard
    • ロケーション: TPU ノードを作成する予定のリージョンと同じリージョンのバケットのロケーションを指定します。さまざまな TPU タイプを使用可能な場所については、TPU タイプとゾーンをご覧ください。

ctpu ツールを使用する

このセクションでは、Cloud TPU プロビジョニング ツールctpu)を使用して Cloud TPU プロジェクトのリソースを作成、管理する方法を説明します。リソースは、同じ名前が付けられた仮想マシン(VM)と Cloud TPU リソースで構成されます。これらのリソースは、作成したバケットと同じリージョン / ゾーンに存在する必要があります。

VM リソースと TPU リソースを設定するには、gcloud コマンドまたは Cloud Console を使用することもできます。詳細については、TPU の作成と削除をご覧ください。

ctpu up を実行してリソースを作成する

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

    Cloud Shell を開く

  2. gcloud config set project <Your-Project> を実行して Cloud TPU を作成するプロジェクトを使用します。

  3. Cloud TPU デバイスまたは Pod スライスのいずれかを示すフラグを指定して ctpu up を実行します。フラグのオプションと説明については、CTPU リファレンスをご覧ください。

  4. Cloud TPU デバイスか、Pod スライスのいずれかを設定します。

TPU デバイス

Cloud TPU デバイスを設定します。

$ ctpu up 

構成に関する次のメッセージが表示されます。

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

y キーを押して、Cloud TPU リソースを作成します。

TPU Pod

作業しているゾーン内の VM 上に、Cloud TPU スライスを設定します。

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

構成に関する次のメッセージが表示されます。

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

y キーを押して、Cloud TPU リソースを作成します。

ctpu up コマンドにより、仮想マシン(VM)と Cloud TPU サービスが作成されます。

これ以降、接頭辞 (vm)$ は Compute Engine VM インスタンスでコマンドを実行する必要があることを意味します。

Compute Engine VM を確認する

ctpu up コマンドの実行が終了したら、シェル プロンプトが username@tpuname になっていることを確認します。これは、Compute Engine VM にログインしていることを意味します。

VM にディスク容量を追加する必要があるかどうかを確認する

T2T は、t2t-datagen スクリプトで多くの一般的なオープンソース データセットのデータ生成を適切にパッケージ化します。このスクリプトはデータをダウンロードして前処理し、トレーニングの準備を整えます。これを行うには、200 GB 以上のローカル ディスク容量が必要です。

ctpu up を使用して Compute Engine VM を作成した場合は、VM に 250 GB のディスク容量が割り当てられているので、このステップをスキップできます。gcloud コマンドまたは Cloud Console を使用して Compute Engine VM を設定したときに、VM ディスクサイズを 200 GB 以上に指定していない場合は、次の手順に従います。

  • Compute Engine ガイドに従って、Compute Engine VM にディスクを追加します。
  • ディスクサイズを 200 GB(推奨最小サイズ)に設定します。
  • VM の削除時にディスクが削除されるように、[インスタンスを削除したときの動作] を [ディスクを削除] に設定します。

新しいディスクのパスをメモします。例: /mnt/disks/mnt-dir

トレーニング データセットを生成する

Compute Engine VM の場合:

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

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

    ここで

    • YOUR-BUCKET-NAME は、Cloud Storage バケットの名前です。
    • DATA_DIR は、トレーニングと評価のデータを保持する Cloud Storage の場所です。
    • YOUR-TMP_DIRECTORY は、一時データの格納に使用する場所です。新しいディスクを Compute Engine VM に追加した場合、これは、追加されたディスク上の場所になります(例: /mnt/disks/mnt-dir/t2t_tmp)。それ以外の場合は、VM 上の一時ディレクトリになります(例: /tmp/t2t_tmp)。
  2. 新しいディスクを Compute Engine VM に追加した場合は、追加したディスク上に一時ディレクトリを作成します。

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

    (vm)$ export PATH=.local/bin:$PATH
  4. Cloud TPU がデータにアクセスできるように、t2t-datagen スクリプトを使用して Cloud Storage バケット上にトレーニングおよび評価データを生成します。

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

ダウンロード、前処理、Cloud Storage へのアップロードが完了するまでには約 2 時間かかります。Cloud Storage 上に生成されたデータを確認するには、次の手順に従います。

  1. Google Cloud Platform Console に移動します。
  2. 左側のメニューから [Storage] を選択します。
  3. このチュートリアル用に作成したバケットの名前をクリックします。

translate_ende_wmt32k_packed-traintranslate_ende_wmt32k_packed-dev という名前のファイルに分割されていることがわかります。

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

言語モデリングには transformer モデルを使用できます。トレーニング データを生成して、出力ファイルを指定するには、次のコマンドを実行します。

(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

このダウンロード、前処理、Cloud Storage へのアップロードが完了するまでには約 2 時間かかります。

単一の Cloud TPU デバイスまたは Pod でモデルをトレーニングして評価するには、以下のコマンドを実行します。

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 は Cloud TPU の名前を指定します。ctpu は、この名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
  • --data_dir は、トレーニング入力用の Cloud Storage のパスを指定します。これは、Cloud Storage バケット内のデータ ディレクトリに設定されています。
  • --output_dir は、モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。

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

TPU Pod

  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 は Cloud TPU の名前を指定します。ctpu は、この名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。
    • --data_dir は、トレーニング入力用の Cloud Storage のパスを指定します。
    • --output_dir は、モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。フォルダがない場合は、プログラムによって作成されます。

上記のコマンドは 25,000 ステップのトレーニングを行った後、3 ステップの評価を行います。Cloud TPU v2-32 では、このトレーニングの完了までに約 30 分かかります。 モデルのトレーニングには、少なくとも 40,000 のステップを使用することをおすすめします。このモデルは通常、約 250,000 ステップ後に最大限の品質に収束します。

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

Compute Engine VM で次のコマンドを実行します。

  1. トレーニング ディレクトリを格納する環境変数を設定します。このディレクトリは Cloud Storage の場所でなければなりません。

    (vm)$ OUT_DIR=$STORAGE_BUCKET/training/transformer_ende_1
  2. t2t-trainer を実行して、モデルのトレーニングと評価を行います。

    (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

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

  3. Google Cloud Platform Console に移動し、左側のメニューから [Storage] を選択して、Cloud Storage バケットの出力を表示します。このチュートリアル用に作成したバケットの名前をクリックします。バケット内で、トレーニング ディレクトリ(例: /training/transformer_ende_1)に移動してモデル出力を表示します。

  4. トレーニングと評価の指標を確認するには、TensorBoard を起動して、Cloud Storage 内のトレーニング ディレクトリを指定します。

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

感情分類には transformer_encoder モデルを使用できます。次のコマンドを実行してトレーニング データを生成し、出力ファイルを指定します。

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

次のコマンドを実行して、モデルをトレーニングおよび評価します。

(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

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

クリーンアップ

このトピックで使用したリソースについて GCP アカウントに課金されないようにする手順は次のとおりです。

  1. Compute Engine VM との接続を解除します。

    (vm)$ exit
    

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

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

    $ ctpu delete [optional: --zone]
    
  3. TPU の使用に対して不要な料金が発生しないように、ctpu status を実行してインスタンスが割り当てられていないことを確認します。削除には数分かかることがあります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

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

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。