使用 Cloud TPU 进行 BERT 微调:句子和句对分类任务 (TF 2.x)


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

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

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

目标

  • 创建 Cloud Storage 存储分区以保存数据集和模型输出。
  • 运行训练作业。
  • 验证输出结果。

费用

在本文档中,您将使用 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. 配置 Google Cloud CLI 以使用要在其中创建项目的项目 Cloud TPU。

    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 存储分区:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central1

    此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。用于创建 TPU 的命令, gcloud compute tpus tpu-vm create用于为 您在上一步中设置的 Cloud TPU 服务账号。如果您需要更精细的权限,请查看访问级层权限

    存储桶位置必须与 TPU (VM) 位于同一区域。

  6. 使用 gcloud 启动 TPU 虚拟机。如需了解详情,请参阅 gcloud 参考文档

    $ gcloud compute tpus tpu-vm create bert-tutorial \
      --zone=us-central1-b \
      --accelerator-type=v3-8 \
      --version=tpu-vm-tf-2.17.0-se

    命令标志说明

    zone
    拟在其中创建 Cloud TPU 的区域
    accelerator-type
    加速器类型指定要创建的 Cloud TPU 的版本和大小。 如需详细了解每个 TPU 版本支持的加速器类型,请参阅 TPU 版本
    version
    Cloud TPU 软件版本
  7. 使用 SSH 连接到 TPU 虚拟机实例。连接到虚拟机后,shell 提示符会从 username@projectname 更改为 username@vm-name

    gcloud compute tpus tpu-vm ssh bert-tutorial --zone=us-central1-b
  8. 为 TPU 名称创建环境变量。

    (vm)$ export TPU_NAME=local

准备数据集

  1. 定义存储模型和数据集所需的存储桶:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
  2. 将预训练的检查点和词汇表文件复制到您的存储桶:

      (vm)$ curl https://storage.googleapis.com/tf_model_garden/nlp/bert/v3/uncased_L-12_H-768_A-12.tar.gz -o uncased_L-12_H-768_A-12.tar.gz
      (vm)$ mkdir -p uncased_L-12_H-768_A-12
      (vm)$ tar -xvf uncased_L-12_H-768_A-12.tar.gz
      (vm)$ gcloud storage cp uncased_L-12_H-768_A-12 ${STORAGE_BUCKET} --recursive

训练模型

  1. 定义训练和评估模型时所需的若干参数值:

      (vm)$ export INIT_CHECKPOINT=${STORAGE_BUCKET}/uncased_L-12_H-768_A-12/bert_model.ckpt
      (vm)$ export TFDS_DIR=${STORAGE_BUCKET}/tfds
      (vm)$ export VOCAB_FILE=${STORAGE_BUCKET}/uncased_L-12_H-768_A-12/vocab.txt
      (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/bert-output
      (vm)$ export TASK=mnli
      

  2. 安装 TensorFlow 要求。

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  3. 设置 PYTHONPATH 环境变量

    (vm)$ export PYTHONPATH=/usr/share/tpu/models
  4. 切换至存储模型的目录。

    (vm)$ cd /usr/share/tpu/models
  5. 运行训练脚本:

    (vm)$ python3 official/nlp/train.py \
      --tpu=${TPU_NAME} \
      --experiment=bert/sentence_prediction_text \
      --mode=train_and_eval \
      --model_dir=${MODEL_DIR} \
      --config_file=official/nlp/configs/experiments/glue_mnli_text.yaml \
      --params_override="runtime.distribution_strategy=tpu, task.init_checkpoint=${INIT_CHECKPOINT}, task.train_data.tfds_data_dir=${TFDS_DIR}, task.train_data.vocab_file=${VOCAB_FILE}, task.validation_data.tfds_data_dir=${TFDS_DIR}, task.validation_data.vocab_file=${VOCAB_FILE}, trainer.train_steps=2000"

    命令标志说明

    tpu
    要用于训练的 Cloud TPU 的名称。
    mode
    trainevaltrain_and_evalpredict 之一。
    model_dir
    在模型训练期间存储检查点和总结的 Cloud Storage 路径。您可以重复使用现有的文件夹来加载之前生成的检查点和存储其他检查点,只要先前的检查点是使用相同大小的 Cloud TPU 和相同 Tensorflow 版本创建的即可。

    该脚本会训练 2000 步,然后运行 307 步的评估。 在 v3-8 TPU 上,大约 5 分钟后,训练脚本应会完成,并显示类似以下内容的结果:

    I0719 00:47:52.683979 140297079573568 controller.py:457] train | step:   2000 | steps/sec:   26.3 | output:
    {'cls_accuracy': 0.7249375,
     'learning_rate': 1.4670059e-05,
     'training_loss': 0.6740678}
    train | step:   2000 | steps/sec:   26.3 | output:
    {'cls_accuracy': 0.7249375,
     'learning_rate': 1.4670059e-05,
     'training_loss': 0.6740678}
    I0719 00:47:53.184051 140297079573568 controller.py:277]  eval | step:   2000 | running 307 steps of evaluation...
    eval | step:   2000 | running 307 steps of evaluation...
    

清理

  1. 断开与 Compute Engine 实例的连接(如果您尚未这样做):

    (vm)$ exit

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

  2. 删除您的 Cloud TPU 和 Compute Engine 资源。

    $ gcloud compute tpus tpu-vm delete bert-tutorial \
      --zone=us-central1-b
  3. 通过运行 gcloud compute tpus tpu-vm list 验证资源是否已删除。删除操作可能需要几分钟时间才能完成。以下命令的输出 不应包含本教程中创建的任何资源:

    $ gcloud compute tpus tpu-vm list --zone=us-central1-b
  4. 使用 gcloud CLI 删除 Cloud Storage 存储桶,如以下示例所示。将 bucket-name 替换为您的 Cloud Storage 存储分区的名称。

    $ gcloud storage rm gs://bucket-name --recursive

后续步骤

TensorFlow Cloud TPU 教程通常使用示例数据集来训练模型。此训练的结果不能用于推理。如需使用模型进行推理,您可以在公开提供的数据集或您自己的数据集上训练数据。在 Cloud TPU 上训练的 TensorFlow 模型 通常需要将数据集 TFRecord 格式。

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

超参数调节

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

推断

训练模型后,您可以使用该模型进行推理(也称为预测)。您可以使用 Cloud TPU 推断转换器 工具来准备和优化 在 Cloud TPU v5e 上用于推理的 TensorFlow 模型。如需详细了解 Cloud TPU v5e 上的推理,请参阅 Cloud TPU v5e 推理简介