在 Cloud TPU 上训练 Mask RCNN (TF 2.x)

概览

本教程演示了如何使用 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,则可以参阅快速入门获取基本介绍。

如果您计划在 TPU Pod 切片上训练,请参阅在 TPU Pod 上训练,以了解 Pod 切片所需的参数更改。

目标

  • 创建 Cloud Storage 存储分区以保存数据集和模型输出
  • 准备 COCO 数据集
  • 设置 Compute Engine 虚拟机和 Cloud TPU 节点以进行训练和评估
  • 在单个 Cloud TPU 或 Cloud TPU Pod 上运行训练和评估

费用

本教程使用 Google Cloud 的以下收费组件:

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

请使用价格计算器根据您的预计使用情况来估算费用。 Google Cloud 新用户可能有资格申请免费试用

准备工作

在开始学习本教程之前,请检查您的 Google Cloud 项目是否已正确设置。

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册一个新帐号

  2. 在 Cloud Console 的项目选择器页面上,选择或创建 Cloud 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

  4. 本演示使用 Google Cloud 的收费组件。请查看 Cloud TPU 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。

如果您计划在 TPU Pod 切片上训练,请参阅在 TPU Pod 上训练,以了解 Pod 切片所需的参数更改。

设置资源

本部分介绍如何为此教程设置 Cloud Storage、虚拟机和 Cloud TPU 资源。

  1. 打开一个 Cloud Shell 窗口。

    打开 Cloud Shell

  2. 为项目 ID 创建一个环境变量。

    export PROJECT_ID=project-id
  3. 配置 gcloud 命令行工具,以使用要在其中创建 Cloud TPU 的项目。

    gcloud config set project ${PROJECT_ID}
    
  4. 为 Cloud TPU 项目创建服务帐号。

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    该命令将返回以下格式的 Cloud TPU 服务帐号:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. 使用以下命令创建 Cloud Storage 存储分区:

    gsutil mb -p ${PROJECT_ID} -c standard -l europe-west4 -b on gs://bucket-name
    

    此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。本教程中使用的 ctpu up 工具会为您在上一步中设置的 Cloud TPU 服务帐号设置默认权限。如果您需要更精细的权限,请查看访问级层权限

    存储分区位置必须与虚拟机 (VM) 和 TPU 节点位于同一区域。虚拟机和 TPU 节点位于特定地区,即区域内的细分。

  6. 使用 ctpu up 命令启动 Compute Engine 虚拟机。

    $ ctpu up --zone=europe-west4-a \
     --vm-only \
     --disk-size-gb=300 \
     --machine-type=n1-standard-8 \
     --name=mask-rcnn-tutorial \
     --tf-version=2.3.1
    
  7. 此时会显示您指定的配置。输入 y 批准或输入 n 取消。

  8. ctpu up 命令执行完毕后,验证 shell 提示符已从 username@projectname 更改为 username@vm-name。此变化表明您现已登录 Compute Engine 虚拟机。

    gcloud compute ssh mask-rcnn-tutorial --zone=europe-west4-a
    

    在您继续按照这些说明操作时,请在虚拟机会话窗口中运行以 (vm)$ 开头的每个命令。

安装另外的软件包

为了使用 Mask RCNN 训练应用,您需要安装另外几个软件包。请立即安装:

(vm)$ pip3 install --user -r /usr/share/models/official/requirements.txt

准备数据

  1. 为存储分区添加环境变量。将 bucket-name 替换为您的存储分区名称。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  2. 为数据目录添加环境变量。

    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    
  3. 为模型目录添加环境变量。

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn
    
  4. 运行 download_and_preprocess_coco.sh 脚本,将 COCO 数据集转换为训练应用所需的一组 TFRecord (*.tfrecord)。

    (vm)$ sudo bash /usr/share/tpu/tools/datasets/download_and_preprocess_coco.sh ./data/dir/coco
    

    这会安装所需的库,然后运行预处理脚本。它会向您的本地数据目录中输出很多 *.tfrecord 文件。

  5. 将数据复制到 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}
    

