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 gs://bucket-name
    

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

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

  6. gcloud コマンドを使用して Compute Engine VM と Cloud TPU を起動します。使用するコマンドは、TPU VM を使用するか TPU ノードを使用するかによって異なります。2 つの VM アーキテクチャの詳細については、システム アーキテクチャをご覧ください。gcloud コマンドの詳細については、gcloud リファレンスをご覧ください。

    TPU VM

    $ gcloud alpha compute tpus tpu-vm create bert-tutorial \
    --zone=europe-west4-a \
    --accelerator-type=v3-8 \
    --version=tpu-vm-tf-2.7.0

    コマンドフラグの説明

    zone
    Cloud TPU を作成するゾーン
    accelerator-type
    作成する Cloud TPU のタイプ
    version
    Cloud TPU ランタイムのバージョン。

    TPU ノード

    $ gcloud compute tpus execution-groups create \
      --name=bert-tutorial \
      --zone=europe-west4-a \
      --tf-version=2.7.0 \
      --machine-type=n1-standard-1 \
      --accelerator-type=v3-8 

    コマンドフラグの説明

    name
    作成する Cloud TPU の名前。
    zone
    Cloud TPU を作成するゾーン
    tf-version
    Tensorflow ctpu のバージョンが VM にインストールされます。
    machine-type
    作成する Compute Engine VM のマシンタイプ
    accelerator type
    作成する Cloud TPU のタイプ
  7. 自動的に Compute Engine インスタンスにログインしない場合は、次の ssh コマンドを実行してログインします。VM にログインすると、シェル プロンプトが username@projectname から username@vm-name に変わります。

    TPU VM

    gcloud alpha compute tpus tpu-vm ssh bert-tutorial --zone=europe-west4-a
    

    TPU ノード

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

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

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

    TPU VM

    (vm)$ export TPU_NAME=local
    

    TPU ノード

    (vm)$ export TPU_NAME=bert-tutorial
    

データセットを準備する

  1. TensorFlow の要件をインストールします。

    使用するコマンドは、TPU VM を使用するか TPU ノードを使用するかによって異なります。

    TPU VM

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    

    TPU ノード

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

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

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

モデルのトレーニング

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

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (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
    
  2. PYTHONPATH 環境変数を設定する

    TPU VM

    (vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}"
    

    TPU ノード

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    
  3. モデルが保存されているディレクトリに移動します。

    TPU VM

    (vm)$ cd /usr/share/tpu/models/official/nlp/bert
    

    TPU ノード

    (vm)$ cd /usr/share/models/official/nlp/bert
    
  4. トレーニング スクリプトを実行します。

    (vm)$ python3 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=500
    

    コマンドフラグの説明

    mode
    trainevaltrain_and_evalpredict のいずれか。
    input_meta_data_path
    トレーニングと評価に使用するデータセットに関するメタデータを含むファイルへのパス。
    train_data_path
    トレーニング入力用の Cloud Storage パス。この例では、fake_imagenet データセットに設定されています。
    eval_data_path
    評価入力用の Cloud Storage パス。この例では、fake_imagenet データセットに設定されています。
    bert_config_file
    BERT 構成ファイル。
    init_checkpoint
    事前トレーニング済みの BERT モデルの初期チェックポイントを含む json ファイルへのパス。
    train_batch_size
    トレーニングのバッチサイズ。
    eval_batch_size
    評価のバッチサイズ。
    learning_rate
    学習率。
    num_train_epochs
    モデルをトレーニングするためのエポックの数。
    model_dir
    モデルのトレーニングの際にチェックポイントとサマリーが保存される Cloud Storage パス。以前のチェックポイントが、同じサイズの Cloud TPU と TensorFlow バージョンを使用して作成されていれば、既存のフォルダを再利用して以前に生成されたチェックポイントを読み込み、追加のチェックポイントを保存できます。
    distribution_strategy
    TPU で ResNet モデルをトレーニングするには、distribution_strategytpu に設定します。
    tpu
    トレーニングに使用する Cloud TPU の名前です。
    steps_per_loop
    CPU に状態を保存する前に実行するトレーニング ステップの数。トレーニング ステップは、サンプルの 1 つのバッチの処理です。これには、フォワードパスと逆伝播の両方が含まれます。

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

    12271/12271 [==============================]
      - 756s 62ms/step
      - loss: 0.4864
      - accuracy: 0.8055
      - val_loss: 0.3832
      - val_accuracy: 0.8546
    

    精度を高めるには、--num_train_epochs=3 を設定します。

クリーンアップ

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

    (vm)$ exit
    

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

  2. Cloud TPU と Compute Engine リソースを削除します。リソースの削除に使用するコマンドは、TPU VM または TPU ノードのどちらを使用するかによって異なります。詳細については、システム アーキテクチャをご覧ください。

    TPU VM

    $ gcloud alpha compute tpus tpu-vm delete bert-tutorial \
    --zone=europe-west4-a
    

    TPU ノード

    $ gcloud compute tpus execution-groups delete bert-tutorial \
    --zone=europe-west4-a
    
  3. gcloud compute tpus execution-groups list を実行して、リソースが削除されたことを確認します。削除には数分かかることがあります。次のコマンドの出力には、このチュートリアルで作成したリソースを含めないでください。

    TPU VM

    $ gcloud alpha compute tpus tpu-vm list --zone=europe-west4-a

    TPU ノード

    $ gcloud compute tpus execution-groups list --zone=europe-west4-a
  4. 次に示すように、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 サービスを使用できるようになります。