本教程介绍如何在 Cloud TPU 上训练基于 Transformer 的双向编码器表示法 (BERT) 模型。
BERT 是预训练语言表示法的一种方法。预训练涉及 BERT 如何首先针对大量文本进行训练,例如维基百科。然后,您可以将训练结果应用于其他自然语言处理 (NLP) 任务,例如问答系统和情感分析。借助 BERT 和 Cloud TPU,您可以在大约 30 分钟内训练各种 NLP 模型。
如需详细了解 BERT,请参阅以下资源:
目标
- 创建 Cloud Storage 存储桶以保存数据集和模型输出。
- 运行训练作业。
- 验证输出结果。
费用
本教程使用 Google Cloud 的以下收费组件:
- Compute Engine
- Cloud TPU
- Cloud Storage
您可使用价格计算器根据您的预计使用情况来估算费用。
准备工作
本部分介绍如何设置 Cloud Storage 存储桶和 Compute Engine 虚拟机。
打开一个 Cloud Shell 窗口。
为项目 ID 创建一个变量。
export PROJECT_ID=project-id
将 Google Cloud CLI 配置为使用您要创建 Cloud TPU 的项目。
gcloud config set project ${PROJECT_ID}
为 Cloud TPU 项目创建服务帐号。
gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
该命令将返回以下格式的 Cloud TPU 服务帐号:
service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
使用以下命令创建 Cloud Storage 存储桶:
gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
此 Cloud Storage 存储桶存储您用于训练模型的数据和训练结果。用于创建 TPU 的命令(
gcloud compute tpus execution-groups create
用于 TPU 节点架构,gcloud compute tpus tpu-vm create
用于 TPU 虚拟机架构)会为您在上一步中设置的 Cloud TPU 服务帐号设置默认权限。如果您需要更精细的权限,请查看访问权限级别权限。存储桶位置必须要与 Compute Engine(虚拟机)和 Cloud TPU 节点位于同一区域。
使用
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.11.0
命令标志说明
zone
- 您计划在其中创建 Cloud TPU 的可用区。
accelerator-type
- 要创建的 Cloud TPU 的类型。
version
- Cloud TPU 软件版本。
TPU 节点
$ gcloud compute tpus execution-groups create \ --name=bert-tutorial \ --zone=us-central1-b \ --tf-version=2.11.0 \ --machine-type=n1-standard-1 \ --accelerator-type=v3-8
如果您未自动登录 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)$
开头的每个命令。为 TPU 名称创建环境变量。
TPU 虚拟机
(vm)$ export TPU_NAME=local
TPU 节点
(vm)$ export TPU_NAME=bert-tutorial
准备数据集
定义存储模型和数据集所需的存储桶:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
将预训练的检查点和术语表文件复制到您的存储桶:
(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)$ mv tmp/temp_dir/raw/* uncased_L-12_H-768_A-12 (vm)$ gsutil -m cp -R uncased_L-12_H-768_A-12 gs://bucket-name
训练模型
定义训练和评估模型时所需的若干参数值:
(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
安装 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
设置
PYTHONPATH
环境变量TPU 虚拟机
(vm)$ export PYTHONPATH=/usr/share/tpu/models
TPU 节点
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
切换至存储模型的目录。
TPU 虚拟机
(vm)$ cd /usr/share/tpu/models
TPU 节点
(vm)$ cd /usr/share/models
运行训练脚本:
(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
train
、eval
、train_and_eval
或predict
之一。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...
清理
断开与 Compute Engine 实例的连接(如果您尚未这样做):
(vm)$ exit
您的提示符现在应为
username@projectname
,表明您位于 Cloud Shell 中。删除您的 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
通过运行
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
使用
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 支持模型通用的超参数的相关信息。您可以在每个模型的源代码中寻找模型专用超参数的相关信息。如需详细了解超参数调节,请参阅超参数调节概览、使用超参数调节服务和调节超参数。
推断
训练模型后,您可以使用该模型进行推断(也称为预测)。AI Platform 是一款基于云的解决方案,用于开发、训练和部署机器学习模型。部署模型后,您可以使用 AI Platform Prediction 服务。