本教程介绍如何使用 tf.distribute.TPUStrategy
在 Cloud TPU 上训练 Keras ResNet 模型。
如果您不熟悉 Cloud TPU,强烈建议您浏览框架的quickstart,了解如何创建 TPU 和 Compute Engine 虚拟机。
目标
- 创建 Cloud Storage 存储桶以保存数据集和模型输出。
- 准备与 ImageNet 数据集类似的 fake_imagenet 数据集。
- 运行训练作业。
- 验证输出结果。
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Compute Engine
- Cloud TPU
- Cloud Storage
您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用。
准备工作
重要提示:您可以将本教程与 TPU 虚拟机或 TPU 节点配置搭配使用。系统架构中介绍了这两种虚拟机架构。您使用的 gcloud 命令取决于您使用的 TPU 配置。在本教程中,每个 gcloud 命令都显示在标签式部分中。选择您要使用的 TPU 配置的标签页,网页会显示相应的 gcloud 命令。除非您知道需要使用 TPU 节点,否则我们建议您使用 TPU 虚拟机。
在开始学习本教程之前,请检查您的 Google Cloud 项目是否已正确设置。
- In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Note: If you don’t plan to keep the resources that you create in this procedure, create a project instead of selecting an existing project. After you finish these steps, you can delete the project, removing all resources associated with the project.
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
使用您的凭据进行 API 调用。
-
为 Cloud TPU 项目创建服务账号。
服务帐号允许 Cloud TPU 服务访问其他 Google Cloud 服务。
$ 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 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 compute tpus tpu-vm create resnet-tutorial \
--zone=us-central2-b \
--accelerator-type=v4-8 \
--version=tpu-vm-tf-2.16.1-pjrt
TPU节点
gcloud compute tpus execution-groups create \
--project=${PROJECT_ID} \
--zoneus-central2-b \
--name=resnet-tutorial \
--disk-size=300 \
--machine-type=n1-standard-16 \
--accelerator-type=v3-8 \
--tf-version=2.12.0
如需详细了解 gcloud
命令,请参阅 gcloud 参考文档。
注意 :首次在项目上运行 gcloud compute tpus execution-groups 时,大约需要 5 分钟来执行一些启动任务,例如 SSH 密钥传播和 API 启动。
- 如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-name
:
TPU 虚拟机
$ gcloud compute tpus tpu-vm ssh resnet-tutorial --zone=us-central2-b
TPU 节点
$ gcloud compute ssh resnet-tutorial --zone=us-central2-b
要点:从现在起,前缀 (vm) $ 表示您应在 Compute Engine 虚拟机实例上运行该命令。
在您继续按照这些说明操作时,请在虚拟机会话窗口中运行以 (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 存储桶来存储检查点。
- 创建 TPU 时,如果将
--version
参数设置为以-pjrt
结尾的版本,请设置以下环境变量以启用 PJRT 运行时:
(vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
(vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
- 安装 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/tensorflow/resnet50_keras
TPU 节点
(vm)$ cd /usr/share/models
- 设置
PYTHONPATH
环境变量:
TPU 虚拟机
(vm)$ /usr/share/tpu/tensorflow/resnet50_keras"
TPU 节点
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
- 运行训练脚本。该测试使用 fake_imagenet 数据集并训练 ResNet 完成 100 步。
TPU 虚拟机
resnet50.py --tpu=local --data=gs://cloud-tpu-test-datasets/fake_imagenet
TPU 节点
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"
这将对 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 资源。
TPU 虚拟机
gcloud compute tpus tpu-vm delete resnet-tutorial \
--zone=us-central2-b
TPU 节点
gcloud compute tpus execution-groups delete resnet-tutorial \
--zone=us-central2-b
此时,您可以结束本教程并清理,也可以继续并探索在 Cloud TPU Pod 上运行模型。
使用 Cloud TPU Pod 扩缩模型
在 Cloud TPU 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
使用您的凭据进行 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 us-central2 gs://bucket-name
此 Cloud Storage 存储桶存储您用于训练模型的数据和训练结果。本教程中使用的 gcloud
命令会为您在上一步中设置的 Cloud TPU 服务账号设置默认权限。如果您需要更精细的权限,请查看访问级层权限。
存储桶位置必须与 TPU 虚拟机位于同一区域。
- 准备数据集或使用 fake_imagenet
ImageNet 是一个图片数据库。数据库中的图片被整理为一个层次结构,该层次结构中的每个节点由成百上千个图片进行描述。
默认的 Pod 训练访问完整的 ImageNet 数据集演示版本,称为 fake_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 compute tpus tpu-vm create resnet-tutorial \
--zone=us-central2-b \
--accelerator-type=v4-32 \
--version=tpu-vm-tf-2.16.1-pod-pjrt
TPU 节点
gcloud compute tpus execution-groups create \
--zone=us-central2-b \
--name=resnet-tutorial \
--accelerator-type=v3-32 \
--tf-version=2.12.0
- 如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-instance-name
:
TPU 虚拟机
$ gcloud compute tpus tpu-vm ssh resnet-tutorial --zone=us-central2-b
TPU 节点
$ gcloud compute ssh resnet-tutorial --zone=us-central2-b
在您继续按照这些说明操作时,请在虚拟机会话窗口中运行以 (vm)$
开头的每个命令。
- 导出 Cloud TPU 设置变量:
export ZONE=us-central2-b
export STORAGE_BUCKET=gs://bucket-name
export TPU_NAME=resnet-tutorial
export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
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 虚拟机
export PYTHONPATH="PYTHONPATH=/usr/share/tpu/tensorflow/resnet50_keras"
export TPU_LOAD_LIBRARY=0
TPU 节点
export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
- 切换至存储模型的目录。
TPU 虚拟机
(vm)$ cd /usr/share/tpu/tensorflow/resnet50_keras
TPU 节点
(vm)$ cd /usr/share/models
- 训练模型。
(vm)$ resnet50.py --tpu=${TPU_NAME} --data=gs://cloud-tpu-test-datasets/fake_imagenet
此过程使用 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}
后续步骤
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 推断简介。
- 运行 Cloud TPU colab,演示如何使用您自己的图片数据训练图片分类模型。
- 浏览其他 Cloud TPU 教程。
- 学习 TensorBoard 中 TPU 监控工具的使用方法。
- 运行 ResNet 示例以验证大型模型的性能。
文章来源:google cloud
推荐阅读
更多芯擎AI开发板干货请关注芯擎AI开发板专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。