使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。
本文档介绍了 RetinaNet 对象检测模型的实现。您可以在 GitHub 上找到相关代码。
以下说明假设您已熟悉如何在 Cloud TPU 上运行模型。如果您刚开始接触 Cloud TPU,可以参阅快速入门,了解基本介绍。
如果您计划在 TPU Pod 切片上训练,请参阅在 TPU Pod 上训练,以了解 Pod 切片所需的参数更改。
目标
- 准备 COCO 数据集
- 创建 Cloud Storage 存储桶以保存数据集和模型输出
- 设置 TPU 资源以进行训练和评估
- 在单个 Cloud TPU 或 Cloud TPU Pod 上运行训练和评估
费用
在本文档中,您将使用 Google Cloud 的以下收费组件:
- Compute Engine
- Cloud TPU
- Cloud Storage
您可使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用。
准备工作
在开始学习本教程之前,请检查您的 Google Cloud 项目是否已正确设置。
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
- 确保您的 Google Cloud 项目已启用结算功能。
本演示使用 Google Cloud 的收费组件。请查看 Cloud TPU 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。
准备 COCO 数据集
本教程使用 COCO 数据集。该数据集在 Cloud Storage 存储桶上需要采用 TFRecord 格式以用于训练。
如果您已在 Cloud Storage 存储桶上准备好 COCO 数据集,该存储桶位于您将用于训练模型的可用区中,则可以直接进行单设备训练。否则,请按照以下步骤准备该数据集。
打开一个 Cloud Shell 窗口。
- 在 Cloud Shell 中,使用您的项目 ID 配置
gcloud
。
export PROJECT_ID=project-id
gcloud config set project ${PROJECT_ID}
- 在 Cloud Shell 中,使用以下命令创建 Cloud Storage 存储桶:
gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 gs://bucket-name
启动 Compute Engine 虚拟机实例。
此虚拟机实例将仅用于下载和预处理 COCO 数据集。在 instance-name 中填写您选择的名称。
$ gcloud compute tpus execution-groups create \\
--vm-only \\
--name=instance-name \\
--zone=europe-west4-a \\
--disk-size=300 \\
--machine-type=n1-standard-16 \\
--tf-version=2.12.0
#### 命令标志说明
`vm-only`
仅创建虚拟机。默认情况下,`gcloud compute tpus execution-groups` 命令会同时创建虚拟机和 Cloud TPU。
`name`
要创建的 Cloud TPU 的名称。
`zone`
您计划在其中创建 Cloud TPU 的[区域](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
`disk-size`
通过 `gcloud compute tpus execution-groups` 命令创建的虚拟机的硬盘大小(以 GB 为单位)。
`machine-type`
要创建的 Compute Engine 虚拟机的[机器类型](https://cloud.google.com/compute/docs/machine-types?hl=zh-cn)。
`tf-version`
TensorFlow `gcloud compute tpus execution-groups` 的版本会安装在虚拟机上。
- 如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-name
:
$ gcloud compute ssh instance-name --zone=europe-west4-a
- 设置两个变量,一个用于先前创建的存储桶,另一个用于保存存储桶中的训练数据 (DATA_DIR) 的目录。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
- 安装预处理数据所需的软件包。
(vm)$ sudo apt-get install -y python3-tk && \
pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow && \
pip3 install --user "git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI"
- 运行
download_and_preprocess_coco.sh
脚本,将 COCO 数据集转换为训练应用所需的一组 TFRecord (*.tfrecord
)。
(vm)$ git clone https://github.com/tensorflow/tpu.git
(vm)$ sudo bash tpu/tools/datasets/download_and_preprocess_coco.sh ./data/dir/coco
这会安装所需的库,然后运行预处理脚本。它会在您的本地数据目录中输出很多 `*.tfrecord` 文件。COCO 下载和转换脚本大约需要 1 小时才能完成。
将数据复制到 Cloud Storage 存储桶
将数据转换为 TFRecord 后,使用
gsutil
命令将其从本地存储空间复制到 Cloud Storage 存储桶。您还必须复制注解文件。这些文件有助于验证模型的性能。
(vm)$ gsutil -m cp ./data/dir/coco/ \*.tfrecord ${DATA_DIR}
(vm)$ gsutil cp ./data/dir/coco/raw-data/annotations/ * .json ${DATA_DIR}
清理虚拟机资源
将 COCO 数据集转换为 TFRecord 并将其复制到 Cloud Storage 存储桶的 DATA_DIR 后,您便可以删除 Compute Engine 实例。
与 Compute Engine 实例断开连接:
(vm)$ exit
您的提示符现在应为 username@projectname
,表明您位于 Cloud Shell 中。
删除您的 Compute Engine 实例。
$ gcloud compute instances delete instance-name
--zone=europe-west4-a
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
命令会为您设置 TPU,还会为在上一步中设置的 Cloud TPU 服务账号设置默认权限。如果您需要更精细的权限,请查看访问级层权限。
设置并启动 Cloud TPU
使用
gcloud
命令启动 Compute Engine 虚拟机和 Cloud TPU。 使用的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需详细了解这两种虚拟机架构,请参阅系统架构。TPU 虚拟机
$ gcloud compute tpus tpu-vm create retinanet-tutorial \
--zone=europe-west4-a \
--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 \
--zone=europe-west4-a \
--name=retinanet-tutorial \
--accelerator-type=v3-8 \
--machine-type=n1-standard-8 \
--disk-size=300 \
--tf-version=2.12.0
命令标志说明
`zone`
您计划在其中创建 Cloud TPU 的[区域](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
`accelerator-type`
要创建的 Cloud TPU 的[类型](https://cloud.google.com/tpu/docs/supported-tpu-configurations?hl=zh-cn)。
`machine-type`
要创建的 Compute Engine 虚拟机的[机器类型](https://cloud.google.com/compute/docs/machine-types?hl=zh-cn)。
`disk-size`
Compute Engine 虚拟机的根卷大小(以 GB 为单位)。
`tf-version`
TensorFlow `gcloud` 的版本会安装在虚拟机上。
如需详细了解 `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 retinanet-tutorial --zone=europe-west4-a
TPU 节点
gcloud compute ssh retinanet-tutorial --zone=europe-west4-a
在您继续按照这些说明操作时,请在虚拟机会话窗口中运行以 (vm)$
开头的每个命令。
安装另外的软件包
RetinaNet 训练应用需要几个额外的软件包。 请立即安装:
(vm)$ sudo apt-get install -y python3-tk
(vm)$ pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow
(vm)$ pip3 install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI'
- 安装 TensorFlow 要求。
TPU 虚拟机
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
TPU 节点
(vm)$ pip3 install --user -r /usr/share/models/official/requirements.txt
- 设置 Cloud TPU 名称变量。
TPU 虚拟机
(vm)$ export TPU_NAME=local
TPU 节点
(vm)$ export TPU_NAME=retinanet-tutorial
- 为数据和模型目录添加环境变量。
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-train
- 设置
PYTHONPATH
环境变量:
TPU 虚拟机
(vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}"
TPU 节点
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
- 创建 TPU 时,如果将
--version
参数设置为以-pjrt
结尾的版本,请设置以下环境变量以启用 PJRT 运行时:
(vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
(vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
- 切换至存储模型的目录。
TPU 虚拟机
(vm)$ cd /usr/share/tpu/models/official/legacy/detection
TPU 节点
(vm)$ cd /usr/share/models/official/legacy/detection
单个 Cloud TPU 设备训练
以下训练脚本在 Cloud TPU v3-8 上运行。 您也可以在 Cloud TPU v2-8 上运行,但这将需要更长的时间。
以下示例脚本仅有 10 个训练步骤,并且在 v3-8 TPU 节点上的运行时间不超过 5 分钟。在 Cloud TPU v3-8 TPU 上,训练到收敛大约需要 22,500 个步骤和大约 1 1/2 个小时。
- 设置以下环境变量:
(vm)$ export RESNET_CHECKPOINT=gs://cloud-tpu-checkpoints/retinanet/resnet50-checkpoint-2018-02-07
(vm)$ export TRAIN_FILE_PATTERN=${DATA_DIR}/train-*
(vm)$ export EVAL_FILE_PATTERN=${DATA_DIR}/val-*
(vm)$ export VAL_JSON_FILE=${DATA_DIR}/instances_val2017.json
- 运行训练脚本:
(vm)$ python3 main.py \
--strategy_type=tpu \
--tpu=${TPU_NAME} \
--model_dir=${MODEL_DIR} \
--mode="train" \
--params_override="{ type: retinanet, train: { total_steps: 10, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 } }"
命令标志说明
`strategy_type`
如需在 TPU 上训练 RetinaNet 模型,您必须将 `distribution_strategy` 设置为 `tpu`。
`tpu`
Cloud TPU 的名称。这是使用 `TPU_NAME` 环境变量设置的。
`model_dir`
在训练期间存储检查点和摘要的 Cloud Storage 存储桶。您可以使用现有文件夹加载根据相同大小和 TensorFlow 版本的先前生成 TPU 创建的检查点。
`mode`
设置为 `train` 可训练模型,设置为 `eval` 可评估模型。
`params_override`
一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 `/usr/share/models/official/legacy/detection/main.py`。
该模型将在 v3-8 TPU 上训练 10 个步骤,大约需要 5 分钟。训练完成后,您将看到类似于以下内容的输出:
Train Step: 10/10 / loss = {
'total_loss': 2.4581615924835205,
'cls_loss': 1.4098565578460693,
'box_loss': 0.012001709081232548,
'model_loss': 2.0099422931671143,
'l2_regularization_loss': 0.44821977615356445,
'learning_rate': 0.008165999
}
/ training metric = {
'total_loss': 2.4581615924835205,
'cls_loss': 1.4098565578460693,
'box_loss': 0.012001709081232548,
'model_loss': 2.0099422931671143,
'l2_regularization_loss': 0.44821977615356445,
'learning_rate': 0.008165999
}
单个 Cloud TPU 设备评估
以下过程使用 COCO 评估数据。在 v3-8 TPU 上完成评估步骤大约需要 10 分钟。
设置以下环境变量:
(vm)$ export EVAL_SAMPLES=5000
- 运行评估脚本:
(vm)$ python3 main.py \
--strategy_type=tpu \
--tpu=${TPU_NAME} \
--model_dir=${MODEL_DIR} \
--checkpoint_path=${MODEL_DIR} \
--mode=eval_once \
--params_override="{ type: retinanet, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: ${EVAL_SAMPLES} } }"
命令标志说明
`strategy_type`
要使用的分布策略。`tpu` 或 `multi_worker_gpu`。
`tpu`
Cloud TPU 的名称。这是使用 `TPU_NAME` 环境变量设置的。
`model_dir`
在训练期间存储检查点和摘要的 Cloud Storage 存储桶。您可以使用现有文件夹加载根据相同大小和 TensorFlow 版本的先前生成 TPU 创建的检查点。
`mode`
`train`、`eval` 或 `train_and_eval` 中的一个。
`params_override`
一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 `/usr/share/models/official/legacy/detection/main.py`。
在评估结束时,您会在控制台中看到类似如下内容的信息:
Accumulating evaluation results...
DONE (t=7.66s).
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000
您现已完成单设备训练和评估。请按照以下步骤删除当前的单设备 TPU 资源。
- 与 Compute Engine 实例断开连接:
(vm)$ exit
您的提示符现在应为 username@projectname
,表明您位于 Cloud Shell 中。
- 删除 TPU 资源。
TPU 虚拟机
$ gcloud compute tpus tpu-vm delete retinanet-tutorial \
--zone=europe-west4-a
命令标志说明
`zone`
您的 Cloud TPU 所在的[可用区](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
TPU 节点
$ gcloud compute tpus execution-groups delete retinanet-tutorial \
--tpu-only \
--zone=europe-west4-a
命令标志说明
`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 上训练。
在 TPU Pod 上训练 Retinanet
打开一个 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 存储桶,或使用您之前为项目创建的存储桶。
在以下命令中,将 europe-west4 替换为您用于运行训练的区域的名称。将 bucket-name 替换为您要分配给存储桶的名称。
gsutil mb -p ${PROJECT\_ID} -c standard -l europe-west4 gs://bucket-name
此 Cloud Storage 存储桶存储您用于训练模型的数据和训练结果。本教程中使用的 gcloud
命令会为您在上一步中设置的 Cloud TPU 服务账号设置默认权限。如果您需要更精细的权限,请查看访问级层权限。
存储桶位置必须与 TPU 资源位于同一区域。
- 如果您之前已准备的 COCO 数据集并将其移至存储桶,则可以再次使用它来进行 Pod 训练。如果您尚未准备好 COCO 数据集,请立即准备并返回此处设置训练。
- 设置并启动 Cloud TPU Pod
本教程指定 v3-32 Pod。如需了解其他 Pod 选项,请参阅 TPU 版本。
TPU 虚拟机
使用 gcloud compute tpus tpu-vm
命令启动 TPU 虚拟机 Pod。本教程指定一个 v3-32 Pod。
$ gcloud compute tpus tpu-vm create retinanet-tutorial \
--zone=europe-west4-a \
--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 节点
运行 `gcloud compute tpus execution-groups` 命令,并使用 `accelerator-type` 参数指定要使用的 Pod 切片。例如,以下命令使用 v3-32 Pod 切片。
$ gcloud compute tpus execution-groups create \
--zone=europe-west4-a \
--name=retinanet-tutorial \
--accelerator-type=v3-32 \
--machine-type=n1-standard-8 \
--disk-size=300 \
--tf-version=2.12.0
命令标志说明
`zone`
您计划在其中创建 Cloud TPU 的[区域](https://cloud.google.com/tpu/docs/types-zones?hl=zh-cn)。
`name`
TPU 名称。如果未指定,则默认为您的用户名。
`accelerator-type`
要创建的 Cloud TPU 的[类型](https://cloud.google.com/tpu/docs/supported-tpu-configurations?hl=zh-cn)。
`machine-type`
要创建的 Compute Engine 虚拟机的[机器类型](https://cloud.google.com/compute/docs/machine-types?hl=zh-cn)。
`tf-version`
TensorFlow `gcloud` 的版本会安装在虚拟机上。
- 如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-name
:
TPU 虚拟机
gcloud compute tpus tpu-vm ssh retinanet-tutorial --zone=europe-west4-a
TPU 节点
gcloud compute ssh retinanet-tutorial --zone=europe-west4-a
- 设置 Cloud TPU 名称变量。
(vm)$ export TPU_NAME=retinanet-tutorial
设置 Cloud Storage 存储桶变量
设置以下环境变量,将 bucket-name 替换为 Cloud Storage 存储桶的名称:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/retinanet-train
(vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
训练应用应该能够访问 Cloud Storage 中的训练数据。在训练期间,训练应用还会使用您的 Cloud Storage 存储桶来存储检查点。
安装另外的软件包
RetinaNet 训练应用需要几个额外的软件包。 请立即安装:
(vm)$ sudo apt-get install -y python3-tk
(vm)$ pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow
(vm)$ pip3 install --user 'git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI'
安装 TensorFlow 要求。
TPU 虚拟机
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
TPU 节点
(vm)$ pip3 install --user -r /usr/share/models/official/requirements.txt
设置一些所需的环境变量:
(vm)$ export RESNET_PRETRAIN_DIR=gs://cloud-tpu-checkpoints/retinanet/resnet50-checkpoint-2018-02-07 (vm)$ export TRAIN_FILE_PATTERN=${DATA_DIR}/train-* (vm)$ export EVAL_FILE_PATTERN=${DATA_DIR}/val-* (vm)$ export VAL_JSON_FILE=${DATA_DIR}/instances_val2017.json
设置
PYTHONPATH
环境变量:
TPU 虚拟机
(vm)$ export PYTHONPATH="${PWD}/models:${PYTHONPATH}"
(vm)$ export TPU_LOAD_LIBRARY=0
TPU 节点
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
切换至存储模型的目录。
TPU 虚拟机
(vm)$ cd /usr/share/tpu/models/official/legacy/detection
TPU 节点
(vm)$ cd /usr/share/models/official/legacy/detection
训练模型
TPU 虚拟机
(vm)$ python3 main.py \
--strategy_type=tpu \
--tpu=${TPU_NAME} \
--model_dir=${MODEL_DIR} \
--mode=train \
--model=retinanet \
--params_override="{architecture: {use_bfloat16: true}, eval: {batch_size: 40, eval_file_pattern: ${EVAL_FILE_PATTERN}, val_json_file: ${VAL_JSON_FILE}}, postprocess: {pre_nms_num_boxes: 1000}, predict: {batch_size: 40}, train: {batch_size: 256, checkpoint: {path: ${RESNET_PRETRAIN_DIR}, prefix: resnet50/}, iterations_per_loop: 5000, total_steps: 5625, train_file_pattern: ${TRAIN_FILE_PATTERN}, } }"
命令标志说明
`tpu`
TPU 的名称。
`model_dir`
用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建相应文件夹。使用 Cloud TPU 时,`model_dir` 必须是 Cloud Storage 路径 (`gs://...`)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 Cloud TPU 和 TensorFlow 版本创建的即可。
`params_override`
一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 `/usr/share/tpu/models/official/legacy/detection/main.py`。
此过程基于 COCO 数据集训练模型,完成 5625 个训练步骤。此训练在 v3-32 Cloud TPU 上大约需要 20 分钟。训练完成后,系统将显示类似于以下内容的消息:
TPU 节点
以下示例训练脚本是在 Cloud TPU v2-32 Pod 上运行的。它只有 10 个训练步骤,运行时间不超过 5 分钟。在 v3-32 TPU Pod 上,训练到收敛大约需要 2109 个步骤和大约 50 分钟。
(vm)$ python3 main.py \
--strategy_type=tpu \
--tpu=${TPU_NAME} \
--model_dir=${MODEL_DIR} \
--mode="train" \
--params_override="{ type: retinanet, train: { total_steps: 10, batch_size: 256, checkpoint: { path: ${RESNET_CHECKPOINT}, prefix: resnet50/ }, train_file_pattern: ${TRAIN_FILE_PATTERN} }, eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 } }"
命令标志说明
`strategy_type`
要使用的分布策略。值为 `tpu` 或 `multi_worker_gpu`。
`tpu`
用于指定 Cloud TPU 的名称。这是使用 `TPU_NAME` 环境变量设置的。
`model_dir`
在训练期间存储检查点和摘要的 Cloud Storage 存储桶。您可以使用现有文件夹加载根据相同大小的 TPU 和 TensorFlow 版本创建的先前生成的检查点。
`mode`
`train`、`eval` 或 `train_and_eval` 中的一个。
`params_override`
一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 `/usr/share/models/official/legacy/detection/main.py`。
训练完成后,系统将显示如下所示的消息:
TPU 虚拟机
Train Step: 5625/5625 / loss = {'total_loss': 0.730501651763916,
'cls_loss': 0.3229793608188629, 'box_loss': 0.003082591574639082,
'model_loss': 0.4771089553833008, 'l2_regularization_loss': 0.2533927261829376,
'learning_rate': 0.08} / training metric = {'total_loss': 0.730501651763916,
'cls_loss': 0.3229793608188629, 'box_loss': 0.003082591574639082,
'model_loss': 0.4771089553833008, 'l2_regularization_loss': 0.2533927261829376,
'learning_rate': 0.08}
TPU 节点
Train Step: 10/10 / loss = {'total_loss': 3.5455241203308105,
'cls_loss': 1.458828330039978, 'box_loss': 0.01220895815640688,
'model_loss': 2.0692763328552246, 'l2_regularization_loss': 1.4762479066848755,
'learning_rate': 0.008165999} / training metric = {'total_loss': 3.5455241203308105,
'cls_loss': 1.458828330039978, 'box_loss': 0.01220895815640688,
'model_loss': 2.0692763328552246, 'l2_regularization_loss': 1.4762479066848755,
'learning_rate': 0.008165999}
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
- 与 Compute Engine 虚拟机断开连接:
(vm)$ exit
您的提示符现在应为 username@projectname
,表明您位于 Cloud Shell 中。
- 删除您的 Cloud TPU 和 Compute Engine 资源。 用于删除资源的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需了解详情,请参阅系统架构。
TPU 虚拟机
$ gcloud compute tpus tpu-vm delete retinanet-tutorial \
--zone=europe-west4-a
TPU 节点
$ gcloud compute tpus execution-groups delete retinanet-tutorial \
--zone=europe-west4-a
- 通过运行
gcloud compute tpus execution-groups list
验证资源是否已删除。删除操作可能需要几分钟时间才能完成。如下所示的响应表明实例已成功删除。
$ gcloud compute tpus execution-groups list --zone=europe-west4-a
Listed 0 items.
- 使用
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 推断简介。
使用其他图片大小进行训练
您可以使用更大的骨干网(例如 ResNet-101,而不是 ResNet-50)进行探索。更大的输入图像和更强大的骨干网将生成耗时更长但更精确的模型。
使用其他基础
或者,您也可以探索如何利用自己的数据集预训练 ResNet 模型,并以此为基础训练 RetinaNet 模型。再多进行一些工作,您还可以使用替代骨干网来替换掉 ResNet。最后,如果您有兴趣实现自己的对象检测模型,则可以基于该骨干网进行进一步的实验。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
文章来源:google cloud
推荐阅读
更多芯擎AI开发板干货请关注芯擎AI开发板专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。