概览
本教程演示了如何使用 Cloud TPU 和 COCO 数据集运行 Mask RCNN 模型。
Mask RCNN 是一种深度神经网络,旨在解决对象检测和图像分割问题,这是一项难度较大的计算机视觉挑战。
Mask RCNN 模型会为图像中对象的每个实例生成边界框和细分掩码。该模型基于特征金字塔网络 (FPN) 和 ResNet50 骨干网络。
本教程使用 Tensorflow Keras APIs
训练模型。Keras API 是一种高级 TensorFlow API,可用于在 Cloud TPU 上构建和运行机器学习模型。此 API 可通过隐藏大部分低级实现来简化模型开发流程,从而让您更轻松地在 TPU 和其他平台(例如 GPU 或 CPU)之间切换。
以下说明假定您已熟悉如何在 Cloud TPU 上训练模型。如果您不熟悉 Cloud TPU,可以参阅快速入门,了解基本介绍。
目标
- 准备 COCO 数据集
- 创建 Cloud Storage 存储桶以保存数据集和模型输出
- 设置 TPU 资源以进行训练和评估
- 在单个 Cloud TPU 或 Cloud TPU Pod 上运行训练和评估
费用
本教程使用 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 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。
准备 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.11.0
命令标志说明
vm-only
- 仅创建虚拟机。默认情况下,
gcloud compute tpus execution-groups
命令会同时创建虚拟机和 Cloud TPU。 name
- 要创建的 Cloud TPU 的名称。
zone
- 您计划在其中创建 Cloud TPU 的可用区。
disk-size
gcloud compute tpus execution-groups
命令所创建虚拟机的硬盘大小(以 GB 为单位)。machine-type
- 要创建的 Compute Engine 虚拟机的机器类型。
tf-version
- 在虚拟机上安装的
gcloud compute tpus execution-groups
版 TensorFlow。
如果您未自动登录 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
导出 TPU 设置变量
导出项目 ID、要用于 TPU 资源的名称以及将用于训练模型和存储所有与训练有关的数据的可用区。
$ export TPU_NAME=mask-rcnn-tutorial $ export ZONE=europe-west4-a
使用
gcloud
命令启动 Compute Engine 虚拟机和 Cloud TPU。 使用的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需详细了解这两种虚拟机架构,请参阅系统架构。TPU 虚拟机
$ gcloud compute tpus tpu-vm create mask-rcnn-tutorial \ --zone=europe-west4-a \ --accelerator-type=v3-8 \ --version=tpu-vm-tf-2.11.0
命令标志说明
zone
- 您计划在其中创建 Cloud TPU 的可用区。
accelerator-type
- 要创建的 Cloud TPU 的类型。
version
- Cloud TPU 软件版本。
TPU 节点
$ gcloud compute tpus execution-groups create \ --zone=europe-west4-a \ --name=mask-rcnn-tutorial \ --accelerator-type=v3-8 \ --machine-type=n1-standard-8 \ --disk-size=300 \ --tf-version=2.11.0
如需详细了解
gcloud
命令,请参阅 gcloud 参考文档。如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-name
:TPU 虚拟机
gcloud compute tpus tpu-vm ssh mask-rcnn-tutorial --zone=europe-west4-a
TPU 节点
gcloud compute tpus execution-groups ssh mask-rcnn-tutorial --zone=europe-west4-a
安装 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
设置 Cloud TPU 名称变量。
TPU 虚拟机
(vm)$ export TPU_NAME=local
TPU 节点
(vm)$ export TPU_NAME=mask-rcnn-tutorial
设置以下环境变量,并将 bucket-name 替换为存储 COCO 数据集的 Cloud Storage 存储桶的名称:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
为数据和模型目录添加环境变量。
(vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn
添加其他一些必需的环境变量:
(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
设置
PYTHONPATH
环境变量:TPU 虚拟机
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
TPU 节点
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
切换至存储模型的目录。
TPU 虚拟机
(vm)$ cd /usr/share/tpu/models/official/vision
TPU 节点
(vm)$ cd /usr/share/models/official/legacy/detection
以下脚本运行示例训练,训练 10 个训练步骤和 10 个评估步骤。在 v3-8 TPU 上完成大约需要 6 分钟。在 v3-8 TPU 上,训练到收敛需要大约 22500 个步骤和大约 6 小时。
运行以下命令以训练 Mask-RCNN 模型:
(vm)$ python3 train.py \ --tpu=${TPU_NAME} \ --experiment=maskrcnn_resnetfpn_coco \ --mode=train_and_eval \ --config_file=configs/experiments/maskrcnn/r50fpn_640_coco_scratch_tpu4x4.yaml \ --model_dir=${MODEL_DIR} \ --params_override="task.train_data.input_path=${TRAIN_FILE_PATTERN},task.validation_data.input_path=${EVAL_FILE_PATTERN},task.annotation_file=${VAL_JSON_FILE},runtime.distribution_strategy=tpu,trainer.train_steps=10,trainer.validation_steps=10,task.train_data.global_batch_size=8,task.validation_data.global_batch_size=8"
命令标志说明
strategy_type
- 分布策略。
tpu
- TPU 的名称。
- 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建。使用 Cloud TPU 时,
model_dir
必须是 Cloud Storage 路径(“gs://...”)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 TPU 和相同 Tensorflow 版本创建的即可。
model_dir
训练完成后,系统将显示如下所示的消息:
{'frcnn_box_loss': 0.033865165, 'frcnn_cls_loss': 1.2535654, 'learning_rate': 0.008266499, 'mask_loss': 1.2039567, 'model_loss': 2.821458, 'rpn_box_loss': 0.034982488, 'rpn_score_loss': 0.2950886, 'total_loss': 4.340171, 'training_loss': 4.340171} train | step: 10 | steps/sec: 0.1 | output: {'frcnn_box_loss': 0.033865165, 'frcnn_cls_loss': 1.2535654, 'learning_rate': 0.008266499, 'mask_loss': 1.2039567, 'model_loss': 2.821458, 'rpn_box_loss': 0.034982488, 'rpn_score_loss': 0.2950886, 'total_loss': 4.340171, 'training_loss': 4.340171}
然后是评估步骤的输出。
您现已完成单设备训练和评估。请按照以下步骤删除当前的单设备 TPU 资源。
与 Compute Engine 实例断开连接:
(vm)$ exit
您的提示符现在应为
username@projectname
,表明您位于 Cloud Shell 中。删除 TPU 资源。
此时,您可以结束本教程并清理,也可以继续并探索在 Cloud TPU Pod 上运行模型。
使用 Cloud TPU Pod 扩缩模型
在 { product_name_short }} Pod 上训练模型可能需要对训练脚本进行一些更改。如需了解相关信息,请参阅在 TPU Pod 上训练。
TPU Pod 训练
打开一个 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
如果您之前已准备的 COCO 数据集并将其移至存储桶,则可以再次使用它来进行 Pod 训练。如果您尚未准备好 COCO 数据集,请立即准备并返回此处设置训练。
启动 Cloud TPU Pod
本教程指定 v3-32 Pod。如需了解其他 Pod 选项,请参阅可用的 TPU 类型页面。
TPU 虚拟机
$ gcloud compute tpus tpu-vm create mask-rcnn-tutorial \ --zone=europe-west4-a \ --accelerator-type=v3-32 \ --version=tpu-vm-tf-2.11.0-pod
命令标志说明
zone
- 您计划在其中创建 Cloud TPU 的可用区。
accelerator-type
- 要创建的 Cloud TPU 的类型。
version
- Cloud TPU 软件版本。
TPU 节点
(vm)$ gcloud compute tpus execution-groups create \ --zone=europe-west4-a \ --name=mask-rcnn-tutorial \ --accelerator-type=v3-32 \ --tf-version=2.11.0
命令标志说明
zone
- 您计划在其中创建 Cloud TPU 的可用区。
tpu-only
- 仅创建 Cloud TPU。默认情况下,
gcloud compute tpus execution-groups
命令会同时创建虚拟机和 Cloud TPU。 accelerator-type
- 要创建的 Cloud TPU 的类型。
tf-version
- 在虚拟机上安装的
gcloud
版 TensorFlow。
如果您未自动登录 Compute Engine 实例,请通过运行以下
ssh
命令进行登录。登录虚拟机后,shell 提示符会从username@projectname
更改为username@vm-name
:TPU 虚拟机
gcloud compute tpus tpu-vm ssh mask-rcnn-tutorial --zone=europe-west4-a
TPU 节点
gcloud compute ssh mask-rcnn-tutorial --zone=europe-west4-a
安装 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
训练脚本需要额外的软件包。立即安装:
(vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
设置 Cloud TPU 名称变量。
(vm)$ export TPU_NAME=mask-rcnn-tutorial
设置以下环境变量,将 bucket-name 替换为 Cloud Storage 存储桶的名称:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
添加其他一些必需的环境变量:
(vm)$ export RESNET_CHECKPOINT=gs://cloud-tpu-checkpoints/retinanet/resnet50-checkpoint-2018-02-07 (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco (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)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-pod
设置
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/official/vision
TPU 节点
(vm)$ cd /usr/share/models/official/legacy/detection
训练模型:
此过程使用 COCO 数据集对模型进行 10 个训练步骤。此训练在 v3-32 Cloud TPU 上大约需要 10 分钟。
TPU 虚拟机
(vm)$ python3 train.py \ --tpu=${TPU_NAME} \ --experiment=maskrcnn_resnetfpn_coco \ --mode=train_and_eval \ --config_file=configs/experiments/maskrcnn/r50fpn_640_coco_scratch_tpu4x4.yaml \ --model_dir=${MODEL_DIR} \ --params_override="task.train_data.input_path=${TRAIN_FILE_PATTERN},task.validation_data.input_path=${EVAL_FILE_PATTERN},task.annotation_file=${VAL_JSON_FILE},runtime.distribution_strategy=tpu,trainer.train_steps=10,trainer.validation_steps=10,task.train_data.global_batch_size=256,task.validation_data.global_batch_size=256"
命令标志说明
tpu
- TPU 的名称。
model_dir
- 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建相应文件夹。使用 Cloud TPU 时,
model_dir
必须是 Cloud Storage 路径 (gs://...
)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 Cloud TPU 和 TensorFlow 版本创建的即可。 params_override
- 一个 JSON 字符串,用于替换默认脚本参数。
TPU 节点
(vm)$ python3 main.py \ --strategy_type=tpu \ --tpu=${TPU_NAME} \ --model_dir=${MODEL_DIR} \ --mode=train \ --model=mask_rcnn \ --params_override="{train: { batch_size: 128, iterations_per_loop: 500, total_steps: 20, learning_rate: {'learning_rate_levels': [0.008, 0.0008], 'learning_rate_steps': [10000, 13000] }, 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}} }"
命令标志说明
tpu
- TPU 的名称。
model_dir
- 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建相应文件夹。使用 Cloud TPU 时,
model_dir
必须是 Cloud Storage 路径 (gs://...
)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 Cloud TPU 和 TensorFlow 版本创建的即可。 params_override
- 一个 JSON 字符串,用于替换默认脚本参数。
训练完成后,系统将显示如下所示的消息:
I0706 19:47:16.108213 139955064548416 controller.py:457] train | step: 10 | steps/sec: 0.1 | output: {'frcnn_box_loss': 0.05632668, 'frcnn_cls_loss': 1.3012192, 'learning_rate': 0.008266499, 'mask_loss': 1.2371812, 'model_loss': 2.9746659, 'rpn_box_loss': 0.08227444, 'rpn_score_loss': 0.2976642, 'total_loss': 4.493513, 'training_loss': 4.493513} train | step: 10 | steps/sec: 0.1 | output: {'frcnn_box_loss': 0.05632668, 'frcnn_cls_loss': 1.3012192, 'learning_rate': 0.008266499, 'mask_loss': 1.2371812, 'model_loss': 2.9746659, 'rpn_box_loss': 0.08227444, 'rpn_score_loss': 0.2976642, 'total_loss': 4.493513, 'training_loss': 4.493513}
清理
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
运行训练后,删除 TPU 虚拟机并移除存储桶。
断开与 Compute Engine 实例的连接(如果您尚未这样做):
(vm)$ exit
您的提示符现在应为
username@projectname
,表明您位于 Cloud Shell 中。删除您的 Cloud TPU 和 Compute Engine 资源。 用于删除资源的命令取决于您使用的是 TPU 虚拟机还是 TPU 节点。如需了解详情,请参阅系统架构。
TPU 虚拟机
$ gcloud compute tpus tpu-vm delete mask-rcnn-tutorial \ --zone=europe-west4-a
TPU 节点
$ gcloud compute tpus execution-groups delete mask-rcnn-tutorial \ --zone=europe-west4-a
通过运行
gcloud compute tpus execution-groups list
验证资源是否已删除。删除操作可能需要几分钟时间才能完成。以下命令的输出不应包含本教程中创建的任何 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 服务。