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


本文档演示如何使用 Cloud TPU 和 COCO 数据集运行 ShapeMask 模型。

以下说明假设您已熟悉如何在 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 项目是否已正确设置。

  1. 登录您的 Google Cloud 账号。如果您是 Google Cloud 新手,请创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. 确保您的 Google Cloud 项目已启用结算功能

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. 确保您的 Google Cloud 项目已启用结算功能

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

Cloud TPU 单设备训练

本部分介绍如何为单一设备训练设置 Cloud Storage、虚拟机和 Cloud TPU 资源。

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

  1. Cloud Shell 中,为项目 ID 创建变量。

    export PROJECT_ID=project-id
  2. 将 Google Cloud CLI 配置为使用您要创建的项目 Cloud TPU。

    gcloud config set project ${PROJECT_ID}

    当您第一次在新的 Cloud Shell 虚拟机中运行此命令时,系统会显示 Authorize Cloud Shell 页面。点击页面底部的 Authorize 以允许 gcloud 使用您的 Google Cloud 凭据进行 Google Cloud API 调用。

  3. 为 Cloud TPU 项目创建服务账号。

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

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

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

准备 COCO 数据集

本教程使用 COCO 数据集。Cloud Storage 存储桶上的数据集需要采用 TFRecord 格式以用于训练。

存储桶位置必须与虚拟机 (VM) 和 TPU 节点位于同一区域。虚拟机和 TPU 节点位于特定可用区中, 它们是某个区域内的细分

Cloud Storage 存储桶存储您用于训练模型的数据 训练结果。本教程中使用的 gcloud compute tpus tpu-vm 工具可设置 您在 Cloud TPU 和 Cloud TPU 中 上一步。如果您需要更精细的权限,请查看访问级层权限

