在 Cloud TPU 上训练 MnasNet

本教程介绍如何使用 Cloud TPU 设备或 Cloud TPU Pod 切片(多台 TPU 设备)来训练 Tensorflow MnasNet 模型。您可以将同一模式应用于使用 TensorFlow 和 ImageNet 数据集的其他针对 TPU 进行了优化的图片分类模型。

模型说明

本教程中的模型基于《MnasNet:用于移动设备的平台感知型神经网络架构搜索》(MnasNet: Platform-Aware Neural Architecture Search for Mobile),其中首次介绍了 AutoML 移动设备神经网络 (MnasNet) 架构。本教程使用领先的变体 mnasnet-a1,演示如何使用 TPUEstimator 来训练模型。

在 Pod 切片上训练时的特殊注意事项(v2-32/v3-32 及更高版本)

如果您计划在 TPU Pod 切片上训练,请务必阅读此文档,其中介绍了在 Pod 切片上训练时的特殊注意事项。

目标

  • 创建 Cloud Storage 存储分区以保存数据集和模型输出。
  • 运行训练作业。
  • 验证输出结果。

费用

本教程使用 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 价格页面估算您的费用。请务必在使用完您创建的资源以后清理这些资源,以免产生不必要的费用。

设置资源

本部分介绍如何为教程设置 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 Storage 存储分区。将 bucket-name 替换为存储分区的名称。

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

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

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

  5. 使用 ctpu up 命令启动此教程所需的 Compute Engine 资源。

    ctpu up --zone=europe-west4-a \
    --vm-only \
    --disk-size-gb=300 \
    --machine-type=n1-standard-8 \
    --tf-version=1.15.3 \
    --name=mnasnet-tutorial
    

    如需详细了解 CTPU 实用程序,请参阅 CTPU 参考

  6. 在出现提示时,按 y 创建 Cloud TPU 资源。

    ctpu up 命令执行完毕后,验证 shell 提示符已从 username@projectname 更改为 username@vm-name。此变化表明您现已登录 Compute Engine 虚拟机。如果您未连接到 Compute Engine 实例,则可通过运行以下命令进行连接:

    gcloud compute ssh mnasnet-tutorial --zone=europe-west4-a
    

    从现在开始,前缀 (vm)$ 表示您应该在 Compute Engine 虚拟机实例上运行该命令。

  7. 为存储分区创建环境变量。将 bucket-name 替换为您的 Cloud Storage 存储分区的名称。

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
  8. 为模型目录创建环境变量。

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mnasnet
    
  9. 使用以下命令将顶级 /models 文件夹添加到 Python 路径:

    (vm)$ export PYTHONPATH=${PYTHONPATH}:/usr/share/tpu/models:/usr/share/tpu/models/official/efficientnet
    

找到数据

ImageNet 是一个图片数据库。数据库中的图片被整理为一个层次结构,该层次结构中的每个节点包含成百上千个图片。

本教程使用演示版的完整 ImageNet 数据集,该数据集又称为 fake_imagenet。此演示版本可用于测试教程,同时降低通常与使用完整 ImageNet 数据库运行模型相关的存储和时间要求。

此 fake_imagenet 数据集位于 Cloud Storage 上的以下位置:

gs://cloud-tpu-test-datasets/fake_imagenet

  1. 为数据目录创建环境变量。

    (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
    

此 fake_imagenet 数据集仅用于了解如何使用 Cloud TPU 并验证端到端性能。准确率数字和保存的模型并无实际意义。

如需了解如何下载和处理完整 ImageNet 数据集,请参阅下载、预处理和上传 ImageNet 数据集

使用 false_imagenet 训练 MnasNet 模型

Mnasnet TPU 模型已预安装到您的 Compute Engine 虚拟机上以下目录中:

/usr/share/tpu/models/official/mnasnet/

  1. 使用 ctpu 实用程序启动 Cloud TPU 资源,并设置一些稍后要使用的环境变量。

    (vm)$ ctpu up --tpu-only 
    --tf-version=1.15.3
    --name=mnasnet-tutorial

    (vm)$ export TPU_NAME=mnasnet-tutorial
    
  2. 导航到模型目录。

    (vm)$ cd /usr/share/tpu/models/official/mnasnet/
    

  3. 运行训练脚本。

    (vm)$ python3 mnasnet_main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --model_name="mnasnet-a1" \
      --skip_host_call=true \
      --train_steps=109474 \
      --train_batch_size=4096
    • --tpu 用于指定 Cloud TPU 的名称。请注意,ctpu 会将此名称以环境变量 (TPU_NAME) 的形式传递给 Compute Engine 虚拟机。
    • --data_dir 用于指定训练输入的 Cloud Storage 路径。
    • --model_dir 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建。使用 Cloud TPU 时,model_dir 必须是 Cloud Storage 路径 (gs://...)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 TPU 和 Tensorflow 版本创建的即可。

      对于单台 Cloud TPU 设备,该过程会对 MnasNet 模型(mnasnet-a1 变体)训练 350 个周期,并且每隔一定步数就会进行一次评估。使用指定的标志,该模型应该在大约 23 小时内完成训练。使用真实的 ImageNet 数据,这些设置将重现领先的研究结果,而用户应能够调整训练速度。

使用 Cloud TPU Pod 扩缩模型

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

  • v2-32
  • v2-128
  • v2-256
  • v2-512
  • v3-32
  • v3-128
  • v3-256
  • v3-512
  • v3-1024
  • v3-2048

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

使用 Cloud TPU Pod 进行训练

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

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

      (vm)$ ctpu up --tpu-only --tpu-size=v2-32 --tf-version=1.15.3 --name=Cloud TPU
    
  3. 更新 TPU_NAME 环境变量。

    (vm)$ export TPU_NAME=Cloud TPU
    
  4. 更新 MODEL_DIR 目录以存储训练数据。

    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/Cloud TPU
    
  5. 通过运行以下脚本来训练模型。

    该脚本利用 fake_imagnet 数据集对模型训练 35 个周期。此训练在 v3-128 Cloud TPU 上大约需要 90 分钟。

    (vm)$ python3 mnasnet_main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --model_name="mnasnet-a1" \
      --skip_host_call=true \
      --train_steps=109474 \
      --train_batch_size=4096
    
    • --tpu 用于指定 Cloud TPU 的名称。请注意,ctpu 会将此名称以环境变量 (TPU_NAME) 的形式传递给 Compute Engine 虚拟机。
    • --data_dir 用于指定训练输入的 Cloud Storage 路径。
    • --model_dir 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建。使用 Cloud TPU 时,model_dir 必须是 Cloud Storage 路径 (gs://...)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点,只要先前的检查点是使用相同大小的 TPU 和 Tensorflow 版本创建的即可。

    该过程利用 fake_imagent 数据集对 MnasNet 模型(mnasnet-a1 变体)训练 350 个周期。该过程应该在大约 5 小时内完成。

评估模型

在这组步骤中,您将使用 Cloud TPU 针对 fake_imagenet 验证数据评估上述经过训练的模型。

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

    (vm)$ ctpu delete --tpu-only --name=${TPU_NAME}
  2. 启动 v2-8 Cloud TPU。 使用与 Compute Engine 虚拟机名称相同的名称,它应该仍在运行。

    (vm)$ ctpu up --tpu-only --tf-version=1.15.3 --name=mnasnet-eval
    
  3. 为 TPU 名称创建环境变量。

    (vm)$ export TPU_NAME=mnasnet-eval
    
  4. 为加速器类型创建环境变量。

    (vm)$ export ACCELERATOR_TYPE=v3-8
    
  5. 运行模型评估。这一次,添加 mode 标志并将其设置为 eval

    (vm)$ python3 mnasnet_main.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --mode=eval \
      --config_file=configs/cloud/${ACCELERATOR_TYPE}.yaml
    

    这将生成如下所示的输出:

       Eval results: {'loss': 7.532023,
       'top_1_accuracy': 0.0010172526,
       'global_step': 100,
       'top_5_accuracy': 0.005065918}.
       Elapsed seconds: 88
    

清理

为避免系统因本主题中使用的资源向您的 GCP 帐号收取费用,请执行以下操作:

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

    (vm)$ exit
    

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

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

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

    $ ctpu status --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
    

后续步骤

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

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

超参数调节

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

推理

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