このチュートリアルでは、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
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
TPU Pod スライスのトレーニングを行う場合は、TPU ポッドでのトレーニングをお読みいただき、Pod スライスのトレーニングについて特に留意すべき事項をご確認ください。
このチュートリアルを開始する前に、次のステップに従って、Google Cloud プロジェクトが正しく設定されていることを確認します。
このセクションでは、Cloud Storage バケットと Compute Engine VM の設定について説明します。
Cloud Shell ウィンドウを開きます。
プロジェクト ID の変数を作成します。
export PROJECT_ID=project-id
Cloud TPU を作成するプロジェクトを使用するように Google Cloud CLI を構成します。
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 バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する
gcloud compute tpus execution-groups
ツールは、Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。バケットのロケーションは、仮想マシン(VM)および TPU ノードと同じリージョンにする必要があります。VM と TPU ノードは、リージョン内のサブディビジョンである特定のゾーンに配置されます。
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 リファレンスをご覧ください。指定した構成が表示されます。承認する場合は 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 の場合:
次の環境変数を作成します。
(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}
コマンドフラグの説明
problem
- 問題の名前。
data_dir
- トレーニング入力の Cloud Storage パス。
tmp_dir
- 一時ストレージ ディレクトリ。
次のコマンドを実行して 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 の名前。
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
コマンドフラグの説明
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 ステップ後に最大限の品質に収束します。作成した Cloud TPU リソースを削除します。
$ gcloud compute tpus execution-groups delete transformer-tutorial \ --zone=europe-west4-a \ --tpu-only
Cloud TPU Pod で言語モデルをトレーニングする
使用する 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 名の環境変数を設定します。
(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
コマンドフラグの説明
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 ステップ後に最大限の品質に収束します。
トレーニング用に作成した Cloud TPU リソースを削除します。
(vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \ --zone=europe-west4-a \ --tpu-only
単一の Cloud TPU で英語 - ドイツ語の翻訳モデルをトレーニングする
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
- 一時ストレージ ディレクトリ。
次のコマンドを実行して 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 の名前。
新しい 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
コマンドフラグの説明
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 万ステップ後に最高品質に収束します。単一のデバイスでモデルをトレーニングするために作成した Cloud TPU リソースを削除します。
(vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \ --tpu-only \ --zone=europe-west4-a
単一の Cloud TPU で感情分類子モデルをトレーニングする
感情分類子モデルのデータセットを生成します。
(vm)$ t2t-datagen --problem=sentiment_imdb \ --data_dir=${DATA_DIR} \ --tmp_dir=${TMP_DIR}
次のコマンドを実行して 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 の名前。
トレーニング スクリプトを実行します。
(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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
Compute Engine インスタンスとの接続を切断していない場合は切断します。
(vm)$ exit
プロンプトが
username@projectname
に変わります。これは、現在、Cloud Shell 内にいることを示しています。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
gcloud compute tpus execution-groups list
を実行して、リソースが削除されたことを確認します。削除には数分かかることがあります。以下のようなレスポンスは、インスタンスが正常に削除されたことを示します。$ gcloud compute tpus execution-groups list \ --zone=europe-west4-a
次のような空の TPU のリストが表示されます。
NAME STATUS
次に示すように、
gsutil
を使用して Cloud Storage バケットを削除します。bucket-name を Cloud Storage バケットの名前に置き換えます。$ gsutil rm -r gs://bucket-name
次のステップ
TensorFlow Cloud TPU のチュートリアルでは通常、サンプル データセットを使用してモデルをトレーニングします。このトレーニングの結果は推論には使用できません。モデルを推論に使用するには、一般公開されているデータセットまたは独自のデータセットでデータをトレーニングします。Cloud TPU でトレーニングされた TensorFlow モデルは通常、データセットを TFRecord 形式にする必要があります。データセット変換ツールのサンプルを使用して、画像分類データセットを TFRecord 形式に変換できます。画像分類モデルを使用しない場合は、自分でデータセットを TFRecord 形式に変換する必要があります。詳細については、TFRecord と tf.Example をご覧ください。
ハイパーパラメータ調整
データセットでモデルのパフォーマンスを向上させるには、モデルのハイパーパラメータを調整します。すべての TPU でサポートされているモデルに共通のハイパーパラメータに関する情報については、GitHub をご覧ください。モデルに固有のハイパーパラメータに関する情報については、各モデルのソースコードで確認できます。ハイパーパラメータ調整の詳細については、ハイパーパラメータ調整の概要、ハイパーパラメータ調整サービスの使用、ハイパーパラメータを調整するをご覧ください。
推論
モデルをトレーニングしたら、そのモデルを推論(予測)に使用できます。AI Platform は、機械学習モデルを開発、トレーニング、デプロイするためのクラウドベースのソリューションです。モデルをデプロイすれば、AI Platform Prediction サービスを使用できるようになります。
- TPU の Tensor2Tensor モデルについてさらに学習する。
- より多くの TPU サンプルでテストを行います。
- TensorBoard の TPU ツールを確認する。