Cloud TPU による BERT の調整: 文と文のペア分類タスク

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

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

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

目標

  • データセットとモデルの出力を格納する Cloud Storage バケットを作成します。
  • BERT リポジトリと他の必要なファイルのクローンを作成します。
  • トレーニング ジョブを実行します。
  • 出力結果を確認します。

費用

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

  • Compute Engine
  • Cloud TPU
  • クラウド ストレージ

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを作成できます。新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

このセクションでは、Cloud Storage バケットと Compute Engine VM の設定について説明します。

  1. Cloud Shell ウィンドウを開きます。

    Cloud Shell を開く

  2. プロジェクト名の変数を作成します。

        export PROJECT_NAME=project-name
        
  3. Cloud TPU を作成するプロジェクトを使用するように gcloud コマンドライン ツールを構成します。

        gcloud config set project ${PROJECT_NAME}
        
  4. 次のコマンドを使用して Cloud Storage バケットを作成します。

        gsutil mb -p ${PROJECT_NAME} -c standard -l us-central1 -b on gs://bucket-name
        

    この Cloud Storage バケットには、モデルのトレーニングに使用するデータとトレーニング結果が格納されます。

    Cloud TPU でストレージ バケットの読み取りと書き込みを行うには、プロジェクトのサービス アカウントに読み取り / 書き込み権限または管理者権限が必要です。これらの権限を表示、設定する方法については、ストレージ バケットのセクションをご覧ください。

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

        $ ctpu up --tpu-size=v3-8 \
    --machine-type=n1-standard-8 \
    --zone=us-central1-b \
    --tf-version=1.15 \
    --name=bert-tutorial [optional flag: --project]
  6. 指定した構成が表示されます。承認する場合は y、キャンセルする場合は n を入力してください。

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

        gcloud compute ssh vm-name --zone=us-central1-b
        
        (vm)$ export TPU_NAME=bert-tutorial
        

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

BERT リポジトリのクローンを作成する

Compute Engine 仮想マシン(VM)から、BERT リポジトリのクローンを作成します。

    (vm)$ git clone https://github.com/google-research/bert
    

download_glue_data.py をダウンロード

このチュートリアルでは、GLUE(General Language Understanding Evaluation)ベンチマークを使用してモデル パフォーマンスの評価と分析を行います。このベンチマークを使用するには、次の git clone コマンドを使用して download_glue_data.py スクリプトをダウンロードします。

    (vm)$ git clone https://gist.github.com/60c2bdb54d156a41194446737ce03e2e.git download_glue_data
    

GLUE データをダウンロードする

次に、Compute Engine VM で download_glue_data.py を実行します。

    (vm)$ python3 download_glue_data/download_glue_data.py --data_dir $HOME/glue_data --tasks all
    

パラメータ値を定義する

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

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
    (vm)$ export BERT_BASE_DIR=gs://cloud-tpu-checkpoints/bert/uncased_L-12_H-768_A-12
    (vm)$ export GLUE_DIR=$HOME/glue_data
    (vm)$ export TASK_NAME=MRPC
    
パラメータ 説明
STORAGE_BUCKET 「始める前に」のセクションで作成した Cloud Storage バケットの名前です。
BERT_BASE_DIR トレーニングに使用されるファイルが含まれているディレクトリです。このチュートリアルでは、Cloud Storage バケット内のフォルダを使用します。このフォルダを事前に作成する必要はありません。フォルダが存在しない場合は、スクリプトによって自動作成されます。
GLUE_DIR GLUE トレーニング データを格納するディレクトリです。
TASK_NAME 実行するトレーニングのタイプ。このチュートリアルでは、`MRPC` という値を使用して Microsoft Research Paraphrase Corpus を指定します。

モデルのトレーニング

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

    python3 ./bert/run_classifier.py \
    --task_name=${TASK_NAME} \
    --do_train=true \
    --do_eval=true \
    --data_dir=${GLUE_DIR}/${TASK_NAME} \
    --vocab_file=${BERT_BASE_DIR}/vocab.txt \
    --bert_config_file=${BERT_BASE_DIR}/bert_config.json \
    --init_checkpoint=${BERT_BASE_DIR}/bert_model.ckpt \
    --max_seq_length=128 \
    --train_batch_size=32 \
    --learning_rate=2e-5 \
    --num_train_epochs=3.0 \
    --output_dir=${STORAGE_BUCKET}/${TASK_NAME}-output/ \
    --use_tpu=True \
    --tpu_name=${TPU_NAME}
    

結果の確認

トレーニングの所要時間は 5 分未満です。トレーニングが完了すると、次のような結果が表示されます。

    ***** Eval results *****
      eval_accuracy = 0.845588
      eval_loss = 0.64990824
      global_step = 343
      loss = 0.34979442
    

クリーンアップ

このトピックで使用したリソースについて GCP アカウントに課金されないようにする手順は次のとおりです。

  1. Compute Engine VM との接続を解除します。

        (vm)$ exit
        

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

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

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

        $ ctpu status --zone=us-central1-b
        
        2018/04/28 16:16:23 WARNING: Setting zone to "--zone=us-central1-b"
        No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
        
  4. 次に示すように gsutil を実行します。bucket-name の部分は、このチュートリアルで作成した Cloud Storage バケット名に置き換えます。

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