在 Cloud TPU 上运行 Deeplab-v3

本教程介绍如何在 Cloud TPU 上训练 Deeplab-v3 模型。

以下说明假设您已熟悉如何在 Cloud TPU 上运行模型。如果您刚接触 Cloud TPU,则可以参阅快速入门获取基本介绍。

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

该模型是一种图片语义分割模型。图片语义分割模型专注于识别和定位单个图片中的多个对象。这种模型常用于自动驾驶、地理空间图片处理和医学成像等机器学习应用。

在本教程中,您将对 PASCAL VOC 2012 数据集运行训练模型。如需详细了解该数据集,请参阅 PASCAL 可视对象类主页

目标

  • 创建 Cloud Storage 存储分区以保存数据集和模型输出。
  • 安装所需的软件包。
  • 下载并转换 PASCAL VOC 2012 数据集。
  • 训练 Deeplab 模型。
  • 评估 Deeplab 模型。

费用

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

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

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

准备工作

本部分介绍如何设置 Cloud Storage 存储分区和 Compute Engine 虚拟机。

  1. 打开一个 Cloud Shell 窗口。

    打开 Cloud Shell

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

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

    gcloud config set project ${PROJECT_ID}
    

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

  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 us-central1 -b on gs://bucket-name
    

    此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。

    为了让 Cloud TPU 能够读取和写入存储分区,您项目的服务帐号需要对其拥有读写或管理员权限。如需了解如何查看和设置这些权限,请参阅有关存储分区的部分。

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

    $ ctpu up --project=${PROJECT_ID} \
     --zone=us-central1-b \
     --machine-type=n1-standard-8 \
     --vm-only \
     --tf-version=1.15.5 \
     --name=deeplab-tutorial
    

    命令标志说明

    project
    您的 GCP 项目 ID
    zone
    拟在其中创建 Cloud TPU 的区域
    machine-type
    要创建的 Compute Engine 虚拟机的机器类型
    vm-only
    仅创建虚拟机。默认情况下,ctpu up 命令会同时创建虚拟机和 Cloud TPU。
    tf-version
    在虚拟机上安装的 Tensorflow ctpu 的版本。
    name
    要创建的 Cloud TPU 的名称。
  7. 此时会显示您指定的配置。输入 y 批准或输入 n 取消。

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

    gcloud compute ssh deeplab-tutorial --zone=us-central1-b
    

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

安装附加软件包

对于此模型,您需要在 Compute Engine 实例上安装以下附加软件包:

  • jupyter
  • matplotlib
  • PrettyTable
  • tf_slim
  (vm)$ pip3 install --user jupyter
  (vm)$ pip3 install --user matplotlib
  (vm)$ pip3 install --user PrettyTable
  (vm)$ pip3 install --user tf_slim
  1. 为存储分区和 TPU 名称创建环境变量。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export TPU_NAME=deeplab-tutorial
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/deeplab_data
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/deeplab_model
    (vm)$ export PYTHONPATH=${PYTHONPATH}:/usr/share/models/research:/usr/share/models/research/slim
    

准备数据集

  1. 下载并转换 PASCAL VOC 2012 数据集

    该模型使用 PASCAL VOC 2012 数据集进行训练和评估。重新运行以下脚本来下载该数据集并将其转换为 TensorFlow 的 TFRecord 格式:

     (vm)$ bash /usr/share/models/research/deeplab/datasets/download_and_convert_voc2012.sh
    
  2. 下载预训练检查点

    在此步骤中,您将下载经过修改的 resnet 101 预训练检查点。首先,下载该检查点:

     (vm)$ wget http://download.tensorflow.org/models/resnet_v1_101_2018_05_04.tar.gz
    

    然后,解压缩 tar 文件的内容:

     (vm)$ tar -vxf resnet_v1_101_2018_05_04.tar.gz
    
  3. 将数据上传到 Cloud Storage 存储分区

    您现在可以将数据上传到之前创建的 Cloud Storage 存储分区中:

    (vm)$ gsutil -m cp -r pascal_voc_seg/tfrecord ${DATA_DIR}/tfrecord
    
    (vm)$ gsutil -m cp -r resnet_v1_101 ${DATA_DIR}
    

创建 Cloud TPU 资源

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

  (vm)$ ctpu up --project=${PROJECT_ID} \
  --tpu-only \
  --tf-version=1.15.5 \
  --tpu-size=v3-8 \
  --name=deeplab-tutorial

训练模型

运行训练脚本以执行 2000 个训练步骤。此过程大约需要 20 分钟。要运行到收敛,请从训练脚本命令行中移除 --train_steps=2000 标志。运行到收敛大约需要 10 个小时。

(vm)$ python3 /usr/share/tpu/models/experimental/deeplab/main.py \
--mode='train' \
--num_shards=8 \
--alsologtostderr=true \
--model_dir=${MODEL_DIR} \
--dataset_dir=${DATA_DIR}/tfrecord \
--init_checkpoint=${DATA_DIR}/resnet_v1_101/model.ckpt \
--model_variant=resnet_v1_101_beta \
--image_pyramid=1. \
--aspp_with_separable_conv=false \
--multi_grid=1 \
--multi_grid=2 \
--multi_grid=4 \
--decoder_use_separable_conv=false \
--train_split='train' \
--train_steps=2000 \
--tpu=${TPU_NAME}

在 Cloud TPU 设备上评估模型。

训练完成后便可评估模型。为此,请将 --mode 标志从 train 更改为 eval

(vm)$ python3 /usr/share/tpu/models/experimental/deeplab/main.py \
--mode='eval' \
--num_shards=8 \
--alsologtostderr=true \
--model_dir=${MODEL_DIR} \
--dataset_dir=${DATA_DIR}/tfrecord \
--init_checkpoint=${DATA_DIR}/resnet_v1_101/model.ckpt \
--model_variant=resnet_v1_101_beta \
--image_pyramid=1. \
--aspp_with_separable_conv=false \
--multi_grid=1 \
--multi_grid=2 \
--multi_grid=4 \
--decoder_use_separable_conv=false \
--train_split='train' \
--tpu=${TPU_NAME}

清理

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

  1. 与 Compute Engine 虚拟机断开连接:

    (vm)$ exit
    

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

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

    $ ctpu delete --project=${PROJECT_ID} \
      --zone=us-central1-b \
      --name=deeplab-tutorial
    
  3. 运行 ctpu status 以确保未分配任何实例,避免产生不必要的 TPU 使用费。删除操作可能需要几分钟时间才能完成。 如下所示的响应表明不再有已分配的实例:

    $ ctpu status --project=${PROJECT_ID} \
      --name=deeplab-tutorial \
      --zone=us-central1-b
    
    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. 如下所示运行 gsutil,将 bucket-name 替换为您为本教程创建的 Cloud Storage 存储分区的名称:

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

后续步骤

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

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

超参数调节

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

推理

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