在 Cloud TPU 上运行 Tensor2Tensor Transformer

本教程介绍如何在 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

您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

如果您计划使用 TPU Pod 切片训练,请务必阅读在 TPU Pod 上训练,它有在 Pod 切片上训练时的特殊注意事项说明。

在开始学习本教程之前,请按照以下步骤检查您的 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}
    

    当您第一次在新的 Cloud Shell 虚拟机中运行此命令时,系统会显示 Authorize Cloud Shell 页面。点击页面底部的 Authorize 以允许 gcloud 使用您的凭据进行 GCP API 调用。

  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 europe-west4 -b on gs://bucket-name
    

    此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。本教程中使用的 gcloud compute tpus execution-groups 工具会为 Cloud TPU 服务帐号设置默认权限。如果您需要更精细的权限,请查看访问级层权限

    存储分区位置必须与虚拟机 (VM) 和 TPU 节点位于同一区域。虚拟机和 TPU 节点位于特定地区,即区域内的细分。

  6. 使用 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 参考文档

  7. 此时会显示您指定的配置。输入 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 虚拟机上:

  1. 创建以下几个环境变量:

    (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
  2. 创建一个目录用以存储临时文件:

    (vm)$ mkdir ${TMP_DIR}
  3. 添加用于处理模型数据的 tensor2tensor 脚本的路径:

    (vm)$ export PATH=.local/bin:${PATH}

在单个 Cloud TPU 上训练语言模型

  1. 为语言模型生成训练数据集。

    (vm)$ t2t-datagen --problem=languagemodel_lm1b32k_packed \
     --data_dir=${DATA_DIR} \
     --tmp_dir=${TMP_DIR}

    命令标志说明

    problem
    问题名称。
    data_dir
    训练输入的 Cloud Storage 路径。
    tmp_dir
    临时存储目录。
  2. 运行以下命令以创建 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 的名称。
  3. 为 TPU 名称设置环境变量。

    (vm)$ export TPU_NAME=transformer-tutorial
  4. 运行训练脚本。

    (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 万之后,该模型便会趋于最高质量。

  5. 删除您创建的 Cloud TPU 资源。

    $ gcloud compute tpus execution-groups delete transformer-tutorial \
      --zone=europe-west4-a \
      --tpu-only

在 Cloud TPU Pod 上训练语言模型

  1. 运行 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-only
    创建 Cloud TPU,而不创建虚拟机。默认情况下,gcloud compute tpus execution-groups 命令会同时创建虚拟机和 Cloud TPU。
    accelerator-type
    要创建的 Cloud TPU 的类型
    name
    要创建的 Cloud TPU 的名称。
    zone
    您计划在其中创建 Cloud TPU 的区域
    tf-version
    TensorFlow ctpu 安装在虚拟机上的版本。
  2. 为新 TPU 名称设置环境变量。

    (vm)$ export TPU_NAME=transformer-tutorial-pod
  3. 运行训练脚本。

    (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 万之后,该模型便会趋于最高质量。

  4. 删除为训练创建的 Cloud TPU 资源。

    (vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \
      --zone=europe-west4-a \
      --tpu-only

在单个 Cloud TPU 上训练英德翻译模型

  1. 使用 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
    临时存储目录。
  2. 运行以下命令以创建 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 的名称。
  3. 为新 TPU 名称设置环境变量。

    (vm)$ export TPU_NAME=transformer-tutorial
  4. 运行 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 万之后,该模型便会趋于最高质量。

  5. 删除为在单台设备上训练模型而创建的 Cloud TPU 资源。

    (vm)$ gcloud compute tpus execution-groups delete transformer-tutorial \
     --tpu-only \
     --zone=europe-west4-a 

在单个 Cloud TPU 上训练情感分类器

  1. 生成情感分类器模型的数据集。

    (vm)$ t2t-datagen --problem=sentiment_imdb \
     --data_dir=${DATA_DIR} \
     --tmp_dir=${TMP_DIR}
  2. 运行以下命令以创建 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 的名称。
  3. 运行训练脚本。

    (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 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

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

    (vm)$ exit
    

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

  2. 在您的 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
    
  3. 通过运行 gcloud compute tpus execution-groups list 验证资源是否已删除。删除操作可能需要几分钟时间才能完成。如下所示的响应表明实例已成功删除。

    $ gcloud compute tpus execution-groups list \
     --zone=europe-west4-a
    

    您应该会看到如下所示的空白 TPU 列表:

       NAME             STATUS
    
  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 支持模型通用的超参数的相关信息。您可以在每个模型的源代码中寻找模型专用超参数的相关信息。如需详细了解超参数调节,请参阅超参数调节概览使用超参数调节服务调节超参数

推断

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