使用 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}
    
  4. 使用以下命令创建 Cloud Storage 存储分区:

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

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

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

  5. 使用 ctpu up 命令启动 Compute Engine 虚拟机和 Cloud TPU。

    $ ctpu up --tpu-size=v3-8 \
     --machine-type=n1-standard-8 \
     --zone=us-central1-b \
     --tf-version=1.15.3 \
     --name=bert-tutorial
    
  6. 此时会显示您指定的配置。输入 y 批准或输入 n 取消。

  7. ctpu up 命令执行完毕后,验证 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/60c2bdb54d156a41194446737ce03e2e.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 all

训练模型

从您的 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}

验证结果

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

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

后续步骤

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

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

超参数调节

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

推理

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