このチュートリアルでは、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 の設定について説明します。
Cloud Shell ウィンドウを開きます。
プロジェクト ID の変数を作成します。
export PROJECT_ID=project-id
Cloud TPU を作成するプロジェクトを使用するように
gcloud
コマンドライン ツールを構成します。gcloud config set project ${PROJECT_ID}
このコマンドを新しい Cloud Shell VM で初めて実行すると、
Authorize Cloud Shell
ページが表示されます。ページの下部にある [Authorize
] をクリックして、gcloud
に認証情報を使用した GCP API の呼び出しを許可します。Cloud TPU プロジェクトのサービス アカウントを作成します。
gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
このコマンドでは、Cloud TPU サービス アカウントを次の形式で返します。
service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
次のコマンドを使用して Cloud Storage バケットを作成します。
gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 -b on gs://bucket-name
この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する
ctpu up
ツールは、Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。バケットのロケーションは、仮想マシン(VM)および TPU ノードと同じリージョンにする必要があります。VM と TPU ノードは、リージョン内のサブディビジョンである特定のゾーンに配置されます。
ctpu up
コマンドを使用して、Compute Engine VM を起動します。ctpu up --project=${PROJECT_ID} \ --zone=europe-west4-a \ --vm-only \ --disk-size-gb=300 \ --machine-type=n1-standard-8 \ --tf-version=1.15.4 \ --name=transformer-tutorial
指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。
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 の場合:
次の環境変数を作成します。
(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
一時ファイルを保存するためのディレクトリを作成します。
(vm)$ mkdir ${TMP_DIR}
モデルデータの処理に使用される
tensor2tensor
スクリプトへのパスを追加します。(vm)$ export PATH=.local/bin:${PATH}
単一の Cloud TPU で言語モデルをトレーニングする
言語モデルのトレーニング データセットを生成します。
(vm)$ t2t-datagen --problem=languagemodel_lm1b32k_packed \ --data_dir=${DATA_DIR} \ --tmp_dir=${TMP_DIR}
次のコマンドを実行して Cloud TPU リソースを作成します。
(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tf-version=1.15.4 \ --name=transformer-tutorial
TPU 名の環境変数を設定します。
(vm)$ export TPU_NAME=transformer-tutorial
トレーニング スクリプトを実行します。
(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 ステップ後に最大限の品質に収束します。作成した Cloud TPU リソースを削除します。
(vm)$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --zone=europe-west4-a \ --name=transformer-tutorial
Cloud TPU Pod で言語モデルをトレーニングする
使用する Pod スライスを指定するための
tpu-size
パラメータを使用して、ctpu up
コマンドを実行します。たとえば、次のコマンドは v2-32 Pod スライスを使用します。(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tpu-size=v2-32 \ --zone=europe-west4-a \ --tf-version=1.15.4 \ --name=transformer-tutorial-pod
新しい TPU 名の環境変数を設定します。
(vm)$ export TPU_NAME=transformer-tutorial-pod
トレーニング スクリプトを実行します。
(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 ステップ後に最大限の品質に収束します。
単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --zone=europe-west4-a \ --name=transformer-tutorial-pod
単一の Cloud TPU で英語 - ドイツ語の翻訳モデルをトレーニングする
t2t-datagen
スクリプトを使用して、Cloud Storage バケットの翻訳モデルのトレーニング データと評価データを生成します。(vm)$ t2t-datagen \ --problem=translate_ende_wmt32k_packed \ --data_dir=${DATA_DIR} \ --tmp_dir=${TMP_DIR}
次のコマンドを実行して Cloud TPU リソースを作成します。
(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tf-version=1.15.4 \ --name=transformer-tutorial
新しい TPU 名の環境変数を設定します。
(vm)$ export TPU_NAME=transformer-tutorial
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 万ステップ後に最高品質に収束します。単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --zone=europe-west4-a \ --name=transformer-tutorial
単一の Cloud TPU で感情分類子モデルをトレーニングする
感情分類子モデルのデータセットを生成します。
(vm)$ t2t-datagen --problem=sentiment_imdb \ --data_dir=${DATA_DIR} \ --tmp_dir=${TMP_DIR}
次のコマンドを実行して Cloud TPU リソースを作成します。
(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tf-version=1.15.4 \ --name=transformer-tutorial
トレーニング スクリプトを実行します。
(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 アカウントに課金されないようにする手順は次のとおりです。
Compute Engine インスタンスとの接続を切断していない場合は切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。Cloud Shell で、Cloud TPU の設定時に使用した --zone フラグを指定して
ctpu delete
を実行し、Compute Engine VM と Cloud TPU を削除します。$ ctpu delete --project=${PROJECT_ID} \ --zone=europe-west4-a \ --name=transformer-tutorial
次のコマンドを実行して、Compute Engine VM と Cloud TPU がシャットダウンされたことを確認します。
$ ctpu status --project=${PROJECT_ID} \ --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: --
次に示すように
gsutil
を実行します。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 サービスを使用できるようになります。
- ローカルマシンへのインストール方法など、
ctpu
の詳細を学習します。 - TPU の Tensor2Tensor モデルについてさらに学習する。
- より多くの TPU サンプルでテストを行います。
- TensorBoard の TPU ツールを確認する。