使用 Cloud TPU 调整 BERT 模型:句子和句对分类任务

本教程介绍如何在 Cloud TPU 上训练基于 Transformer 的双向编码器表示法 (BERT) 模型。

BERT 是预训练语言表示法的一种方法。预训练涉及 BERT 如何首先针对大量文本进行训练,例如维基百科。然后,您可以将训练结果应用于其他自然语言处理 (NLP) 任务,例如问答系统情感分析。借助 BERT 和 Cloud TPU,您可以在大约 30 分钟内训练各种 NLP 模型。

如需详细了解 BERT,请参阅以下资源:

目标

  • 创建 Cloud Storage 存储分区以保存数据集和模型输出。
  • 克隆 BERT 代码库和其他所需文件。
  • 运行训练工作。
  • 验证输出结果。

费用

本教程使用 Google Cloud 的以下收费组件:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

请使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

本部分介绍如何设置 Cloud Storage 存储分区和 Compute Engine 虚拟机。

  1. 打开一个 Cloud Shell 窗口。

    打开 Cloud Shell

  2. 为项目 ID 创建一个变量。

    export PROJECT_ID=project-id
    
  3. 配置 gcloud 命令行工具,以使用要在其中创建 Cloud TPU 的项目。

    gcloud config set project ${PROJECT_ID}
    

    当您第一次在新的 Cloud Shell 虚拟机中运行此命令时,系统会显示 Authorize Cloud Shell 页面。点击页面底部的 Authorize 以允许 gcloud 使用您的凭据进行 GCP API 调用。

  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 us-central1 -b on gs://bucket-name
    

    此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。

    为了让 Cloud TPU 能够读取和写入存储分区,您项目的服务帐号需要对其拥有读写或管理员权限。如需了解如何查看和设置这些权限,请参阅有关存储分区的部分。

  6. 使用 gcloud compute tpus execution-groups 命令启动 Compute Engine 虚拟机和 Cloud TPU。

    $ gcloud compute tpus execution-groups create \
     --name=bert-tutorial \
     --zone=us-central1-b \
     --tf-version=1.15.5 \
     --machine-type=n1-standard-8 \
     --accelerator-type=v3-8
    

    命令标志说明

    name
    要创建的 Cloud TPU 的名称。
    zone
    拟在其中创建 Cloud TPU 的区域
    tf-version
    在虚拟机上安装的 Tensorflow gcloud 的版本。
    machine-type
    要创建的 Compute Engine 虚拟机的机器类型
    accelerator-type
    要创建的 Cloud TPU 的类型

    如需详细了解 gcloud 命令,请参阅 gcloud 参考文档

  7. 此时会显示您指定的配置。输入 y 批准或输入 n 取消。

    gcloud 命令执行完毕后,验证 shell 提示符已从 username@project 更改为 username@vm-name。此变化表明您现已登录 Compute Engine 虚拟机。

    gcloud compute ssh bert-tutorial --zone=us-central1-b
    

在您继续按照这些说明操作时,请在虚拟机会话窗口中运行以 (vm)$ 开头的每个命令。

  1. 定义一些环境变量

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export TPU_NAME=bert-tutorial
    (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
    

克隆 BERT 代码库

从您的 Compute Engine 虚拟机克隆 BERT 代码库。

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

下载 download_glue_data.py

本教程使用通用语言理解评估 (GLUE) 基准来评估和分析模型的性能。如需使用此基准,请使用以下 git clone 命令下载 download_glue_data.py 脚本:

(vm)$ git clone https://gist.github.com/7f702beb69199612a039004f42c9982e.git download_glue_data

下载 GLUE 数据

接下来,在您的 Compute Engine 虚拟机上运行 download_glue_data.py

(vm)$ python3 download_glue_data/download_glue_data.py --data_dir $HOME/glue_data --tasks ${TASK_NAME}

训练模型

从您的 Compute Engine 虚拟机运行以下命令。

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}

命令标志说明

task_name
任务名称。在本教程中,我们使用 Microsoft Research Paraphrase Corpus (MSRPC) 任务。
do_train
执行模型训练。
do_eval
执行模型评估。
data_dir
存储训练数据的 Cloud Storage 路径。
vocab_file
BERT 词汇表文件。
bert_config_file
BERT 配置文件。
init_checkpoint
包含预训练 BERT 模型的初始检查点的 json 文件路径。
max_seq_length
文本序列长度上限。BERT 将标记化文本序列的长度上限限制为 512。您可以将任何序列长度设置为等于或低于此值。
train_batch_size
训练批次大小。
learning_rate
学习速率。
num_train_epochs
训练模型的周期数。
output_dir
训练脚本输出目录。
use_tpu
设置为 true 以在 Cloud TPU 上进行训练。
tpu_name
要用于训练的 Cloud TPU 的名称。

验证结果

训练时间应不超过 5 分钟。训练结束后,您应该会看到类似于以下内容的结果:

I1109 21:55:34.984220 139985090225920 run_classifier.py:923] ***** Eval results *****
INFO:tensorflow:  eval_accuracy = 0.8455882
I1109 21:55:34.984345 139985090225920 run_classifier.py:925]   eval_accuracy = 0.8455882
INFO:tensorflow:  eval_loss = 0.77791333
I1109 21:55:34.984572 139985090225920 run_classifier.py:925]   eval_loss = 0.77791333
INFO:tensorflow:  global_step = 343
I1109 21:55:34.984693 139985090225920 run_classifier.py:925]   global_step = 343
INFO:tensorflow:  loss = 0.88203496
I1109 21:55:34.984774 139985090225920 run_classifier.py:925]   loss = 0.88203496

清理

为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

  1. 与 Compute Engine 虚拟机断开连接:

    (vm)$ exit
    

    您的提示符现在应为 user@projectname,表明您位于 Cloud Shell 中。

  2. 在 Cloud Shell 中,使用下面显示的 gcloud compute tpus execution-groups 命令删除您的 Compute Engine 虚拟机和 Cloud TPU。

    $ gcloud compute tpus execution-groups delete bert-tutorial \
      --zone=us-central1-b
    
  3. 通过运行 gcloud compute tpus execution-groups list 验证资源是否已删除。删除操作可能需要几分钟时间才能完成。如下所示的响应表明实例已成功删除。

    $ gcloud compute tpus execution-groups list \
      --zone=us-central1-b
    
       NAME             STATUS
    
  4. 使用 gsutil 删除 Cloud Storage 存储分区,如下所示。将 bucket-name 替换为您的 Cloud Storage 存储分区的名称。

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

后续步骤

在本教程中,您已使用示例数据集训练 BERT 模型。此训练的结果(在大多数情况下)不能用于推断。要使用模型进行推断,您可以在公开提供的数据集或您自己的数据集上训练数据。在 Cloud TPU 上训练的模型要求数据集采用 TFRecord 格式。

您可以使用数据集转换工具示例将图片分类数据集转换为 TFRecord 格式。如果您未使用图片分类模型,则必须自行将数据集转换为 TFRecord 格式。如需了解详情,请参阅 TFRecord 和 tf.Example

超参数调节

如需使用数据集提升模型的性能,您可以调节模型的超参数。您可以在 GitHub 上寻找所有 TPU 支持模型通用的超参数的相关信息。您可以在每个模型的源代码中寻找模型专用超参数的相关信息。如需详细了解超参数调节,请参阅超参数调节概览使用超参数调节服务调节超参数

推理

训练模型后,您可以使用该模型进行推断(也称为预测)。AI Platform 是一款基于云的解决方案,用于开发、训练部署机器学习模型。部署模型后,您可以使用 AI Platform Prediction 服务