在 Cloud TPU 上训练 (TF 2.x)


本教程介绍如何使用 tf.distribute.TPUStrategy 在 Cloud TPU 上训练 Keras ResNet-RS 模型。如需详细了解 ResNet-RS,请参阅重新访问 ResNet:改进的训练和扩缩策略

如果您不熟悉 Cloud TPU,强烈建议您浏览quickstart,了解如何创建 TPU 和 Compute Engine 虚拟机。

目标

  • 创建 Cloud Storage 存储桶以保存数据集和模型输出。
  • 准备与 ImageNet 数据集类似的 fake_imagenet 数据集。
  • 运行训练作业。
  • 验证输出结果。

费用

在本文档中,您将使用 Google Cloud 的以下收费组件:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

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

准备工作

在开始学习本教程之前,请检查您的 Google Cloud 项目是否已正确设置。

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. 在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目

    转到“项目选择器”

  5. 确保您的 Google Cloud 项目已启用结算功能

  6. 本演示使用 Google Cloud 的收费组件。请查看 Cloud TPU 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。

设置资源

本部分介绍如何为教程设置 Cloud Storage 存储空间、虚拟机和 Cloud TPU 资源。

  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 使用您的凭据进行 Google Cloud 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 gs://bucket-name
    

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

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

  6. 使用 gcloud 命令启动 Compute Engine 虚拟机。

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --name=resnet-rs-tutorial \
     --zone=europe-west4-a \
     --disk-size=300 \
     --machine-type=n1-standard-16 \
     --tf-version=2.12.0
     

    命令标志说明

    vm-only
    仅创建虚拟机,不创建 TPU。
    name
    要创建的 TPU 的名称。
    zone
    要在其中创建 Cloud TPU 的可用区
    disk-size
    通过 gcloud compute tpus execution-groups 命令创建的虚拟机的硬盘大小(以 GB 为单位)。
    machine-type
    要创建的 Compute Engine 虚拟机的机器类型

    如需详细了解 gcloud 命令,请参阅 gcloud 参考文档

  7. 在出现提示时,按 y 创建 Cloud TPU 资源。

    gcloud compute tpus execution-groups 命令执行完毕后,验证 shell 提示符已从 username@projectname 更改为 username@vm-name。 此变化表明您现已登录 Compute Engine 虚拟机。

    gcloud compute ssh resnet-rs-tutorial --zone=europe-west4-a
    

    继续按照这些说明操作,在 Compute Engine 实例中运行以 (vm)$ 开头的每个命令。

  8. 安装必要的软件包。

    $ pip3 install tensorflow-text==2.8.1 --no-deps

设置 Cloud Storage 存储桶变量

设置以下环境变量,将 bucket-name 替换为 Cloud Storage 存储桶的名称:

(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-rs-2x
(vm)$ export IMAGENET_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
(vm)$ export PYTHONPATH=/usr/share/models
(vm)$ export TPU_NAME=resnet-rs-tutorial

训练应用应该能够访问 Cloud Storage 中的训练数据。在训练期间,训练应用还会使用您的 Cloud Storage 存储桶来存储检查点。

Cloud TPU 单设备训练和评估

ImageNet 是一个图片数据库。数据库中的图片被整理为一个层次结构,该层次结构中的每个节点由成百上千个图片进行描述。

本教程使用演示版的完整 ImageNet 数据集,该数据集又称为 fake_imagenetfake_imagenet。此演示版本可用于测试教程,同时降低通常与使用完整 ImageNet 数据库运行模型相关的存储和时间要求。

此 fake_imagenet 数据集位于 Cloud Storage 上的以下位置:

gs://cloud-tpu-test-datasets/fake_imagenet

此 fake_imagenet 数据集仅用于了解如何使用 Cloud TPU 并验证端到端性能。准确率数字和保存的模型并无实际意义。

如需了解如何下载和处理完整 ImageNet 数据集,请参阅下载、预处理和上传 ImageNet 数据集

  1. 使用 gcloud 命令创建 Cloud TPU。

    $ gcloud compute tpus execution-groups create \
     --tpu-only \
     --accelerator-type=v3-8  \
     --name=resnet-rs-tutorial \
     --zone=europe-west4-a \
     --tf-version=2.12.0

    命令标志说明

    tpu-only
    请仅创建 TPU,不要创建虚拟机。
    accelerator-type
    要创建的 Cloud TPU 的类型
    name
    要创建的 TPU 的名称。
    zone
    要在其中创建 Cloud TPU 的可用区
    tf-version
    安装在虚拟机上的 Tensorflow 版本。
  2. 设置 TPU_NAME 名称变量。

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

    (vm)$ python3 /usr/share/models/official/vision/beta/train.py \
    --experiment=resnet_rs_imagenet \
    --mode=train_and_eval \
    --model_dir=$MODEL_DIR \
    --tpu=$TPU_NAME \
    --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
    --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
    

    命令标志说明

    experiment
    要运行的实验的名称。
    mode
    运行脚本的模式。有效值为“train”、“eval”或“train_and_eval”。
    model_dir
    在训练期间存储检查点和摘要的 Cloud Storage 存储桶。您可以使用现有文件夹加载根据相同大小和 TensorFlow 版本的先前生成 TPU 创建的检查点。
    tpu
    需使用的 TPU 的名称。
    config_file
    脚本配置文件的路径。
    params_override
    替换在脚本配置文件中设置的设置。

这将训练 ResNet-RS 进行 100 个训练步骤,并在 5 分钟之内完成 v3-8 TPU 节点。训练脚本输出应包括如下所示的文本:

{
  'train_loss': 1.435225,
  'train_accuracy': 0.00084427913
}

训练脚本也会执行评估。评估输出应包含如下文本:

Run stats:
{
  'eval_loss': 0.861013,
  'eval_acc': 0.001,
  'train_loss': 1.435225,
  'train_acc': 0.00084427913,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1606330585.7613473>',
    'BatchTimestamp<batch_index: 500,
    timestamp: 1606330883.8486104>',
    'BatchTimestamp<batch_index: 1000,
    timestamp: 1606331119.515312>',
    'BatchTimestamp<batch_index: 1251,
    timestamp: 1606331240.7516596>'
  ],
  'train_finish_time': 1606331296.395158,
  'avg_exp_per_second': 1951.6983246161021
}

如需将 ResNet-RS 模型收敛,请省略 trainer.train_steps=100 参数,如以下脚本所示。训练和评估是一起完成的。

