本教程介绍如何使用 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 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
本演示使用 Google Cloud 的收费组件。请查看 Cloud TPU 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。
设置资源
本部分介绍如何为教程设置 Cloud Storage 存储空间、虚拟机和 Cloud TPU 资源。
打开一个 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
使用您的凭据进行 Google Cloud 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 gs://bucket-name
此 Cloud Storage 存储桶存储您用于训练模型的数据和训练结果。本教程中使用的
gcloud compute tpus execution-groups
工具会为您在上一步中设置的 Cloud TPU 服务账号设置默认权限。如果您需要更精细的权限,请查看访问级层权限。存储桶位置必须要与 Compute Engine(虚拟机)和 Cloud TPU 节点位于同一区域。
使用
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
命令标志说明
如需详细了解
gcloud
命令,请参阅 gcloud 参考文档。在出现提示时,按 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)$
开头的每个命令。安装必要的软件包。
$ 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 数据集。
使用
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_NAME
名称变量。(vm)$ export TPU_NAME=resnet-rs-tutorial
运行训练脚本。
(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 进行训练
删除为在单台设备上训练模型而创建的 Cloud TPU 资源。
(vm)$ gcloud compute tpus execution-groups delete resnet-rs-tutorial \ --zone=europe-west4-a \ --tpu-only
为 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
运行训练脚本。
(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 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
断开与 Compute Engine 实例的连接(如果您尚未这样做):
(vm)$ exit
您的提示符现在应为
username@projectname
,表明您位于 Cloud Shell 中。在您的 Cloud Shell 中,使用以下命令删除您的 Compute Engine 虚拟机和 Cloud TPU:
$ gcloud compute tpus execution-groups delete resnet-rs-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 支持模型通用的超参数信息。您可以在每个模型的源代码中找到有关模型特有超参数的信息。如需详细了解超参数调节,请参阅超参数调节概览和调节超参数。
推断
训练完模型后,您可以使用它进行推理(也称为预测)。您可以使用 Cloud TPU 推理转换器工具准备和优化 TensorFlow 模型,以在 Cloud TPU v5e 上进行推断。如需详细了解 Cloud TPU v5e 上的推断,请参阅 Cloud TPU v5e 推断简介。