设置并开始训练 Cloud TPU

  1. 运行以下命令以创建 Cloud TPU。

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v3-8 \
      --zone=europe-west4-a \
      --name=mask-rcnn-tutorial \
      --tf-version=2.3.1
    参数 说明
    tpu-size 指定 Cloud TPU 的大小。 本教程使用一个 v3-8 TPU 进行单个设备的训练和评估。
    zone 拟在其中创建 Cloud TPU 的地区。该地区应与 Compute Engine 虚拟机所用的地区相同。例如 europe-west4-a
    tf-version 在虚拟机上安装的 TensorFlow 的版本。
  2. 此时会显示您指定的配置。输入 y 批准或输入 n 取消。

    您会看到一条消息:Operation success; not ssh-ing to Compute Engine VM due to --tpu-only flag。由于您之前已完成 SSH 密钥传播,因此可以忽略此消息。

  3. 为您的 Cloud TPU 名称添加环境变量。

    (vm)$ export TPU_NAME=mask-rcnn-tutorial
    

运行训练和评估

以下脚本在 v3-8 TPU 上运行一个示例训练,其中将仅训练 10 个步骤,完成大约需要 6 分钟。在 v3-8 TPU 上,训练到收敛需要大约 22500 个步骤和大约 6 小时。

  1. 添加一些必需的环境变量:

    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/models"
    (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
    
  2. 运行以下命令以训练 Mask-RCNN 模型:

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=${TPU_NAME} \
       --model_dir=${MODEL_DIR} \
       --mode=train \
       --model=mask_rcnn \
       --params_override="{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} }"
    
    参数 说明
    tpu 用于指定 Cloud TPU 的名称。这通过指定环境变量 (TPU_NAME) 进行设置。
    model_dir 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建相应文件夹。使用 Cloud TPU 时,model_dir 必须是 Cloud Storage 路径 (`gs://...`)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 TPU 和相同 Tensorflow 版本创建的即可。
    RESNET_CHECKPOINT 用于指定预训练的检查点。Mask-RCNN 需要预先训练的图片分类模型(如 ResNet)作为骨干网。此示例使用通过 ResNet 演示模型创建的预训练检查点。您如果愿意,可以训练自己的 ResNet 模型,并从自己的 ResNet 模型目录中指定一个检查点。
  3. 运行评估:

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=${TPU_NAME} \
       --model_dir=${MODEL_DIR} \
       --mode=eval \
       --model=mask_rcnn \
       --params_override="{eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 } }"
    
    参数 说明
    tpu 用于指定 Cloud TPU 的名称。这通过指定环境变量 (TPU_NAME) 进行设置。
    model_dir 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建相应文件夹。使用 Cloud TPU 时,model_dir 必须是 Cloud Storage 路径 (`gs://...`)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 TPU 和相同 Tensorflow 版本创建的即可。

此时,您可以结束本教程并清理 GCP 资源,也可以进一步了解如何在 Cloud TPU Pod 上运行模型。

使用 Cloud TPU Pod 扩缩模型

您可以使用 Cloud TPU Pod 扩缩模型,以便更快获得结果。完全受支持的 Mask RCNN 模型可与以下 Pod 切片配合使用:

  • v2-32
  • v3-32

使用 Cloud TPU Pod 时,首先使用 Pod 训练模型,然后使用单台 Cloud TPU 设备评估模型。

使用 Cloud TPU Pod 进行训练

如果您已经删除了 Compute Engine 实例,请按照设置资源中的步骤创建一个新实例。

以下示例训练仅运行 20 个步骤,在 v3-32 TPU 节点上完成大约需要 10 分钟。在 v3-32 TPU Pod 上,训练到收敛需要大约 11250 个步骤和大约 2 小时。

  1. 删除您为在单个 Cloud TPU 设备上训练模型而创建的 Cloud TPU 资源。

    (vm)$ ctpu delete --tpu-only --zone=europe-west4-a --name=mask-rcnn-tutorial
  2. 运行 ctpu up 命令,并使用 tpu-size 参数指定要使用的 Pod 切片。例如,以下命令使用 v3-32 Pod 切片。

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v3-32  \
      --zone=europe-west4-a \
      --name=mask-rcnn-tutorial \
      --tf-version=2.3.1 
  3. 更新 TPU_NAME 和 MODEL_DIR 环境变量。

    (vm)$ export TPU_NAME=mask-rcnn-tutorial
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mask-rcnn-pods
    
  4. 启动训练脚本。

    (vm)$ python3 /usr/share/models/official/vision/detection/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 用于指定 Cloud TPU 的名称。这通过指定环境变量 (TPU_NAME) 进行设置。
    model_dir 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建相应文件夹。使用 Cloud TPU 时,model_dir 必须是 Cloud Storage 路径 (`gs://...`)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 TPU 和相同 Tensorflow 版本创建的即可。
    RESNET_CHECKPOINT 用于指定预训练的检查点。Mask-RCNN 需要预先训练的图片分类模型(如 ResNet)作为骨干网。此示例使用通过 ResNet 演示模型创建的预训练检查点。您如果愿意,可以训练自己的 ResNet 模型,并从自己的 ResNet 模型目录中指定一个检查点。

评估模型

在此步骤中,您将使用单个 Cloud TPU 节点针对 COCO 数据集评估上述经过训练的模型。此评估大约需要 20 分钟。

  1. 删除您为在 Pod 上训练模型而创建的 Cloud TPU 资源。

    (vm)$ ctpu delete --tpu-only \
     --zone=europe-west4-a \
     --name=mask-rcnn-tutorial
  2. 启动新的 TPU 设备来运行评估。

    (vm)$ ctpu up --tpu-only \
      --tpu-size=v3-8 \
      --zone=europe-west4-a \
      --tf-version=2.3.1 \
      --name=mask-rcnn-tutorial
    
  3. 更新 TPU_NAME 环境变量。

    (vm)$ export TPU_NAME=mask-rcnn-tutorial
    
  4. 开始评估。

    (vm)$ python3 /usr/share/models/official/vision/detection/main.py \
       --strategy_type=tpu \
       --tpu=mask-rcnn-tutorial \
       --model_dir=${MODEL_DIR} \
       --mode=eval \
       --model=mask_rcnn \
       --params_override="{eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 } }"
    

清理

为避免因本教程中使用的资源导致您的 Google Cloud Platform 帐号产生费用,请执行以下操作:

清理 Compute Engine 虚拟机实例和 Cloud TPU 资源。

  1. 断开与 Compute Engine 实例的连接(如果您尚未这样做):

    (vm)$ exit
    

    您的提示符现在应为 username@projectname,表明您位于 Cloud Shell 中。

  2. 在虚拟机或 Cloud Shell 中,使用您在设置 Cloud TPU 时使用的 --name--zone 标志运行 ctpu delete,以删除 Cloud TPU:

    $ ctpu delete --name=mask-rcnn-tutorial \
      --zone=europe-west4-a
    
  3. 运行以下命令以验证 Compute Engine 虚拟机和 Cloud TPU 均已关停:

    $ ctpu status --name=mask-rcnn-tutorial --zone=europe-west4-a
    

    删除操作可能需要几分钟时间才能完成。 如下所示的响应表明不再有已分配的实例:

    2018/04/28 16:16:23 WARNING: Setting zone to "europe-west4-a"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. 如下所示运行 gsutil,将 bucket-name 替换为您为本教程创建的 Cloud Storage 存储分区的名称:

    $ gsutil rm -r gs://bucket-name
    

后续步骤

在本教程中,您已使用示例数据集训练 Mask-RCNN 模型。此训练的结果(在大多数情况下)不能用于推断。要使用模型进行推断,您可以在公开提供的数据集或您自己的数据集上训练数据。在 Cloud TPU 上训练的模型要求数据集采用 TFRecord 格式。

您可以使用数据集转换工具示例将图片分类数据集转换为 TFRecord 格式。如果您未使用图片分类模型,则必须自行将数据集转换为 TFRecord 格式。如需了解详情,请参阅 TFRecord 和 tf.Example

超参数调节

如需使用数据集提升模型的性能,您可以调节模型的超参数。您可以在 GitHub 上寻找所有 TPU 支持模型通用的超参数的相关信息。您可以在每个模型的源代码中寻找模型专用超参数的相关信息。如需详细了解超参数调节,请参阅超参数调节概览使用超参数调节服务调节超参数

推理

训练模型后,您可以使用该模型进行推断(也称为预测)。AI Platform 是一款基于云的解决方案,用于开发、训练部署机器学习模型。部署模型后,您可以使用 AI Platform Prediction 服务