如果您已在 Cloud Storage 存储桶中 位于您将用来执行以下操作的可用区中 训练模型时,您可以启动 TPU 资源并 准备 Cloud TPU 进行训练。否则,请按照以下步骤准备数据集。

  1. Cloud Shell 中,使用您的项目 ID 配置 gcloud

    export PROJECT_ID=project-id
    gcloud config set project ${PROJECT_ID}
  2. Cloud Shell 中,使用以下命令创建 Cloud Storage 存储桶:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central2
  3. 创建 Compute Engine 虚拟机以下载和预处理数据集。有关 请参阅 创建并启动 Compute Engine 实例

    $ gcloud compute instances create vm-name \
        --zone=us-central2-b \
        --image-family=ubuntu-2204-lts \
        --image-project=ubuntu-os-cloud \
        --machine-type=n1-standard-16 \
        --boot-disk-size=300GB
  4. 使用 SSH 连接到 Compute Engine 虚拟机:

    $ gcloud compute ssh vm-name --zone=us-central2-b

    连接到虚拟机时,Shell 提示符会从 username@projectnameusername@vm-name

  5. 设置两个变量,一个用于先前创建的存储桶,另一个用于保存存储桶中的训练数据 (DATA_DIR) 的目录。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
  6. 安装预处理数据所需的软件包。

    (vm)$ sudo apt-get update && \
      sudo apt-get install python3-pip && \
      sudo apt-get install -y python3-tk && \
      pip3 install --user Cython matplotlib opencv-python-headless pyyaml Pillow numpy absl-py tensorflow && \
      pip3 install --user "git+https://github.com/cocodataset/cocoapi#egg=pycocotools&subdirectory=PythonAPI"
  7. 运行 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 小时才能完成。

  8. 将数据复制到您的 Cloud Storage 存储桶。

    将数据转换为 TFRecord 格式后,使用 gcloud CLI 将数据从本地存储空间复制到 Cloud Storage 存储桶。您必须 还可以复制注解文件这些文件有助于验证模型的 性能

    (vm)$ gcloud storage cp ./data/dir/coco/*.tfrecord ${DATA_DIR}
    (vm)$ gcloud storage cp ./data/dir/coco/raw-data/annotations/*.json ${DATA_DIR}
  9. 与 Compute Engine 虚拟机断开连接:

    (vm)$ exit

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

  10. 删除您的 Compute Engine 虚拟机:

    $ gcloud compute instances delete vm-name \
    --zone=us-central2-b

启动 TPU 资源并训练模型

  1. 使用 gcloud 命令启动 TPU 资源。

    $ gcloud compute tpus tpu-vm create shapemask-tutorial \
      --zone=europe-west4-a \
      --accelerator-type=v3-8 \
      --version=tpu-vm-tf-2.17.0-pjrt

    命令标志说明

    zone
    拟在其中创建 Cloud TPU 的区域
    accelerator-type
    加速器类型用于指定您要创建的 Cloud TPU 的版本和大小。 如需详细了解每个 TPU 版本支持的加速器类型,请参阅 TPU 版本
    version
    Cloud TPU 软件版本

    如需详细了解 gcloud 命令,请参阅 gcloud 参考文档

  2. 使用 SSH 连接到 Compute Engine 实例。连接到网络后 您的 Shell 提示符会从 username@projectname 更改为 username@vm-name:

    gcloud compute tpus tpu-vm ssh shapemask-tutorial --zone=europe-west4-a
  3. 安装 TensorFlow 要求。

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  4. 训练脚本需要额外的软件包。立即安装:

    (vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
  5. 设置存储桶名称变量。将 bucket-name 替换为存储桶的名称:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
  6. 设置 Cloud TPU 名称变量。

    (vm)$ export TPU_NAME=local
  7. 设置 PYTHONPATH 环境变量:

    (vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}"
  8. 切换至存储模型的目录。

    (vm)$ cd /usr/share/tpu/models/official/legacy/detection
  9. 添加一些必需的环境变量:

    (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 SHAPE_PRIOR_PATH=gs://cloud-tpu-checkpoints/shapemask/kmeans_class_priors_91x20x32x32.npy
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/shapemask
  10. 创建 TPU 时,如果您将 --version 参数设置为以 -pjrt 时,请设置以下环境变量以启用 PJRT 运行时:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
  11. 训练 ShapeMask 模型:

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

    (vm)$ python3 main.py \
      --strategy_type=tpu \
      --tpu=${TPU_NAME} \
      --model_dir=${MODEL_DIR} \
      --mode=train \
      --model=shapemask \
      --params_override="{train: {total_steps: 100, learning_rate: {init_learning_rate: 0.08, learning_rate_levels: [0.008, 0.0008], learning_rate_steps: [15000, 20000], }, checkpoint: { path: ${RESNET_CHECKPOINT},prefix: resnet50}, train_file_pattern: ${TRAIN_FILE_PATTERN}}, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}}, shapemask_parser: {output_size: [640, 640]}}"

    命令标志说明

    strategy_type
    如需在 TPU 上训练 Shapemask 模型,您必须设置 将distribution_strategy更改为tpu
    tpu
    Cloud TPU 的名称。您可以使用 TPU_NAME 环境变量。
    model_dir
    在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建。 使用 Cloud TPU 时,model_dir 必须 为 Cloud Storage 路径 (gs://...)。您可以重复使用 一个现有的文件夹,用于加载当前检查点数据并存储 其他检查点,只要先前的检查点 使用相同大小的 Cloud TPU 和 TensorFlow 版本。
    mode
    将其设置为 train 以训练模型,或设置为 eval 来评估模型。
    params_override
    一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 /usr/share/models/official/legacy/detection/main.py

    训练完成后,系统将显示如下所示的消息:

    Train Step: 100/100  / loss = {'total_loss': 10.815635681152344,
    'loss': 10.815635681152344, 'retinanet_cls_loss': 1.4915691614151,
    'l2_regularization_loss': 4.483549118041992,
    'retinanet_box_loss': 0.013074751943349838,
    'shapemask_prior_loss': 0.17314358055591583,
    'shapemask_coarse_mask_loss': 1.953366756439209,
    'shapemask_fine_mask_loss': 2.216097831726074, 'model_loss': 6.332086086273193,
    'learning_rate': 0.021359999} / training metric = {'total_loss': 10.815635681152344,
    'loss': 10.815635681152344, 'retinanet_cls_loss': 1.4915691614151,
    'l2_regularization_loss': 4.483549118041992,
    'retinanet_box_loss': 0.013074751943349838,
    'shapemask_prior_loss': 0.17314358055591583,
    'shapemask_coarse_mask_loss': 1.953366756439209,
    'shapemask_fine_mask_loss': 2.216097831726074,
    'model_loss': 6.332086086273193, 'learning_rate': 0.021359999}
    
  12. 运行脚本以评估 ShapeMask 模型。此过程在 v3-8 TPU 上大约需要 10 分钟:

    (vm)$ python3 main.py \
    --strategy_type=tpu \
    --tpu=${TPU_NAME} \
    --model_dir=${MODEL_DIR} \
    --checkpoint_path=${MODEL_DIR} \
    --mode=eval_once \
    --model=shapemask \
    --params_override="{eval: { val_json_file: ${VAL_JSON_FILE}, eval_file_pattern: ${EVAL_FILE_PATTERN}, eval_samples: 5000 }, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}}, shapemask_parser: {output_size: [640, 640]}}"

    命令标志说明

    strategy_type
    如需在 TPU 上训练 Shapemask 模型,您必须设置 将distribution_strategy更改为tpu
    tpu
    Cloud TPU 的名称。您可以使用 TPU_NAME 环境变量。
    model_dir
    在模型运行期间存储检查点和摘要的目录 训练。如果指定的文件夹不存在,此程序会自行创建。使用 Cloud TPU,model_dir 必须为 Cloud Storage 路径 (gs://...)。您可以重复使用 以加载当前检查点数据和存储其他 检查点,前提是先前的检查点是使用 大小和 TensorFlow 版本相同的 Cloud TPU。
    mode
    将此值设置为 train 以训练模型,或设置为 eval 以评估模型。
    params_override
    一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 /usr/share/models/official/legacy/detection/main.py

    评估完成后,系统将显示类似如下内容的消息:

    DONE (t=5.47s).
     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 资源的步骤。

  13. 与 Compute Engine 实例断开连接:

    (vm)$ exit

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

  14. 删除 TPU 资源。

    $ gcloud compute tpus tpu-vm delete shapemask-tutorial \
        --zone=europe-west4-a

    命令标志说明

    zone
    您的 Cloud TPU 所在的地区 实际居住地

此时,您可以结束本教程并清理,也可以继续并探索在 Cloud TPU Pod 上运行模型。

使用 Cloud TPU Pod 扩缩模型

在 Cloud TPU Pod 上训练模型可能需要对训练脚本进行一些更改。如需了解相关信息,请参阅在 TPU Pod 上训练

TPU Pod 训练

  1. 打开一个 Cloud Shell 窗口。

    打开 Cloud Shell

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

    export PROJECT_ID=project-id
  3. 将 Google Cloud CLI 配置为使用您要创建的项目 Cloud TPU。

    gcloud config set project ${PROJECT_ID}

    当您第一次在新的 Cloud Shell 虚拟机中运行此命令时,系统会显示 Authorize Cloud Shell 页面。点击底部的 Authorize 以允许 gcloud 使用您的 凭据。

  4. 为 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
    

  5. 使用以下命令创建 Cloud Storage 存储桶,或使用 现有存储桶

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4
  6. 如果您之前已准备的 COCO 数据集并将其移至存储桶,则可以再次使用它来进行 Pod 训练。如果您尚未准备好 COCO 数据集,请立即准备并返回此处设置 Pod 训练。

  7. 启动 Cloud TPU Pod

    本教程指定 v3-32 Pod。如需了解其他 Pod 选项,请参阅 TPU 版本

    $ gcloud compute tpus tpu-vm create shapemask-tutorial \
      --zone=europe-west4-a \
      --accelerator-type=v3-32 \
      --version=tpu-vm-tf-2.17.0-pod-pjrt

    命令标志说明

    zone
    拟在其中创建 Cloud TPU 的区域
    accelerator-type
    加速器类型指定要创建的 Cloud TPU 的版本和大小。 如需详细了解每个 TPU 版本支持的加速器类型,请参阅 TPU 版本
    version
    Cloud TPU 软件版本
    --project
  8. 使用 SSH 连接到 Compute Engine 实例。连接到网络后 您的 Shell 提示符会从 username@projectname 更改为 username@vm-name:

    gcloud compute tpus tpu-vm ssh shapemask-tutorial --zone=europe-west4-a
  9. 安装 TensorFlow 要求。

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  10. 训练脚本需要额外的软件包。立即安装:

    (vm)$ pip3 install --user tensorflow-model-optimization>=0.1.3
  11. 设置以下环境变量,将 bucket-name 替换为 Cloud Storage 存储分区的名称:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name

    训练应用应该能够访问 Cloud Storage 中的训练数据。在训练期间,训练应用还会使用您的 Cloud Storage 存储分区来存储检查点。

  12. 更新所需的训练变量。

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/shapemask-pods
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/coco
    (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)$ export SHAPE_PRIOR_PATH=gs://cloud-tpu-checkpoints/shapemask/kmeans_class_priors_91x20x32x32.npy
  13. 设置一些所需的环境变量:

    (vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}"
    (vm)$ export TPU_LOAD_LIBRARY=0
  14. 切换至存储模型的目录。

    (vm)$ cd /usr/share/tpu/models/official/legacy/detection
  15. 启动 Pod 训练。

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

    (vm)$ python3 main.py \
     --strategy_type=tpu \
     --tpu=${TPU_NAME} \
     --model_dir=${MODEL_DIR} \
     --mode=train \
     --model=shapemask \
     --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}}, shapemask_head: {use_category_for_mask: true, shape_prior_path: ${SHAPE_PRIOR_PATH}} }"

    命令标志说明

    strategy_type
    如需在 TPU 上训练 Shapemask 模型,您必须将 distribution_strategy 设置为 tpu
    tpu
    Cloud TPU 的名称。这是使用 TPU_NAME 环境变量设置的。
    model_dir
    在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建。时间 使用 Cloud TPU 时,model_dir 必须是 Cloud Storage 路径 (gs://...)。您可以重复使用 以加载当前检查点数据和存储其他 检查点,前提是先前的检查点是使用 大小和 TensorFlow 版本相同的 Cloud TPU。
    mode
    将此值设置为 train 以训练模型,或设置为 eval 以评估模型。
    params_override
    一个 JSON 字符串,会替换默认脚本参数。如需详细了解脚本参数,请参阅 /usr/share/models/official/legacy/detection/main.py

清理

为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

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

    (vm)$ exit

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

  2. 删除您的 Cloud TPU 和 Compute Engine 资源。

    $ gcloud compute tpus tpu-vm delete shapemask-tutorial \
    --zone=europe-west4-a
  3. 通过运行 gcloud compute tpus tpu-vm list 验证资源是否已删除。删除操作可能需要几分钟时间才能完成。以下命令的输出 不应包含本教程中创建的任何 TPU 资源:

    $ gcloud compute tpus tpu-vm list --zone=europe-west4-a
  4. 如下所示运行 gcloud CLI,将 bucket-name 替换为您为本教程创建的 Cloud Storage 存储桶的名称:

    $ gcloud storage rm gs://bucket-name --recursive

后续步骤

使用其他图片大小进行训练

您可以使用更大的神经网络(例如 ResNet-101, )。较大的输入图片和更强大的神经网络将生成耗时更长但更精确的模型。

使用其他基础

或者,您也可以探索如何使用自己的数据集预训练 ResNet 模型 并将其用作 ShapeMask 模型的基础。再进行一些工作,您就可以用新的神经网络来替换 ResNet。最后,如果您有兴趣实现自己的对象检测模型,则可以基于该骨干网进行进一步的实验。