(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
  --experiment=resnet_rs_imagenet \
  --mode=train_and_eval \
  --model_dir=$MODEL_DIR \
  --tpu=$TPU_NAME \
  --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
  --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"

命令标志说明

experiment
要运行的实验的名称。
mode
运行脚本的模式。有效值为“train”、“eval”或“train_and_eval”。
model_dir
在训练期间存储检查点和摘要的 Cloud Storage 存储桶。您可以使用现有文件夹加载根据相同大小和 TensorFlow 版本的先前生成 TPU 创建的检查点。
tpu
需使用的 TPU 的名称。
config_file
脚本配置文件的路径。
params_override
替换在脚本配置文件中设置的设置。

由于训练和评估是利用 fake_imagenet 数据集完成的,因此输出结果不会反映实际输出,实际输出在利用实际数据集执行训练和评估时才会出现。

此时,您可以结束本教程并清理 Google Cloud 资源,也可以进一步了解如何在 Cloud TPU Pod 上运行模型。

使用较大的模型

ResNet-RS 提供不同大小的模型系列,模型越大,通常代价越高,计算费用越高。如需了解详情,请参阅重新访问 ResNet:改进的训练和扩缩策略

您可以通过更改以下命令中的 config_file 来选择要训练的模型的大小。

(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
  --experiment=resnet_rs_imagenet \
  --mode=train_and_eval \
  --model_dir=$MODEL_DIR \
  --tpu=$TPU_NAME \
  --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs200_i256.yaml \
  --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"

可用配置位于虚拟机的 /usr/share/models/official/vision/beta/configs/experiments/ 中。

使用 Cloud TPU Pod 扩缩模型

在 Cloud TPU Pod 上训练模型可能需要对训练脚本进行一些更改。如需了解详情,请参阅在 TPU Pod 上训练

您可以使用 Cloud TPU Pod 扩缩模型,以便更快获得结果。完全受支持的 ResNet-RS-50 模型可与以下 Pod 切片配合使用:

  • v2-32
  • v3-32

借助 Cloud TPU Pod,训练和评估可同时完成。

使用 Cloud TPU Pod 进行训练

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

    (vm)$ gcloud compute tpus execution-groups delete resnet-rs-tutorial \
      --zone=europe-west4-a \
      --tpu-only
  2. 为 Pod 创建新的 Cloud TPU 资源,并使用 accelerator-type 参数指定要使用的 Pod 切片。例如,以下命令使用 v2-32 Pod 切片。

    (vm)$ gcloud compute tpus execution-groups  create --name=resnet-rs-tutorial \
      --accelerator-type=v3-32  \
      --zone=europe-west4-a \
      --tf-version=2.12.0 \
      --tpu-only
    

    命令标志说明

    name
    要创建的 Cloud TPU 的名称。
    accelerator-type
    要创建的 Cloud TPU 的类型
    zone
    您计划在其中创建 Cloud TPU 的区域
    tf-version
    TensorFlow gcloud 的版本会安装在虚拟机上。
    tpu-only
    仅创建 Cloud TPU。默认情况下,gcloud 命令会同时创建虚拟机和 Cloud TPU。
  3. 运行训练脚本。

    (vm)$ python3 /usr/share/models/official/vision/beta/train.py \
    --experiment=resnet_rs_imagenet \
    --mode=train_and_eval \
    --model_dir=$MODEL_DIR \
    --tpu=$TPU_NAME \
    --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
    --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
    

    命令标志说明

    experiment
    要运行的实验的名称。
    mode
    运行脚本的模式。有效值为“train”、“eval”或“train_and_eval”。
    model_dir
    在训练期间存储检查点和摘要的 Cloud Storage 存储桶。您可以使用现有文件夹加载根据相同大小和 TensorFlow 版本的先前生成 TPU 创建的检查点。
    tpu
    需使用的 TPU 的名称。
    config_file
    脚本配置文件的路径。
    params_override
    替换在脚本配置文件中设置的设置。

这将训练 ResNet-RS 进行 100 个训练步骤,并在 5 分钟之内完成 v3-8 TPU 节点。训练脚本输出应包括如下所示的文本:

{
  'train_loss': 1.435225,
  'train_accuracy': 0.00084427913
}

训练脚本也会执行评估。评估输出应包含如下文本:

Run stats:
{
  'eval_loss': 0.861013,
  'eval_acc': 0.001,
  'train_loss': 1.435225,
  'train_acc': 0.00084427913,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1606330585.7613473>',
    'BatchTimestamp<batch_index: 500,
    timestamp: 1606330883.8486104>',
    'BatchTimestamp<batch_index: 1000,
    timestamp: 1606331119.515312>',
    'BatchTimestamp<batch_index: 1251,
    timestamp: 1606331240.7516596>'
  ],
  'train_finish_time': 1606331296.395158,
  'avg_exp_per_second': 1951.6983246161021
}

训练和评估是一起完成的。每个周期都有 1251 个步骤,总计 112590 个训练步骤和 48 个评估步骤。

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

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

    (vm)$ exit
    

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

  2. 在您的 Cloud Shell 中,使用以下命令删除您的 Compute Engine 虚拟机和 Cloud TPU:

    $ gcloud compute tpus execution-groups delete resnet-rs-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 支持模型通用的超参数信息。您可以在每个模型的源代码中找到有关模型特有超参数的信息。如需详细了解超参数调节,请参阅超参数调节概览调节超参数

推断

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