Cloud TPU による BERT の調整: 文と文のペア分類タスク(TF 2.x)

このチュートリアルでは、Cloud TPU で BERT モデルのトレーニングを行う方法について説明します。

BERT は言語表現の事前トレーニングの方法です。事前トレーニングとは、最初にウィキペディアなどの大規模なテキストソースを使用して BERT のトレーニングを行うことを意味します。その後、このトレーニング結果を質問応答感情分析などの他の自然言語処理(NLP)タスクに適用できます。BERT と Cloud TPU を使用すると、さまざまな NLP モデルを 30 分ほどでトレーニングできます。

BERT の詳細については、以下のリソースをご覧ください。

目標

  • データセットとモデルの出力を格納する Cloud Storage バケットを作成します。
  • トレーニング ジョブを実行します。
  • 出力結果を確認します。

費用

このチュートリアルでは、Google Cloud の課金対象となる以下のコンポーネントを使用します。

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを出すことができます。新しい 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}
    
  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 バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。このチュートリアルで使用する ctpu up ツールは、前の手順で設定した Cloud TPU サービス アカウントのデフォルトの権限を設定します。権限の詳細な設定が必要な場合は、アクセスレベル権限をご覧ください。

    バケットのロケーションは、Compute Engine(VM)および Cloud TPU ノードと同じリージョンにする必要があります。

  6. ctpu up コマンドを使用して Compute Engine VM と Cloud TPU を起動します。

    $ ctpu up --tpu-size=v3-8 \
      --name=bert-tutorial \
      --machine-type=n1-standard-8 \
      --zone=europe-west4-a \
      --tf-version=2.3.1
    

    コマンドフラグの説明

    tpu-size
    作成する Cloud TPU のタイプ
    name
    作成する Cloud TPU の名前。
    machine-type
    作成する Compute Engine VM のマシンタイプ
    zone
    Cloud TPU を作成するゾーン
    tf-version
    Tensorflow ctpu のバージョンが VM にインストールされます。

    ctpu ユーティリティの詳細については、CTPU リファレンスをご覧ください。

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

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

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

    これらの手順を続行する場合は、VM セッション ウィンドウで、(vm)$ で始まる各コマンドを実行します。

  9. TPU 名の環境変数を作成します。

    (vm)$ export TPU_NAME=bert-tutorial
    

データセットを準備する

  1. Compute Engine 仮想マシン(VM)から、requirements.txt をインストールします。

    (vm)$ sudo pip3 install -r /usr/share/models/official/requirements.txt
    
  2. 省略可: download_glue_data.py をダウンロード

    このチュートリアルでは、GLUE(General Language Understanding Evaluation)ベンチマークを使用してモデル パフォーマンスの評価と分析を行います。 このチュートリアル用に、GLUE データを gs://cloud-tpu-checkpoints/bert/classification で提供します。

    生の GLUE データを処理し、TFRecord を作成する場合は、GitHub のデータセット処理手順に従います。

パラメータ値を定義する

次に、モデルのトレーニングと評価に必要なパラメータ値を定義します。

(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
(vm)$ export BERT_BASE_DIR=gs://cloud-tpu-checkpoints/bert/keras_bert/uncased_L-24_H-1024_A-16
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/bert-output
(vm)$ export GLUE_DIR=gs://cloud-tpu-checkpoints/bert/classification
(vm)$ export TASK=mnli

モデルのトレーニング

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

(vm)$ python3 /usr/share/models/official/nlp/bert/run_classifier.py \
  --mode='train_and_eval' \
  --input_meta_data_path=${GLUE_DIR}/${TASK}_meta_data \
  --train_data_path=${GLUE_DIR}/${TASK}_train.tf_record \
  --eval_data_path=${GLUE_DIR}/${TASK}_eval.tf_record \
  --bert_config_file=${BERT_BASE_DIR}/bert_config.json \
  --init_checkpoint=${BERT_BASE_DIR}/bert_model.ckpt \
  --train_batch_size=32 \
  --eval_batch_size=32 \
  --learning_rate=2e-5 \
  --num_train_epochs=1 \
  --model_dir=${MODEL_DIR} \
  --distribution_strategy=tpu \
  --tpu=${TPU_NAME} \
  --steps_per_loop=1000

コマンドフラグの説明

mode
train_and_eval に設定すると、このスクリプトはモデルをトレーニングして評価します。「export_only」に設定すると、このスクリプトは保存されたモデルをエクスポートします。
input_meta_data_path
トレーニングと評価に使用するデータセットに関するメタデータを含むファイルへのパス。
train_data_path
トレーニング入力用の Cloud Storage パス。この例では、fake_imagenet データセットに設定されています。
eval_data_path
評価入力用の Cloud Storage パス。この例では、fake_imagenet データセットに設定されています。
init_checkpoint
事前トレーニング済みの BERT モデルの初期チェックポイントを含む json ファイルへのパス。
train_batch_size
トレーニングのバッチサイズ。
eval_batch_size
評価のバッチサイズ。
learning_rate
学習率。
num_train_epochs
データセット全体を使用してモデルをトレーニングする回数。
model_dir
モデルのトレーニング中にチェックポイントとサマリーが保存されるディレクトリを指定します。該当するフォルダがない場合は、プログラムによって作成されます。Cloud TPU を使用する場合、model_dir は Cloud Storage パスにする必要があります(`gs://...`)。以前のチェックポイントが、同じサイズの TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して現在のチェックポイント データを読み込んで追加のチェックポイントを保存できます。
distribution_strategy
TPU で ResNet モデルをトレーニングするには、distribution_strategytpu に設定する必要があります。
tpu
Cloud TPU の名前です。環境変数(TPU_NAME)を指定することで設定されます。

結果の確認

トレーニングには v3-8 TPU で約 2 分かかります。 スクリプトが完了すると、結果は次のようになります。

Training Summary:
{'total_training_steps': 12271, 'train_loss': 0.0, 'last_train_metrics': 0.0,
 'eval_metrics': 0.8608226180076599}

精度を高めるには、--num_tain_epochs=3 を設定します。このスクリプトの実行には約 1 時間かかります。

クリーンアップ

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

    (vm)$ exit
    

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

  2. Cloud Shell で、Compute Engine VM と Cloud TPU の設定時に使用した --name フラグと --zone フラグを指定して ctpu delete コマンドを実行します。これにより、VM と Cloud TPU の両方が削除されます。

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

    $ ctpu status --name=bert-tutorial --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:             --
    
  4. 次に示すように gsutil を実行します。bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えてください。

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

次のステップ

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

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

ハイパーパラメータ調整

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

推論

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