本教程介绍如何在 Cloud TPU 上使用 Tensor2Tensor 训练 Transformer 模型(请参阅 Attention Is All You Need 这篇文章)。
模型说明
Transformer 模型使用堆叠的自注意力层和前馈控制层处理顺序输入(如文本)。它支持以下变体:
transformer
(仅解码器),用于单个序列建模。示例使用场景:语言建模。transformer
(编码器 - 解码器),用于序列到序列建模。示例使用场景:翻译。transformer_encoder
(仅限编码器),仅运行编码器,用于序列到类建模。示例使用场景:情感分类。
Transformer 只是 Tensor2Tensor 库中的模型之一。 Tensor2Tensor (T2T) 是一个库,其中包含深度学习模型和数据集,还包含一组用于训练这些模型以及下载和准备数据的脚本。
目标
- 生成训练数据集
- 在单个 Cloud TPU 或 Cloud TPU Pod 上训练语言模型
- 在单个 Cloud TPU 上训练英德翻译模型
- 在单个 Cloud TPU 上训练情感分类器
- 清理 Cloud TPU 资源
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Compute Engine
- Cloud TPU
- Cloud Storage
您可使用价格计算器根据您的预计使用情况来估算费用。
准备工作
如果您计划使用 TPU Pod 切片训练,请务必阅读在 TPU Pod 上训练,它有在 Pod 切片上训练时的特殊注意事项说明。
在开始学习本教程之前,请按照以下步骤检查您的 Google Cloud 项目是否已正确设置。
本部分介绍如何设置 Cloud Storage 存储分区和 Compute Engine 虚拟机。
打开一个 Cloud Shell 窗口。
为项目 ID 创建一个变量。
export PROJECT_ID=project-id
配置 Google Cloud CLI 以使用要在其中创建 Cloud TPU 的项目。
gcloud config set project ${PROJECT_ID}
当您第一次在新的 Cloud Shell 虚拟机中运行此命令时,系统会显示
Authorize Cloud Shell
页面。点击页面底部的Authorize
以允许gcloud
使用您的凭据进行 GCP API 调用。为 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 europe-west4 -b on gs://bucket-name
此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。本教程中使用的
gcloud compute tpus execution-groups
工具会为 Cloud TPU 服务帐号设置默认权限。如果您需要更精细的权限,请查看访问级层权限。存储分区位置必须与虚拟机 (VM) 和 TPU 节点位于同一区域。虚拟机和 TPU 节点位于特定地区,即区域内的细分。
使用
gcloud
命令启动 Compute Engine 虚拟机。$ gcloud compute tpus execution-groups create \ --vm-only \ --name=transformer-tutorial \ --zone=europe-west4-a \ --disk-size=300 \ --machine-type=n1-standard-8 \ --tf-version=1.15.5
命令标志说明
vm-only
- 仅创建虚拟机。默认情况下,
gcloud compute tpus execution-groups
命令会同时创建虚拟机和 Cloud TPU。 name
- 要创建的 Cloud TPU 的名称。
zone
- 您计划在其中创建 Cloud TPU 的区域。
disk-size
- 由
gcloud compute tpus execution-groups
命令创建的虚拟机中的硬盘大小(以 GB 为单位)。 machine-type
- 要创建的 Compute Engine 虚拟机的机器类型,
tf-version
- TensorFlow
gcloud compute tpus execution-groups
安装在虚拟机上的版本。
如需详细了解
gcloud
命令,请参阅 gcloud 参考文档。此时会显示您指定的配置。输入 y 批准或输入 n 取消。
当
gcloud compute tpus execution-groups
命令执行完毕后,验证 shell 提示符已从username@projectname
更改为username@vm-name
。此变化表明您现已登录 Compute Engine 虚拟机。gcloud compute ssh transformer-tutorial --zone=europe-west4-a
继续按照这些说明操作,在 Compute Engine 实例中运行以
(vm)$
开头的每个命令。
在您的 Compute Engine 虚拟机上:
创建以下几个环境变量:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/transformer (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data (vm)$ export TMP_DIR=${HOME}/t2t_tmp
创建一个目录用以存储临时文件:
(vm)$ mkdir ${TMP_DIR}
添加用于处理模型数据的
tensor2tensor
脚本的路径:(vm)$ export PATH=.local/bin:${PATH}
在单个 Cloud TPU 上训练语言模型
为语言模型生成训练数据集。
(vm)$ t2t-datagen --problem=languagemodel_lm1b32k_packed \ --data_dir=${DATA_DIR} \ --tmp_dir=${TMP_DIR}
命令标志说明
problem
- 问题名称。
data_dir
- 训练输入的 Cloud Storage 路径。
tmp_dir
- 临时存储目录。
运行以下命令以创建 Cloud TPU 资源。
(vm)$ gcloud compute tpus execution-groups create --tpu-only \ --zone=europe-west4-a \ --tf-version=1.15.5 \ --name=transformer-tutorial
命令标志说明
tpu-only
- 仅创建 Cloud TPU。默认情况下,
gcloud compute tpus execution-groups
命令会同时创建虚拟机和 Cloud TPU。 zone
- 拟在其中创建 Cloud TPU 的地区。该地区应与 Compute Engine 虚拟机所用的地区相同。例如
europe-west4-a
。 tf-version
- TensorFlow
ctpu
安装在虚拟机上的版本。 name
- 要创建的 Cloud TPU 的名称。
为 TPU 名称设置环境变量。
(vm)$ export TPU_NAME=transformer-tutorial
运行训练脚本。
(vm)$ t2t-trainer \ --model=transformer \ --hparams_set=transformer_tpu \ --problem=languagemodel_lm1b32k_packed \ --eval_steps=3 \ --data_dir=${DATA_DIR} \ --output_dir=${MODEL_DIR}/language_lm1b32k \ --use_tpu=True \ --cloud_tpu_name=${TPU_NAME} \ --train_steps=10
命令标志说明
model
- 要训练的模型。
hparams_set
- 要在训练期间使用的超参数。
problem
- 问题名称。
eval-steps
- 要评估的步数。
data_dir
- 存储训练数据的 Cloud Storage 路径。
output_dir
- 要运行的基本输出目录。
use_tpu
- 设置为“true”可使用 Cloud TPU,否则设置为“false”。
cloud_tpu_name
- 要用于训练的 Cloud TPU 的名称。
train_steps
- 训练步数。
上述命令会运行 10 个训练步,然后执行 3 个评估步。该过程在 v3-8 TPU 节点上运行大约 5 分钟。为了使此模型更加准确,您需要通过调整
--train_steps
标志来增加训练步骤的数目。建议您至少使用 4 万步来训练模型。通常,当步数达到大约 25 万之后,该模型便会趋于最高质量。删除您创建的 Cloud TPU 资源。
$ gcloud compute tpus execution-groups delete transformer-tutorial \ --zone=europe-west4-a \ --tpu-only
在 Cloud TPU Pod 上训练语言模型
运行
gcloud
命令,并使用accelerator-type
参数指定要使用的 Pod 切片。例如,以下命令使用 v2-32 Pod 切片。(vm)$ gcloud compute tpus execution-groups create \ --tpu-only \ --accelerator-type=v2-32 \ --name=transformer-tutorial-pod \ --zone=europe-west4-a \ --tf-version=1.15.5
为新 TPU 名称设置环境变量。
(vm)$ export TPU_NAME=transformer-tutorial-pod
运行训练脚本。
(vm)$ t2t-trainer \ --model=transformer \ --hparams_set=transformer_tpu \ --problem=languagemodel_lm1b32k_packed \ --eval_steps=3 \ --data_dir=${DATA_DIR} \ --output_dir=${MODEL_DIR}/language_lm1b32k_pod \ --use_tpu=True \ --cloud_tpu_name=${TPU_NAME} \ --tpu_num_shards=32 \ --schedule=train \ --train_steps=25000
命令标志说明
model
- 要训练的模型。
hparams_set
- 要在训练期间使用的超参数。
problem
- 问题名称。
eval-steps
- 要评估的步数。
data_dir
- 存储训练数据的 Cloud Storage 路径。
output_dir
- 要运行的基本输出目录。
use_tpu
- 设置为“true”可使用 Cloud TPU,否则设置为“false”。
cloud_tpu_name
- 要用于训练的 Cloud TPU 的名称。
tpu_num_shards
- Cloud TPU 分片数。默认值为 8。
schedule
- 要运行的实验方法。
train_steps
- 训练模型的步数。
上述命令会运行 25000 个训练步骤,然后执行 3 个评估步骤。在 Cloud TPU v2-32 上完成此训练大约需要 30 分钟。
建议您至少使用 4 万步来训练模型。通常,当步数达到大约 25 万之后,该模型便会趋于最高质量。
删除为训练创建的 Cloud TPU 资源。
(vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \ --zone=europe-west4-a \ --tpu-only
在单个 Cloud TPU 上训练英德翻译模型
使用
t2t-datagen
脚本为 Cloud Storage 存储分区上的翻译模型生成训练和评估数据:(vm)$ t2t-datagen \ --problem=translate_ende_wmt32k_packed \ --data_dir=${DATA_DIR} \ --tmp_dir=${TMP_DIR}
命令标志说明
problem
- 问题名称。
data_dir
- 训练输入的 Cloud Storage 路径。
tmp_dir
- 临时存储目录。
运行以下命令以创建 Cloud TPU 资源。
(vm)$ gcloud compute tpus execution-groups create --tpu-only \ --zone=europe-west4-a \ --tf-version=1.15.5 \ --name=transformer-tutorial
命令标志说明
tpu-only
- 仅创建 Cloud TPU。默认情况下,
gcloud compute tpus execution-groups
命令会同时创建虚拟机和 Cloud TPU。 zone
- 您计划在其中创建 Cloud TPU 的区域。
tf-version
- TensorFlow
gcloud compute tpus execution-groups
安装在虚拟机上的版本。 name
- 要创建的 Cloud TPU 的名称。
为新 TPU 名称设置环境变量。
(vm)$ export TPU_NAME=transformer-tutorial
运行
t2t-trainer
以训练并评估该模型:(vm)$ t2t-trainer \ --model=transformer \ --hparams_set=transformer_tpu \ --problem=translate_ende_wmt32k_packed \ --eval_steps=3 \ --data_dir=${DATA_DIR} \ --output_dir=${MODEL_DIR}/translate_ende \ --use_tpu=True \ --cloud_tpu_name=${TPU_NAME} \ --train_steps=10
命令标志说明
model
- 要训练的模型。
hparams_set
- 要在训练期间使用的超参数。
problem
- 问题名称。
eval-steps
- 要评估的步数。
data_dir
- 存储训练数据的 Cloud Storage 路径。
output_dir
- 要运行的基本输出目录。
use_tpu
- 设置为“true”可使用 Cloud TPU,否则设置为“false”。
cloud_tpu_name
- 要用于训练的 Cloud TPU 的名称。
train_steps
- 训练模型的步数。
上述命令会运行 10 个训练步,然后执行 3 个评估步。该过程在 v3-8 TPU 节点上运行大约 5 分钟。您可以(并且应该)通过调整
--train_steps
标志来增加训练步骤的数目。通常,当步数达到大约 4 万之后,翻译便会开始变得合理。通常,当步数达到大约 25 万之后,该模型便会趋于最高质量。删除为在单台设备上训练模型而创建的 Cloud TPU 资源。
(vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \ --tpu-only \ --zone=europe-west4-a
在单个 Cloud TPU 上训练情感分类器
生成情感分类器模型的数据集。
(vm)$ t2t-datagen --problem=sentiment_imdb \ --data_dir=${DATA_DIR} \ --tmp_dir=${TMP_DIR}
运行以下命令以创建 Cloud TPU 资源。
(vm)$ gcloud compute tpus execution-groups create --tpu-only \ --zone=europe-west4-a \ --tf-version=1.15.5 \ --name=transformer-tutorial
命令标志说明
tpu-only
- 仅创建 Cloud TPU。默认情况下,
gcloud compute tpus execution-groups
命令会同时创建虚拟机和 Cloud TPU。 zone
- 您计划在其中创建 Cloud TPU 的区域。
tf-version
- TensorFlow
gcloud compute tpus execution-groups
安装在虚拟机上的版本。 name
- 要创建的 Cloud TPU 的名称。
运行训练脚本。
(vm)$ t2t-trainer \ --model=transformer_encoder \ --hparams_set=transformer_tiny_tpu \ --problem=sentiment_imdb \ --eval_steps=1 \ --data_dir=${DATA_DIR} \ --output_dir=${MODEL_DIR}/sentiment_classifier \ --use_tpu=True \ --cloud_tpu_name=${TPU_NAME} \ --train_steps=10
命令标志说明
model
- 要训练的模型。
hparams_set
- 要在训练期间使用的超参数。
problem
- 问题名称。
eval-steps
- 要评估的步数。
data_dir
- 存储训练数据的 Cloud Storage 路径。
output_dir
- 要运行的基本输出目录。
use_tpu
- 设置为“true”可使用 Cloud TPU,否则设置为“false”。
cloud_tpu_name
- 要用于训练的 Cloud TPU 的名称。
train_steps
- 训练模型的步数。
上述命令会运行 10 个训练步,然后执行 3 个评估步。该过程在 v3-8 TPU 节点上运行大约 5 分钟。该模型在大约 2000 步之后可实现大约 85% 的准确率。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
断开与 Compute Engine 实例的连接(如果您尚未这样做):
(vm)$ exit
您的提示符现在应为
username@projectname
,表明您位于 Cloud Shell 中。在您的 Cloud Shell 中,使用您在设置 Cloud TPU 时所用的 --zone 标志运行
gcloud compute tpus execution-groups
,以删除 Compute Engine 虚拟机和 Cloud TPU:$ gcloud compute tpus execution-groups delete transformer-tutorial \ --zone=europe-west4-a
通过运行
gcloud compute tpus execution-groups list
验证资源是否已删除。删除操作可能需要几分钟时间才能完成。如下所示的响应表明实例已成功删除。$ gcloud compute tpus execution-groups list \ --zone=europe-west4-a
您应该会看到如下所示的空白 TPU 列表:
NAME STATUS
使用
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 服务。
- 浏览更多面向 TPU 的 Tensor2Tensor 模型。
- 使用更多 TPU 示例进行实验。
- 探索 TensorBoard 中的 TPU 工具。