AmoebaNet-D 模型是使用 Evolutionary AutoML 发现的图片分类器架构之一。该模型基于 AmoebaNet 论文中的结果:Real、E.、Aggarwal, A.、Huang, Y. 和 Le, Q.V.、2018 年,图像分类器架构搜索的正则化演变 (Regularized Evolution for Image Classifier Architecture Search),arXiv preprint arXiv:1802.01548。
该模型使用 TPUEstimator(一种高层级 TensorFlow API),这是在 Cloud TPU 上构建和运行机器学习模型的推荐方法。
此 API 可通过隐藏大部分低级实现来简化模型开发流程,从而让您更轻松地在 TPU 和其他平台(例如 GPU 或 CPU)之间切换。
目标
- 创建 Cloud Storage 存储分区以保存数据集和模型输出。
- 准备测试版 ImageNet 数据集,该数据集又称为 fake_imagenet 数据集。
- 运行训练作业。
- 验证输出结果。
费用
本教程使用 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 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。
设置资源
本部分介绍如何为教程设置 Cloud Storage 存储空间、虚拟机和 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
使用您的凭据进行 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 europe-west4 -b on gs://bucket-name
此 Cloud Storage 存储分区存储您用于训练模型的数据和训练结果。本教程中使用的
ctpu up
工具会为 Cloud TPU 服务帐号设置默认权限。如果您需要更精细的权限,请查看访问级层权限。存储分区位置必须与虚拟机 (VM) 和 TPU 节点位于同一区域。虚拟机和 TPU 节点位于特定地区,即区域内的细分。
使用
ctpu up
命令启动本教程所需的 Compute Engine 和 Cloud TPU 资源。ctpu up --project=${PROJECT_ID} \ --zone=europe-west4-a \ --vm-only \ --disk-size-gb=300 \ --machine-type=n1-standard-8 \ --tf-version=1.15.5 \ --name=amoebanet-tutorial
命令标志说明
如需详细了解 CTPU 实用程序,请参阅 CTPU 参考。
在出现提示时,按 y 创建 Cloud TPU 资源。
当 ctpu up
命令执行完毕后,验证 shell 提示符已从 username@projectname
更改为 username@vm-name
。此变化表明您现已登录 Compute Engine 虚拟机。如果您未连接到 Compute Engine 实例,则可通过运行以下命令进行连接:
gcloud compute ssh amoebanet-tutorial --zone=europe-west4-a
从现在开始,前缀 (vm)$
表示您应该在 Compute Engine 虚拟机实例上运行该命令。
准备数据
训练应用应该能够访问 Cloud Storage 中的训练数据。在训练期间,训练应用还会使用您的 Cloud Storage 存储分区来存储检查点。
使用 fake_imagenet 训练和评估 AmoebaNet-D 模型
ImageNet 是一个图片数据库。数据库中的图片被整理为一个层次结构,该层次结构中的每个节点由成百上千个图片进行描述。
本教程使用演示版的完整 ImageNet 数据集,该数据集又称为 fake_imagenet。此演示版本可用于测试教程,同时降低通常与使用完整 ImageNet 数据库运行模型相关的存储和时间要求。
此 fake_imagenet 数据集仅用于了解如何使用 Cloud TPU 并验证端到端性能。准确率数字和保存的模型并无实际意义。
如需了解如何下载和处理完整 ImageNet 数据集,请参阅下载、预处理和上传 ImageNet 数据集。
在以下步骤中,前缀 (vm)$
表示您应该在 Compute Engine 虚拟机上运行该命令:
使用 ctpu 实用程序启动 Cloud TPU 资源。
(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --name=amoebanet-tutorial \ --tf-version=1.15.5
设置以下环境变量,其中将 bucket-name 替换为 Cloud Storage 存储分区的名称:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/amoebanet (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
(vm)$ export TPU_NAME=amoebanet-tutorial
导航到该目录:
(vm)$ cd /usr/share/tpu/models/official/amoeba_net/
运行训练脚本。
(vm)$ python3 amoeba_net.py \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --num_epochs=1
参数 说明 tpu
用于指定 Cloud TPU 的名称。请注意, ctpu
会将此名称以环境变量 (TPU_NAME
) 的形式传递给 Compute Engine 虚拟机。data_dir
用于指定训练输入的 Cloud Storage 路径。在此示例中,该路径设置为 fake_imagenet 数据集。 model_dir
用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建相应文件夹。使用 Cloud TPU 时, model_dir
必须是 Cloud Storage 路径 (`gs://...`)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 TPU 和 TensorFlow 版本创建的即可。
对于单台 Cloud TPU 设备,该过程会对 AmoebaNet-D 模型训练 1 个周期,并且每隔一定步数就会进行一次评估。使用指定的标志,模型应该在 v3-8 Cloud TPU 上,在大约 30 分钟内完成训练。要训练到收敛大约需要 90 个周期,约 10 个小时。
由于训练和评估是利用 fake_imagenet 数据集完成的,因此输出结果不会反映实际输出,实际输出在利用实际数据集执行训练和评估时才会出现。
此时,您可以结束本教程并清理 GCP 资源,也可以进一步了解如何在 Cloud TPU Pod 上运行模型。
使用 Cloud TPU Pod 扩缩模型
您可以使用 Cloud TPU Pod 扩缩模型,以便更快获得结果。完全受支持的 AmoebaNet 模型可与以下 Pod 切片配合使用:
- v2-32
- v3-32
使用 Cloud TPU Pod 时,首先使用 Pod 训练模型,然后使用单台 Cloud TPU 设备评估模型。
使用 Cloud TPU Pod 进行训练
删除为在单台设备上训练模型而创建的 Cloud TPU 资源。
(vm)$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --name=amoebanet-tutorial \ --zone=europe-west4-a
运行
ctpu up
命令,并使用tpu-size
参数指定要使用的 Pod 切片。例如,以下命令使用 v2-32 Pod 切片。(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tf-version=1.15.5 \ --tpu-size=v2-32 \ --name=amoebanet-tutorial-pod \ --zone=europe-west4-a
更新
MODEL_BUCKET
目录以存储 Pod 训练数据。(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/amoebanet-tutorial-pod (vm)$ export TPU_NAME=amoebanet-tutorial-pod
使用以下标志在 Compute Engine 虚拟机上训练模型:
(vm)$ python3 amoeba_net.py \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --num_cells=6 \ --image_size=224 \ --num_epochs=1 \ --train_batch_size=4096 \ --eval_batch_size=1000 \ --lr=10.24 \ --lr_decay_value=0.88 \ --num_shards=32 \ --lr_warmup_epochs=0.35 \ --mode=train \ --iterations_per_loop=1000
参数 说明 tpu
用于指定 Cloud TPU 的名称。请注意, ctpu
会将此名称以环境变量 (TPU_NAME
) 的形式传递给 Compute Engine 虚拟机。data_dir
用于指定训练输入的 Cloud Storage 路径。在此示例中,该路径设置为 fake_imagenet 数据集。 model_dir
用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建。使用 Cloud TPU 时,“model_dir”必须是 Cloud Storage 路径 (`gs://...`)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 TPU 和相同 Tensorflow 版本创建的即可。
该过程利用 fake_imagent 数据集对 AmoebaNet-D 模型训练 1 个周期。此训练在 v2-32 Cloud TPU 上大约需要 10 分钟。它会在大约 35 个周期内训练到收敛。
评估模型
评估必须在单个 Cloud TPU 设备上运行,因此您需要删除 Pod TPU 并创建一个新的 Cloud TPU 设备。然后使用此 Cloud TPU 针对 fake_imagenet 验证数据评估上述经过训练的模型。
删除为在单台设备上训练模型而创建的 Cloud TPU 资源。
(vm)$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --name=amoebanet-tutorial-pod \ --zone=europe-west4-a
运行
ctpu up
命令,使用tpu-size
参数指定要使用的 Cloud TPU。例如,以下命令使用 v3-8 TPU 类型。(vm)$ ctpu up --project=${PROJECT_ID} \ --tpu-only \ --tf-version=1.15.5 \ --tpu-size=v3-8 \ --name=amoebanet-tutorial-eval \ --zone=europe-west4-a
更新
MODEL_BUCKET
目录以指向 Pod 训练数据。(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/amoebanet-tutorial-pod (vm)$ export TPU_NAME=amoebanet-tutorial-eval
使用以下标志运行模型评估:
(vm)$ python3 amoeba_net.py \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --num_cells=6 \ --image_size=224 \ --train_batch_size=4096 \ --eval_batch_size=1000 \ --mode=eval \ --iterations_per_loop=1000 \ --eval_timeout=150
这将生成如下所示的输出:
Evaluation results: {'loss': 6.908725, 'top_1_accuracy': 0.001, 'global_step': 10955, 'top_5_accuracy': 0.005}
由于训练和评估是利用 fake_imagenet 数据集完成的,因此输出结果不会反映实际输出,实际输出在利用实际数据集执行训练和评估时才会出现。
使用更大的 Cloud TPU Pod 切片
您还可以使用更大的 Cloud TPU Pod 切片来尝试执行模型。下表展示了这些切片的建议值。
参数 | 说明 | 128 个核心 | 256 个核心 |
---|---|---|---|
num_cells |
单元格总数 | 6 | 6 |
image_size |
假设图片高度和宽度的图片大小 | 224 | 224 |
num_epochs |
用于训练的步数 | 60 | 90 |
train_batch_size |
用于训练的全局(不是每个分片)批量大小 | 8192 | 16384 |
lr |
学习速率 | 20.48 | 40.96 |
lr_decay_value |
调整学习速率时使用的指数衰减率 | 0.91 | 0.94 |
num_shards |
分片数(TPU 核心) | 128 | 256 |
清理
为避免因本教程中使用的资源导致您的 Google Cloud 帐号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除您的 Cloud TPU:
$ ctpu delete --project=${PROJECT_ID} \ --tpu-only \ --name=amoebanet-tutorial-eval \ --zone=europe-west4-a
断开与 Compute Engine 实例的连接(如果您尚未这样做):
(vm)$ exit
您的提示符现在应为
username@projectname
,表明您位于 Cloud Shell 中。在您的 Cloud Shell 中,使用您在设置 Cloud TPU 时所用的 --zone 标志运行
ctpu delete
,以删除 Compute Engine 虚拟机和 Cloud TPU:$ ctpu delete --project=${PROJECT_ID} \ --vm-only \ --name=amoebanet-tutorial \ --zone=europe-west4-a
运行
ctpu status
以确保未分配任何实例,避免产生不必要的 TPU 使用费。删除操作可能需要几分钟时间才能完成。 如下所示的响应表明不再有已分配的实例:$ ctpu status --project=${PROJECT_ID} \ --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: --
如下所示运行
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
,包括如何在本地机器上安装。 - 探索 TensorBoard 中的 TPU 工具。