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
  • クラウド ストレージ

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。新しい 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}
    

    このコマンドを新しい Cloud Shell VM で初めて実行すると、Authorize Cloud Shell ページが表示されます。ページの下部にある [Authorize] をクリックして、gcloud に認証情報を使用した GCP API の呼び出しを許可します。

  4. Cloud TPU プロジェクトのサービス アカウントを作成します。

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. 次のコマンドを使用して Cloud Storage バケットを作成します。

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

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

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

  6. gcloud コマンドを使用して、Compute Engine VM を起動します。

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --name=transformer-tutorial \
     --zone=europe-west4-a \
     --disk-size=300 \
     --machine-type=n1-standard-8 \
     --tf-version=1.15.5
    

    コマンドフラグの説明

    vm-only
    VM のみを作成します。デフォルトでは、gcloud compute tpus execution-groups コマンドは VM と Cloud TPU を作成します。
    name
    作成する Cloud TPU の名前。
    zone
    Cloud TPU を作成するゾーン
    disk-size
    gcloud compute tpus execution-groups コマンドで作成された VM のハードディスクのサイズ(GB)。
    machine-type
    作成する Compute Engine VM のマシンタイプ
    tf-version
    Tensorflow gcloud compute tpus execution-groups のバージョンが VM にインストールされます。

    gcloud コマンドの詳細については、gcloud リファレンスをご覧ください。

  7. 指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。

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

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

    これらの手順を続行する場合は、Compute Engine インスタンスで (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}

    コマンドフラグの説明

    problem
    問題の名前。
    data_dir
    トレーニング入力の Cloud Storage パス。
    tmp_dir
    一時ストレージ ディレクトリ。
  2. 次のコマンドを実行して Cloud TPU リソースを作成します。

    (vm)$ gcloud compute tpus execution-groups create --tpu-only \
     --zone=europe-west4-a \
     --tf-version=1.15.5 \
     --name=transformer-tutorial

    コマンドフラグの説明

    tpu-only
    Cloud TPU のみを作成します。デフォルトでは、gcloud compute tpus execution-groups コマンドは VM と Cloud TPU を作成します。
    zone
    Cloud TPU を作成するゾーン。これは、Compute Engine VM に使用したのと同じゾーンである必要があります。例: europe-west4-a
    tf-version
    Tensorflow ctpu のバージョンが VM にインストールされます。
    name
    作成する Cloud TPU の名前。
  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

    コマンドフラグの説明

    model
    トレーニングするモデル。
    hparams_set
    トレーニング中に使用するハイパーパラメータ。
    problem
    問題の名前。
    eval-steps
    評価のステップの数。
    data_dir
    トレーニング データが格納されている Cloud Storage パス。
    output_dir
    実行用の基本出力ディレクトリ。
    use_tpu
    Cloud TPU を使用するには、「true」に設定します。それ以外の場合は「false」に設定します。
    cloud_tpu_name
    トレーニングに使用する Cloud TPU の名前。
    train_steps
    トレーニングのステップの数。

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

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

    $ gcloud compute tpus execution-groups delete transformer-tutorial \
      --zone=europe-west4-a \
      --tpu-only

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

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

    (vm)$ gcloud compute tpus execution-groups create \
     --tpu-only \
     --accelerator-type=v2-32 \
     --name=transformer-tutorial-pod \
     --zone=europe-west4-a \
     --tf-version=1.15.5

    コマンドフラグの説明

    tpu-only
    VM を作成せずに Cloud TPU を作成します。デフォルトでは、gcloud compute tpus execution-groups コマンドは VM と Cloud TPU を作成します。
    accelerator-type
    作成する Cloud TPU のタイプ
    name
    作成する Cloud TPU の名前。
    zone
    Cloud TPU を作成するゾーン
    tf-version
    Tensorflow ctpu のバージョンが VM にインストールされます。
  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

    コマンドフラグの説明

    model
    トレーニングするモデル。
    hparams_set
    トレーニング中に使用するハイパーパラメータ。
    problem
    問題の名前。
    eval-steps
    評価のステップの数。
    data_dir
    トレーニング データが格納されている Cloud Storage パス。
    output_dir
    実行用の基本出力ディレクトリ。
    use_tpu
    Cloud TPU を使用するには、「true」に設定します。それ以外の場合は「false」に設定します。
    cloud_tpu_name
    トレーニングに使用する Cloud TPU の名前。
    tpu_num_shards
    Cloud TPU シャードの数。デフォルト値は「8」です。
    schedule
    実行するテストの方法。
    train_steps
    モデルをトレーニングするためのステップの数。

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

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

  4. トレーニング用に作成した Cloud TPU リソースを削除します。

    (vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \
      --zone=europe-west4-a \
      --tpu-only

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

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

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

    コマンドフラグの説明

    problem
    問題の名前。
    data_dir
    トレーニング入力の Cloud Storage パス。
    tmp_dir
    一時ストレージ ディレクトリ。
  2. 次のコマンドを実行して Cloud TPU リソースを作成します。

    (vm)$ gcloud compute tpus execution-groups create --tpu-only \
     --zone=europe-west4-a \
     --tf-version=1.15.5 \
     --name=transformer-tutorial

    コマンドフラグの説明

    tpu-only
    Cloud TPU のみを作成します。デフォルトでは、gcloud compute tpus execution-groups コマンドは VM と Cloud TPU を作成します。
    zone
    Cloud TPU を作成するゾーン
    tf-version
    Tensorflow gcloud compute tpus execution-groups のバージョンが VM にインストールされます。
    name
    作成する Cloud TPU の名前。
  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

    コマンドフラグの説明

    model
    トレーニングするモデル。
    hparams_set
    トレーニング中に使用するハイパーパラメータ。
    problem
    問題の名前。
    eval-steps
    評価のステップの数。
    data_dir
    トレーニング データが格納されている Cloud Storage パス。
    output_dir
    実行用の基本出力ディレクトリ。
    use_tpu
    Cloud TPU を使用するには、「true」に設定します。それ以外の場合は「false」に設定します。
    cloud_tpu_name
    トレーニングに使用する Cloud TPU の名前。
    train_steps
    モデルをトレーニングするためのステップの数。

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

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

    (vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \
     --tpu-only \
     --zone=europe-west4-a 

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

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

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

    (vm)$ gcloud compute tpus execution-groups create --tpu-only \
     --zone=europe-west4-a \
     --tf-version=1.15.5 \
     --name=transformer-tutorial

    コマンドフラグの説明

    tpu-only
    Cloud TPU のみを作成します。デフォルトでは、gcloud compute tpus execution-groups コマンドは VM と Cloud TPU を作成します。
    zone
    Cloud TPU を作成するゾーン
    tf-version
    Tensorflow gcloud compute tpus execution-groups のバージョンが VM にインストールされます。
    name
    作成する Cloud TPU の名前。
  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
    

    コマンドフラグの説明

    model
    トレーニングするモデル。
    hparams_set
    トレーニング中に使用するハイパーパラメータ。
    problem
    問題の名前。
    eval-steps
    評価のステップの数。
    data_dir
    トレーニング データが格納されている Cloud Storage パス。
    output_dir
    実行用の基本出力ディレクトリ。
    use_tpu
    Cloud TPU を使用するには、「true」に設定します。それ以外の場合は「false」に設定します。
    cloud_tpu_name
    トレーニングに使用する Cloud TPU の名前。
    train_steps
    モデルをトレーニングするためのステップの数。

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

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを保存して個々のリソースを削除します。

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

    (vm)$ exit
    

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

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

    $ gcloud compute tpus execution-groups delete transformer-tutorial \
    --zone=europe-west4-a
    
  3. gcloud compute tpus execution-groups list を実行して、リソースが削除されていることを確認します。削除には数分かかることがあります。次のようなレスポンスは、インスタンスが正常に削除されたことを示します。

    $ gcloud compute tpus execution-groups list \
     --zone=europe-west4-a
    

    次のような空の TPU のリストが表示されます。

       NAME             STATUS
    
  4. 以下に示すように、gsutil を使用して Cloud Storage バケットを削除します。bucket-name を Cloud Storage バケットの名前に置き換えます。

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

次のステップ

このチュートリアルでは、サンプル データセットを使用して Transformer モデルをトレーニングしました。このトレーニングの結果は(ほとんどの場合)推論には使用できません。推論にモデルを使用するには、一般公開されているデータセットまたは独自のデータセットでデータをトレーニングします。Cloud TPU でトレーニングされたモデルでは、データセットを TFRecord 形式にする必要があります。

データセット変換ツールのサンプルを使用して、画像分類データセットを TFRecord 形式に変換できます。画像分類モデルを使用しない場合は、自分でデータセットを TFRecord 形式に変換する必要があります。詳細については、TFRecord と tf.Example をご覧ください。

ハイパーパラメータ調整

データセットでモデルのパフォーマンスを向上させるには、モデルのハイパーパラメータを調整します。すべての TPU でサポートされているモデルに共通のハイパーパラメータに関する情報については、GitHub をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要ハイパーパラメータ調整サービスの使用ハイパーパラメータを調整するをご覧ください。

推論

モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。AI Platform は、機械学習モデルを開発、トレーニングデプロイするためのクラウドベースのソリューションです。モデルをデプロイすれば、AI Platform Prediction サービスを使用できるようになります。