使用 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 存储桶:

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

    此 Cloud Storage 存储桶存储您用于训练模型的数据和训练结果。用于创建 TPU 的命令(TPU 节点架构使用 gcloud compute tpus execution-groups create 或 TPU 虚拟机架构使用 gcloud compute tpus tpu-vm create)会为您在上一步中设置的 Cloud TPU 服务帐号设置默认权限。如果您需要更精细的权限,请参阅访问权限级别权限

    存储桶位置必须要与 Compute Engine(虚拟机)和 Cloud TPU 节点位于同一区域。

  6. 使用 gcloud 命令启动 Compute Engine 虚拟机和 Cloud TPU。 使用的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需详细了解这两种虚拟机架构,请参阅系统架构。 如需详细了解 gcloud 命令,请参阅 gcloud 参考文档

    TPU 虚拟机

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

    命令标志说明

    zone
    您计划在其中创建 Cloud TPU 的区域
    accelerator-type
    加速器类型指定要创建的 Cloud TPU 的版本和大小。如需详细了解每个 TPU 版本支持的加速器类型,请参阅 TPU 版本
    version
    Cloud TPU 软件版本

    TPU 节点

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

    命令标志说明

    name
    要创建的 Cloud TPU 的名称。
    zone
    您计划在其中创建 Cloud TPU 的区域
    tf-version
    TensorFlow ctpu 的版本会安装在虚拟机上。
    machine-type
    要创建的 Compute Engine 虚拟机的 机器类型
    accelerator type
    要创建的 Cloud TPU 的 类型
  7. 如果您未自动登录 Compute Engine 实例,请通过运行以下 ssh 命令进行登录。登录虚拟机后,shell 提示符会从 username@projectname 更改为 username@vm-name

    TPU 虚拟机

    gcloud compute tpus tpu-vm ssh bert-tutorial --zone=us-central1-b
    

    TPU 节点

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

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

  8. 为 TPU 名称创建环境变量。

    TPU 虚拟机

    (vm)$ export TPU_NAME=local
    

    TPU 节点

    (vm)$ export TPU_NAME=bert-tutorial
    

准备数据集

  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)$ gsutil -m cp -R uncased_L-12_H-768_A-12 ${STORAGE_BUCKET} 

训练模型

  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 要求。

    使用的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。

    TPU 虚拟机

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

    TPU 节点

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

    TPU 虚拟机

    (vm)$ export PYTHONPATH=/usr/share/tpu/models
    

    TPU 节点

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

    TPU 虚拟机

    (vm)$ cd /usr/share/tpu/models
    

    TPU 节点

    (vm)$ cd /usr/share/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 资源。 用于删除资源的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需了解详情,请参阅系统架构

    TPU 虚拟机

    $ gcloud compute tpus tpu-vm delete bert-tutorial \
    --zone=us-central1-b
    

    TPU 节点

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

    TPU 虚拟机

    $ gcloud compute tpus tpu-vm list --zone=us-central1-b

    TPU 节点

    $ gcloud compute tpus execution-groups list --zone=us-central1-b
  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

超参数调优

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

推理

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