Cloud TPU 单设备训练
本部分介绍如何使用单个 Cloud TPU 设备配置 Cloud TPU 资源和训练 EfficientNet 模型。
- 打开一个 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 调用。
如需详细了解 gcloud
命令,请参阅 gcloud 参考文档。
- 为 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
- 导出 TPU 设置变量
设置要在其中训练模型并存储任何训练相关数据的区域。
$ export ZONE=europe-west4-a
- 使用以下命令创建 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 节点位于同一区域。
- 准备数据集或使用 fake_imagenet
ImageNet 是一个图片数据库。数据库中的图片被整理为一个层次结构,该层次结构中的每个节点由成百上千个图片进行描述。
本教程使用演示版的完整 ImageNet 数据集,该数据集又称为 fake_imagenetfake_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 efficientnet-tutorial \
--zone=${ZONE} \
--accelerator-type=v3-8 \
--version=tpu-vm-tf-2.16.1-pjrt
命令标志说明
`zone`
您计划在其中创建 Cloud TPU 的[区域](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
`accelerator-type`
加速器类型指定要创建的 Cloud TPU 的版本和大小。如需详细了解每个 TPU 版本支持的加速器类型,请参阅 [TPU 版本](https://cloud.google.com/tpu/docs/system-architecture-tpu-vm?hl=zh-cn#versions)。
`version`
Cloud TPU [软件版本](https://cloud.google.com/tpu/docs/supported-tpu-versions?hl=zh-cn#tpu_software_versions)。
TPU 节点
gcloud compute tpus execution-groups create \
--name=efficientnet-tutorial \
--zone=${ZONE} \
--disk-size=300 \
--machine-type=n1-standard-16 \
--tf-version=2.12.0 \
--accelerator-type=v3-8
命令标志说明
`project`
您的 Google Cloud 项目 ID
`name`
要创建的 Cloud TPU 的名称。
`zone`
您计划在其中创建 Cloud TPU 的[区域](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
`disk-size`
通过 `gcloud` 命令创建的虚拟机的硬盘大小(以 GB 为单位)。
`machine-type`
要创建的 Compute Engine 虚拟机的 [机器类型](https://cloud.google.com/compute/docs/machine-types?hl=zh-cn)。
`tf-version`
TensorFlow `gcloud` 的版本会安装在虚拟机上。
`accelerator-type`
要创建的 Cloud TPU 的[类型](https://cloud.google.com/tpu/docs/supported-tpu-configurations?hl=zh-cn)。
如需详细了解 `gcloud` 命令,请参阅 [gcloud 参考文档](https://cloud.google.com/sdk/gcloud/reference?hl=zh-cn)。
- 如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-name
:
TPU 虚拟机
gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=${ZONE}
TPU 节点
gcloud compute ssh efficientnet-tutorial --zone=${ZONE}
设置 Cloud TPU 名称变量。
TPU 虚拟机
(vm)$ export TPU_NAME=local
TPU 节点
(vm)$ export TPU_NAME=efficientnet-tutorial
- 设置 Cloud Storage 存储桶变量
将 bucket-name 替换为您的 Cloud Storage 存储桶的名称:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-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
EfficientNet 训练脚本需要额外的软件包(仅限 TPU 虚拟机)。请立即安装:
TPU 虚拟机
(vm)$ sudo pip3 install tensorflow-addons
(vm)$ sudo pip3 install tensorflow-model-optimization>=0.1.3
设置一些所需的环境变量:
TPU 虚拟机
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
TPU 节点
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
EfficientNet 模型已预安装在您的 Compute Engine 虚拟机上。
切换至存储模型的目录。
TPU 虚拟机
(vm)$ cd /usr/share/tpu/models/official/legacy/image_classification
TPU 节点
(vm)$ cd /usr/share/models/official/legacy/image_classification
训练模型。 使用一个 false_imagenet 数据集并用一个周期训练 EfficientNet。
python3 classifier_trainer.py \
--mode=train_and_eval \
--model_type=efficientnet \
--dataset=imagenet \
--tpu=${TPU_NAME} \
--data_dir=${DATA_DIR} \
--model_dir=${MODEL_DIR} \
--config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
--params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"
命令标志说明
`mode`
`train`、`eval` 或 `train_and_eval` 中的一个。
`model_type`
模型的类型。例如 `efficientnet`。
`dataset`
数据集的名称。例如 `imagenet`。
`tpu`
运行训练或评估的 Cloud TPU 的名称。
`data_dir`
用于指定训练输入的 Cloud Storage 路径。在此示例中,该路径设置为 fake_imagenet 数据集。
`model_dir`
在模型训练期间存储检查点和总结的 Cloud Storage 路径。您可以重复使用现有的文件夹来加载之前生成的检查点和存储其他检查点,只要先前的检查点是使用相同大小的 Cloud TPU 和相同 Tensorflow 版本创建的即可。
`config_file`
包含预训练 EfficientNet 模型的 json 文件的路径。此文件包含模型架构。
`params_override`
一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 `/usr/share/models/official/legacy/detection/main.py`。
EfficientNet 1 周期的训练将在 40 分钟内在 v3-8 Cloud TPU 节点上完成。训练脚本完成后,将显示如下所示的输出:
Run stats:
{
'accuracy_top_1': 0.0010172526817768812,
'eval_loss': 7.104171276092529,
'loss': 7.113735675811768,
'training_accuracy_top_1': 0.0009773431811481714,
'step_timestamp_log': [
'BatchTimestamp<batch_index: 0,
timestamp: 1604960724.2224622>',
'BatchTimestamp<batch_index: 1251,
timestamp: 1604961281.3745298>'
],
'train_finish_time': 1604961342.6359076,
'avg_exp_per_second': 2071.493269569079
}
要训练 EfficientNet 针对 ImageNet 数据集收 ,请运行 90 个周期,如以下脚本所示。训练和评估是一起完成的。 每个周期都有 1251 个步骤,总计 112590 个训练步骤和 48 个评估步骤。
(vm)$ python3 classifier_trainer.py \\
--mode=train_and_eval \\
--model_type=efficientnet \\
--dataset=imagenet \\
--tpu=${TPU_NAME} \\
--data_dir=${DATA_DIR} \\
--model_dir=${MODEL_DIR} \\
--config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \\
--params_override="train_dataset.builder=records, validation_dataset.builder=records"
命令标志说明
`mode`
`train`、`eval` 或 `train_and_eval` 中的一个。
`model_type`
模型的类型。例如,`efficientnet` 等。
`dataset`
数据集的名称。例如 `imagenet`。
`tpu`
要运行训练或评估的 Cloud TPU 的名称。
`data_dir`
用于指定训练输入的 Cloud Storage 路径。在此示例中,该路径设置为 fake_imagenet 数据集。
`model_dir`
在模型训练期间存储检查点和总结的 Cloud Storage 路径。您可以重复使用现有的文件夹来加载之前生成的检查点和存储其他检查点,只要先前的检查点是使用相同大小的 Cloud TPU 和相同 Tensorflow 版本创建的即可。
`config_file`
包含预训练 EfficientNet 模型的 JSON 文件的路径。此文件包含模型架构。
`params_override`
一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 `/usr/share/models/official/legacy/detection/main.py`。
由于训练是利用 fake_imagenet 数据集完成的,因此输出结果不会反映实际输出,实际输出在利用实际数据集执行训练时才会出现。
您现已完成单设备培训。请按照以下步骤删除当前的单设备 TPU 资源。
与 Compute Engine 实例断开连接:
(vm)$ exit
您的提示符现在应为 username@projectname
,表明您位于 Cloud Shell 中。
删除 TPU 资源。
TPU 虚拟机
$ gcloud compute tpus tpu-vm delete efficientnet-tutorial \\
--zone=${ZONE}
命令标志说明
`zone`
您的 Cloud TPU 所在的[可用区](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
TPU 节点
$ gcloud compute tpus execution-groups delete efficientnet-tutorial \\
--tpu-only \\
--zone=${ZONE}
命令标志说明
`tpu-only`
仅删除 Cloud TPU。虚拟机仍然可用。
`zone`
包含要删除的 TPU 的[可用区](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
此时,您可以结束本教程并清理,也可以继续并探索在 Cloud TPU Pod 上运行模型。
使用 Cloud TPU Pod 扩缩模型
在 Cloud TPU Pod 上训练模型可能需要对训练脚本进行一些更改。如需了解详情,请参阅在 TPU Pod 上训练。
Cloud 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 项目创建服务账号。
服务帐号允许 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
命令会为您在上一步中设置的 Cloud TPU 服务账号设置默认权限。如果您需要更精细的权限,请查看访问级层权限。
存储桶位置必须与 TPU 虚拟机位于同一区域。
- 导出 TPU 设置变量
设置要在其中训练模型并存储任何训练相关数据的区域。
$ export ZONE=europe-west4-a
- 准备数据集或使用 fake_imagenet
ImageNet 是一个图片数据库。数据库中的图片被整理为一个层次结构,该层次结构中的每个节点由成百上千个图片进行描述。
默认的 Pod 训练访问完整的 ImageNet 数据集演示版本,称为 fake_imagenet* fake_imagenet *。此演示版本可让您测试 Pod 训练,同时减少通常用完整的 ImageNet 数据库训练模型所占用的存储空间和时间要求。
此 fake_imagenet 数据集仅用于了解如何使用 Cloud TPU 并验证端到端性能。准确率数字和保存的模型并无实际意义。
如果您要使用完整的 ImageNet 数据集,请参阅[下载、预处理和上传 ImageNet 数据集](https://cloud.google.com/tpu/docs/imagenet-setup?hl=zh-cn)。
- 使用
gcloud
命令启动 Cloud TPU 资源。
使用的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需详细了解这两种虚拟机架构,请参阅系统架构。如需详细了解 gcloud
命令,请参阅 gcloud 参考文档。本教程指定 v3-32 Pod。如需了解其他 Pod 选项,请参阅 TPU 版本。
TPU 虚拟机
$ gcloud compute tpus tpu-vm create efficientnet-tutorial \\
--zone=${ZONE} \\
--accelerator-type=v3-32 \\
--version=tpu-vm-tf-2.16.1-pod-pjrt
命令标志说明
`zone`
您计划在其中创建 Cloud TPU 的[区域](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
`accelerator-type`
加速器类型指定要创建的 Cloud TPU 的版本和大小。如需详细了解每个 TPU 版本支持的加速器类型,请参阅 [TPU 版本](https://cloud.google.com/tpu/docs/system-architecture-tpu-vm?hl=zh-cn#versions)。
`version`
Cloud TPU [软件版本](https://cloud.google.com/tpu/docs/supported-tpu-versions?hl=zh-cn#tpu_software_versions)。
TPU 节点
(vm)$ gcloud compute tpus execution-groups create --name=efficientnet-tutorial \\
--accelerator-type=v3-32 \\
--zone=${ZONE} \\
--tf-version=2.12.0
命令标志说明
`name`
要创建的 Cloud TPU 的名称。
`accelerator-type`
要创建的 Cloud TPU 的[类型](https://cloud.google.com/tpu/docs/supported-tpu-configurations?hl=zh-cn)。
`zone`
您计划在其中创建 Cloud TPU 的[区域](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
`tf-version`
TensorFlow `gcloud` 的版本会安装在虚拟机上。
`tpu-only`
仅创建 Cloud TPU。默认情况下,`gcloud` 命令会同时创建虚拟机和 Cloud TPU。
- 如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-name
:
TPU 虚拟机
$ gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=${ZONE}
TPU 节点
$ gcloud compute ssh efficientnet-tutorial --zone=${ZONE}
在您继续按照这些说明操作时,请在虚拟机会话窗口中运行以 (vm)$
开头的每个命令。
导出 TPU 设置变量:
(vm)$ export STORAGE_BUCKET=gs://bucket-name (vm)$ export TPU_NAME=efficientnet-tutorial (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x-pod 训练应用预期能够访问您在 Cloud Storage 中的训练数据。在训练期间,训练应用还会使用您的 Cloud Storage 存储桶来存储检查点。
安装 TensorFlow 要求。
TPU 虚拟机
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
TPU 节点
(vm)$ pip3 install -r /usr/share/models/official/requirements.txt
设置一些所需的环境变量:
TPU 虚拟机
(vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}"
(vm)$ export TPU_LOAD_LIBRARY=0
TPU 节点
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
EfficientNet 模型已预安装在您的 Compute Engine 虚拟机上。
切换至存储模型的目录。
TPU 虚拟机
(vm)$ cd /usr/share/tpu/models/official/legacy/image_classification/
TPU 节点
(vm)$ cd /usr/share/models/official/legacy/image_classification/
训练模型。
python3 classifier_trainer.py \
--mode=train_and_eval \
--model_type=efficientnet \
--dataset=imagenet \
--tpu=${TPU_NAME} \
--data_dir=${DATA_DIR} \
--model_dir=${MODEL_DIR} \
--config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \
--params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"
命令标志说明
`mode`
设置为 `train_and_eval` 时,此脚本会训练和评估模型。设置为 `export_only` 时,此脚本会导出已保存的模型。
`model_type`
模型的类型。例如,`efficientnet` 等。
`dataset`
数据集的名称。例如 `imagenet`。
`tpu`
使用 TPU_NAME 变量中指定的名称。
`data_dir`
用于指定训练输入的 Cloud Storage 路径。在此示例中,该路径设置为 fake_imagenet 数据集。
`model_dir`
在模型训练期间存储检查点和总结的 Cloud Storage 路径。您可以重复使用现有的文件夹来加载之前生成的检查点和存储其他检查点,只要先前的检查点是使用相同大小的 Cloud TPU 和相同 Tensorflow 版本创建的即可。
`config_file`
包含预训练 EfficientNet 模型的 json 文件的路径。此文件包含模型架构。
`params_override`
一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 `/usr/share/models/official/legacy/detection/main.py`。
该程序将基于 fake_imagenet 数据集对模型进行 1 个周期的训练(共 312 个训练步骤和 12 个评估步骤)。此训练在 v3-32 Cloud TPU 上大约需要 2 分钟。训练和评估完成后,系统将显示类似如下内容的消息:
Run stats:
{
'accuracy_top_1': 0.0009969075908884406,
'eval_loss': 7.105168342590332,
'loss': 7.114983081817627,
'training_accuracy_top_1': 0.0010031675919890404,
'step_timestamp_log': [
'BatchTimestamp<batch_index: 0,
timestamp: 1605041621.4997303>',
'BatchTimestamp<batch_index: 312,
timestamp: 1605041970.8633356>'
],
'train_finish_time': 1605042032.2274444,
'avg_exp_per_second': 3111.5120716536226
}
文章来源:google cloud
推荐阅读
更多芯擎AI开发板干货请关注芯擎AI开发板专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。