本教程介绍如何在 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
您可使用价格计算器根据您的预计使用情况来估算费用。
准备工作
本部分介绍如何设置 Cloud Storage 存储分区和 Compute Engine 虚拟机。
打开一个 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
使用您的凭据进行 GCP 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 us-central1 -b on gs://bucket-name
此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。
为了让 Cloud TPU 能够读取和写入存储分区,您项目的服务帐号需要对其拥有读写或管理员权限。如需了解如何查看和设置这些权限,请参阅有关存储分区的部分。
使用
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
此时会显示您指定的配置。输入 y 批准或输入 n 取消。
当
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
为存储分区和 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
准备数据集
下载并转换 PASCAL VOC 2012 数据集
该模型使用 PASCAL VOC 2012 数据集进行训练和评估。重新运行以下脚本来下载该数据集并将其转换为 TensorFlow 的
TFRecord
格式:(vm)$ bash /usr/share/models/research/deeplab/datasets/download_and_convert_voc2012.sh
下载预训练检查点
在此步骤中,您将下载经过修改的 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
将数据上传到 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} \
--eval_timeout=200
清理
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
与 Compute Engine 虚拟机断开连接:
(vm)$ exit
您的提示符现在应为
username@projectname
,表明您位于 Cloud Shell 中。在您的 Cloud Shell 中,使用您在设置 Cloud TPU 时所用的 --zone 标志运行
ctpu delete
,以删除 Compute Engine 虚拟机和 Cloud TPU:$ ctpu delete --project=${PROJECT_ID} \ --zone=us-central1-b \ --name=deeplab-tutorial
运行
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: --
如下所示运行
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 服务。
- 详细了解
ctpu
,包括如何在本地机器上安装。 - 使用更多 TPU 示例进行实验。
- 探索 TensorBoard 中的 TPU 工具。