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

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

モデルの説明

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

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

Transformer は、Tensor2Tensor ライブラリのモデルの 1 つにすぎません。Tensor2Tensor(T2T)は、ディープ ラーニング モデルとデータセット、およびモデルをトレーニングしたり、データをダウンロードして準備したりできる一連のスクリプトのライブラリです。

始める前に

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

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

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

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. このチュートリアルでは、Google Cloud Platform の課金対象となるコンポーネントを使用します。Cloud TPU の料金ページを確認して費用を見積もり、終了したら手順に従ってリソースのクリーンアップを行います。

Cloud Storage バケットを作成する

機械学習モデルのトレーニングに使用するデータおよびトレーニングの結果を保存する Cloud Storage バケットが必要です。

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

    Cloud Storage ページに移動

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

    • 任意の一意の名前
    • デフォルトのストレージ クラス: Regional
    • ロケーション: us-central1

Cloud Shell を開いて ctpu ツールを使用する

このガイドでは、Cloud TPU Provisioning Utilityctpu)を使用します。これは Cloud TPU を設定および管理するためのシンプルなツールです。このガイドでは、Cloud Shell から ctpu を実行します。より高度な設定オプションについては、カスタム設定をご覧ください。

ctpu ツールは Cloud Shell にプリインストールされています。ctpu 構成を確認するには、次の手順に従います。

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

    Cloud Shell を開く

  2. Cloud Shell に次のように入力して、ctpu 構成を確認します。

    $ ctpu print-config
    

    次のようなメッセージが表示されます。

    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. ctpu コマンドを見てみます。

    $ ctpu

    サブコマンドとフラグのリストとそれぞれの簡単な説明を含む使用ガイドが表示されます。

Compute Engine VM と Cloud TPU を作成する

次のコマンドを実行して、Compute Engine 仮想マシン(VM)と関連するサービスを備えた Cloud TPU を設定します。このリソースとサービスの組み合わせは、Cloud TPU 群と呼ばれます。

$ ctpu up

ctpu up コマンドは、次のタスクを実行します。

  • Compute Engine および Cloud TPU サービスを有効にします。
  • 最新の安定した TensorFlow バージョンがプリインストールされた Compute Engine VM を作成します。デフォルト ゾーンは us-central1-b です。参考までに、Cloud TPU は次のゾーンで利用できます。

    • 米国(US)
    • ヨーロッパ(EU)
      • europe-west4-a
    • アジア太平洋(APAC)
      • asia-east1-c

  • 対応するバージョンの TensorFlow を使用して Cloud TPU を作成し、Cloud TPU の名前を環境変数(TPU_NAME)として Compute Engine VM に渡します。

  • 特定の IAM の役割を Cloud TPU サービス アカウントに付与して、Cloud TPU が GCP プロジェクトから必要なリソースにアクセスできるようにします。
  • その他数多くのチェックを行います。
  • 新しい Compute Engine VM にユーザーをログインさせます。

ctpu up は必要に応じて何度でも実行できます。たとえば、Compute Engine VM との SSH 接続が失われた場合は、ctpu up を実行して復元します。

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

Compute Engine VM を確認する

ctpu up コマンドの実行が終了したら、次の点を確認します。

  1. shell プロンプトが username@project から username@username に変更されていることを確認します。この変更により、現在 Compute Engine VM にログインしていることがわかります。

  2. 次のコマンドを実行して、TensorFlow のインストールを確認します。

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

    警告メッセージが表示され、その後に TensorFlow のバージョン番号を示す行が表示されます。たとえば、1.8.0 となります。

VM にディスク容量を追加する

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

ローカルマシンで t2t-datagen を実行する場合は、このステップをスキップできます(pip install tensor2tensor の次に以下の t2t-datagen コマンドを参照)。

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

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

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

Compute Engine VM の場合:

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

    (vm)$ STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
    (vm)$ DATA_DIR=$STORAGE_BUCKET/data/
    (vm)$ TMP_DIR=/mnt/disks/mnt-dir/t2t_tmp

    ここで

    • YOUR-BUCKET-NAME は、Cloud Storage バケットの名前です。
    • DATA_DIR は、Cloud Storage の場所です。
    • TMP_DIR は、チュートリアルの開始時に Compute Engine VM に追加したディスク上の場所です。
  2. チュートリアルの開始時に Compute Engine VM に追加したディスクに一時ディレクトリを作成します。

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

  3. Cloud TPU がデータにアクセスできるように、t2t-datagen スクリプトを使用して Cloud Storage バケットでトレーニングおよび評価データを生成します。

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

Cloud Storage のデータを表示するには、Google Cloud Platform Console に移動し、左側のメニューから [ストレージ] を選択します。このチュートリアルで作成したバケットの名前をクリックします。translate_ende_wmt32k_packed-traintranslate_ende_wmt32k_packed-dev という名前の共有ファイルがあります。

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

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

  1. TPU マシンの IP アドレスとポートの環境変数を設定します。IP アドレスを見つけるには、次のコマンドを実行します。

    (vm)$ gcloud compute tpus list

    上記のコマンドによって、NETWORK_ENDPOINT の下に IP アドレスが出力されます。

    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
    

    次の環境変数を設定します。

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

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

    (vm)$ OUT_DIR=$STORAGE_BUCKET/training/transformer_ende_1

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

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

  4. Google Cloud Platform Console に移動し、左側のメニューから [ストレージ] を選択して、Cloud Storage バケットの出力を表示します。このチュートリアルで作成したバケットの名前をクリックします。バケット内で、トレーニング ディレクトリ(たとえば /training/transformer_ende_1)に移動してモデル出力を表示します。そのディレクトリを指す tensorboard を起動して、トレーニングと評価の指標を表示できます。

言語モデルをトレーニングする

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

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

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

(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

このモデルは約 250,000 ステップ後に収束します。

感情分類子をトレーニングする

感情分類には 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=2 \
  --data_dir=$DATA_DIR \
  --output_dir=$OUT_DIR \
  --use_tpu=True \
  --master=$TPU_MASTER

このモデルは、約 2,000 ステップ後に約 85% の精度を達成します。

クリーンアップ

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

    (vm)$ exit
    

    プロンプトが user@projectname になり、Cloud Shell 内にいることが示されます。

  2. Cloud Shell で次のコマンドを実行して、Compute Engine VM と Cloud TPU を削除します。

    $ ctpu delete
    

  3. ctpu status を実行すると、インスタンスが割り当てられていないことを確認できますが、削除には 1~2 分かかる場合があります。次のようなレスポンスは、割り当てられたインスタンスがないことを示します。

    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            GCE VM:     --
            Cloud TPU:  --
    

  4. このチュートリアルで作成した Cloud Storage バケットが不要になったら、gsutil コマンドを使用して削除します。YOUR-BUCKET-NAME は、Cloud Storage バケットの名前に置き換えます。

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

    無料の保存容量の制限やその他の料金に関する情報については、Cloud Storage の料金ガイドをご覧ください。

次のステップ

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

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