本教程介绍如何使用 tf.distribute.TPUStrategy
在 Cloud TPU 上训练 Keras ResNet 模型。
如果您不熟悉 Cloud TPU,强烈建议您浏览框架的快速入门,了解如何创建 TPU 和 Compute Engine 虚拟机。
目标
- 创建 Cloud Storage 存储分区以保存数据集和模型输出。
- 准备与 ImageNet 数据集类似的 fake_imagenet 数据集。
- 运行训练作业。
- 验证输出结果。
费用
本教程使用 Google Cloud 的以下收费组件:
- Compute Engine
- Cloud TPU
- Cloud Storage
您可使用价格计算器根据您的预计使用情况来估算费用。
准备工作
在开始学习本教程之前,请检查您的 Google Cloud 项目是否已正确设置。
- 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
-
在 Google Cloud Console 中的项目选择器页面上,选择或创建一个 Google Cloud 项目。
-
确保您的 Cloud 项目已启用结算功能。了解如何检查项目是否已启用结算功能。
本演示使用 Google Cloud 的收费组件。请查看 Cloud TPU 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。
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
使用您的凭据进行 GCP API 调用。为 Cloud TPU 项目创建服务帐号。
通过服务帐号,Cloud TPU 服务可以访问其他 Google Cloud Platform 服务。
$ 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
命令会为您设置 TPU,还会为在上一步中设置的 Cloud TPU 服务帐号设置默认权限。如果您需要更精细的权限,请查看访问级层权限。准备数据集或使用 fake_imagenet
ImageNet 是一个图片数据库。数据库中的图片被整理为一个层次结构,该层次结构中的每个节点由成百上千个图片进行描述。
本教程使用演示版的完整 ImageNet 数据集,该数据集又称为 fake_imagenet。此演示版本可用于测试教程,同时降低通常与使用完整 ImageNet 数据库运行模型相关的存储和时间要求。
此 fake_imagenet 数据集位于 Cloud Storage 上的以下位置:
gs://cloud-tpu-test-datasets/fake_imagenet
此 fake_imagenet 数据集仅用于了解如何使用 Cloud TPU 并验证端到端性能。准确率数字和保存的模型并无实际意义。
如果您要使用完整的 ImageNet 数据集,请参阅下载、预处理和上传 ImageNet 数据集。
使用
gcloud
命令启动 TPU 资源。使用的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需详细了解这两种虚拟机架构,请参阅系统架构。TPU 虚拟机
$ gcloud alpha compute tpus tpu-vm create resnet-tutorial \ --zone=europe-west4-a \ --accelerator-type=v3-8 \ --version=tpu-vm-tf-2.9.1
命令标志说明
zone
- 您计划在其中创建 Cloud TPU 的可用区。
accelerator-type
- 要创建的 Cloud TPU 的类型。
version
- Cloud TPU 软件版本。
TPU 节点
gcloud compute tpus execution-groups create \ --project=${PROJECT_ID} \ --zone=europe-west4-a \ --name=resnet-tutorial \ --disk-size=300 \ --machine-type=n1-standard-16 \ --accelerator-type=v3-8 \ --tf-version=2.8.0
如需详细了解
gcloud
命令,请参阅 gcloud 参考文档。如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-name
:TPU 虚拟机
$ gcloud alpha compute tpus tpu-vm ssh resnet-tutorial --zone=europe-west4-a
TPU 节点
$ gcloud compute ssh resnet-tutorial --zone=europe-west4-a
在您继续按照这些说明操作时,请在虚拟机会话窗口中运行以
(vm)$
开头的每个命令。设置 Cloud TPU 名称变量。
TPU 虚拟机
(vm)$ export TPU_NAME=local
TPU 节点
(vm)$ export TPU_NAME=resnet-tutorial
设置 Cloud Storage 存储分区变量
设置以下环境变量,将 bucket-name 替换为 Cloud Storage 存储分区的名称:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-2x (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
训练应用预期能够访问您在 Cloud Storage 中的训练数据。在训练期间,训练应用还会使用您的 Cloud Storage 存储分区来存储检查点。
安装 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
ResNet 训练脚本需要额外的软件包。立即安装:
(vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
切换至存储模型的目录。
TPU 虚拟机
(vm)$ cd /usr/share/tpu/models
TPU 节点
(vm)$ cd /usr/share/models
设置
PYTHONPATH
环境变量:TPU 虚拟机
(vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}"
TPU 节点
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
运行训练脚本。这会使用一个 fake_imagenet 数据集并训练 ResNet 100 步。
(vm)$ python3 official/vision/train.py \ --tpu=${TPU_NAME} \ --experiment=resnet_imagenet \ --mode=train_and_eval \ --config_file=official/vision/configs/experiments/image_classification/imagenet_resnet50_tpu.yaml \ --model_dir=${MODEL_DIR} \ --params_override="task.train_data.input_path=${DATA_DIR}/train*, task.validation_data.input_path=${DATA_DIR}/validation*,task.train_data.global_batch_size=2048,task.validation_data.global_batch_size=2048,trainer.train_steps=100"
命令标志说明
tpu
- TPU 的名称。
model_dir
- 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建相应文件夹。使用 Cloud TPU 时,
model_dir
必须是 Cloud Storage 路径 (gs://...
)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 TPU 和相同 TensorFlow 版本创建的即可。
此操作将训练 ResNet 执行 100 步,并将在大约 3 分钟内在 v3-8 TPU 节点上完成。完成 100 个步骤后,系统会显示类似以下内容的输出:
I0624 17:04:26.974905 140457742666816 controller.py:290] eval | step: 100 | eval time: 23.3 sec | output: {'accuracy': 0.0010141226, 'top_5_accuracy': 0.0051457332, 'validation_loss': 8.448798} eval | step: 100 | eval time: 23.3 sec | output: {'accuracy': 0.0010141226, 'top_5_accuracy': 0.0051457332, 'validation_loss': 8.448798}
您现已完成单设备训练示例。请按照以下步骤删除当前的单设备 TPU 资源。
与 Compute Engine 实例断开连接:
(vm)$ exit
您的提示符现在应为
username@projectname
,表明您位于 Cloud Shell 中。删除 TPU 资源。
此时,您可以结束本教程并清理,也可以继续并探索在 Cloud TPU Pod 上运行模型。
使用 Cloud TPU Pod 扩缩模型
在 { product_name_short }} Pod 上训练模型可能需要对训练脚本进行一些更改。如需了解相关信息,请参阅 TPU Pod 训练。
TPU Pod 训练
。本部分介绍如何为 Pod 训练设置 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
使用您的凭据进行 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 gs://bucket-name
此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。本教程中使用的
gcloud
命令会为您在上一步中设置的 Cloud TPU 服务帐号设置默认权限。如果您需要更精细的权限,请查看访问级层权限。存储分区位置必须与 TPU 虚拟机位于同一区域。
准备数据集或使用 fake_imagenet
ImageNet 是一个图片数据库。数据库中的图片被整理为一个层次结构,该层次结构中的每个节点由成百上千个图片进行描述。
默认的 Pod 训练访问完整的 ImageNet 数据集演示版本,称为 fake_imagenet。此演示版本可让您测试 Pod 训练,同时减少通常用完整的 ImageNet 数据库训练模型所占用的存储空间和时间要求。
此 fake_imagenet 数据集仅用于了解如何使用 Cloud TPU 并验证端到端性能。准确率数字和保存的模型并无实际意义。
如果您要使用完整的 ImageNet 数据集,请参阅下载、预处理和上传 ImageNet 数据集。
使用
gcloud
命令启动 Cloud TPU 资源。使用的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需详细了解这两种虚拟机架构,请参阅系统架构。如需详细了解
gcloud
命令,请参阅 gcloud 参考文档。本教程指定 v3-32 Pod。如需了解其他 Pod 选项,请参阅可用的 TPU 类型页面。TPU 虚拟机
$ gcloud alpha compute tpus tpu-vm create resnet-tutorial \ --zone=europe-west4-a \ --accelerator-type=v3-32 \ --version=tpu-vm-tf-2.9.1-pod
命令标志说明
zone
- 您计划在其中创建 Cloud TPU 的可用区。
accelerator-type
- 要创建的 Cloud TPU 的类型。
version
- Cloud TPU 软件版本。
TPU 节点
$ gcloud compute tpus execution-groups create \ --zone=europe-west4-a \ --name=resnet-tutorial \ --accelerator-type=v3-32 \ --tf-version=2.8.0
命令标志说明
zone
- 您计划在其中创建 Cloud TPU 的可用区。
name
- 要创建的 Cloud TPU 的名称。
accelerator-type
- 要创建的 Cloud TPU 的类型。
tf-version
- 虚拟机上安装的 Tensorflow
gcloud
版本。
如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-instance-name
:TPU 虚拟机
$ gcloud alpha compute tpus tpu-vm ssh resnet-tutorial --zone=europe-west4-a
TPU 节点
$ gcloud compute ssh resnet-tutorial --zone=europe-west4-a
在您继续按照这些说明操作时,请在虚拟机会话窗口中运行以
(vm)$
开头的每个命令。导出 Cloud TPU 设置变量:
(vm)$ export ZONE=europe-west4-a (vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export TPU_NAME=resnet-tutorial (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-2x-pod
训练应用预期能够访问您在 Cloud Storage 中的训练数据。在训练期间,训练应用还会使用您的 Cloud Storage 存储分区来存储检查点。
ResNet 训练脚本需要额外的软件包。立即安装:
TPU 虚拟机
(vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
TPU 节点
(vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
安装 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
设置
PYTHONPATH
环境变量:TPU 虚拟机
(vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}" (vm)$ export TPU_LOAD_LIBRARY=0
TPU 节点
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
切换至存储模型的目录。
TPU 虚拟机
(vm)$ cd /usr/share/tpu/models
TPU 节点
(vm)$ cd /usr/share/models/official/legacy/image_classification/resnet
训练模型。
(vm)$ python3 official/vision/train.py \ --tpu=${TPU_NAME} \ --experiment=resnet_imagenet \ --mode=train_and_eval \ --config_file=official/vision/configs/experiments/image_classification/imagenet_resnet50_tpu.yaml \ --model_dir=${MODEL_DIR} \ --params_override="task.train_data.input_path=${DATA_DIR}/train*, task.validation_data.input_path=${DATA_DIR}/validation*,trainer.train_steps=100"
命令标志说明
tpu
- TPU 的名称。
model_dir
- 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建。使用 Cloud TPU 时,
model_dir
必须是 Cloud Storage 路径 (gs://...
)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 Cloud TPU 和 TensorFlow 版本创建的即可。
此过程利用 fake_imagenet 数据集训练模型,让其包含 100 个训练步骤和 13 个评估步骤。 此训练在 v3-32 Cloud TPU 上大约需要 2 分钟。训练和评估完成后,系统会显示类似于以下内容的消息:
{'accuracy': 0.0009716797, 'learning_rate': 0.10256411, 'top_5_accuracy': 0.0049560545, 'training_loss': 8.5587225} train | step: 100 | steps/sec: 1.2 | output: {'accuracy': 0.0009716797, 'learning_rate': 0.10256411, 'top_5_accuracy': 0.0049560545, 'training_loss': 8.5587225} eval | step: 100 | eval time: 24.8 sec | output: {'accuracy': 0.0010141226, 'top_5_accuracy': 0.004356971, 'validation_loss': 8.50038} eval | step: 100 | eval time: 24.8 sec | output: {'accuracy': 0.0010141226, 'top_5_accuracy': 0.004356971, 'validation_loss': 8.50038}
清理
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
断开与 Compute Engine 实例的连接(如果您尚未这样做):
(vm)$ exit
您的提示符现在应为
username@projectname
,表明您位于 Cloud Shell 中。删除您的 Cloud TPU 和 Compute Engine 资源。 用于删除资源的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需了解详情,请参阅系统架构。
TPU 虚拟机
$ gcloud alpha compute tpus tpu-vm delete resnet-tutorial \ --zone=europe-west4-a
TPU 节点
$ gcloud compute tpus execution-groups delete resnet-tutorial \ --zone=europe-west4-a
通过运行
gcloud compute tpus execution-groups list
验证资源是否已删除。删除操作可能需要几分钟时间才能完成。以下命令的输出不应包含本教程中创建的任何 TPU 资源:TPU 虚拟机
$ gcloud alpha compute tpus tpu-vm list --zone=europe-west4-a
TPU 节点
$ gcloud compute tpus execution-groups list --zone=europe-west4-a
如下所示运行
gsutil
,将 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 服务。
- 遵循数据集转换教程,了解如何使用自己的数据替代 fake_imagenet 或 ImageNet 数据集来进行训练和评估。该教程介绍了如何使用图片分类数据转换器示例脚本,将用于图片分类的原始数据集转换为 Cloud TPU Tensorflow 模型可用的 TFRecord。
- 运行 Cloud TPU colab,演示如何使用您自己的图片数据运行图片分类模型。
- 浏览其他 Cloud TPU 教程。
- 学习 TensorBoard 中 TPU 监控工具的使用方法。
- 了解如何使用 Cloud TPU 和 GKE 训练 ResNet。