在 Cloud TPU 上运行 MNIST

本教程包含 MNIST 模型的简要说明、有关下载 MNIST TensorFlow TPU 代码示例的说明,以及在 Cloud TPU 上运行代码的指南。

免责声明

本教程使用第三方数据集。Google 不对此数据集的有效性或任何其他方面提供任何表示、担保或其他保证。

模型说明

MNIST 数据集包含大量 0 到 9 之间的手写数字图片,以及标识每个图片中数字的标签。

本教程将训练一个机器学习模型作为示例,以根据 MNIST 数据集对图片进行分类。经过训练之后,该模型根据从 MNIST 数据集中获取的手写图像而学到的内容,将输入图像分为 10 个类别(0 到 9)。然后,您可以向模型发送它之前未曾见过的图像,之后模型会根据其在训练期间学到的内容来识别图像中的数字。

MNIST 数据集分为以下三个部分:

  • 55000 个训练数据示例
  • 10000 个测试数据示例
  • 5000 个验证数据示例

如需详细了解该数据集,请访问 MNIST 数据库网站

此模型包含 7 个层:

  • 2 个卷积
  • 2 个池化
  • 2 个密集(全连接)
  • 1 个漏失

损失是通过 Softmax 计算的。

此版本的 MNIST 模型使用 tf.estimator(一种高级 TensorFlow API),此 API 是在 Cloud TPU 上构建和运行机器学习模型的推荐方法。

Tensorflow Estimator API 可通过隐藏大部分低级实现来简化模型开发流程,从而便于您在 TPU 和其他平台(例如 GPU 或 CPU)之间切换。

准备工作

在开始学习本教程之前,请检查您的 Google Cloud Platform 项目是否已正确设置。

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 在 GCP Console 的项目选择器页面上,选择或创建 GCP 项目。

    转到项目选择器页面

  3. 确保您的 Google Cloud Platform 项目已启用结算功能。 了解如何确认您的项目已启用结算功能

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

设置资源

本节介绍如何为教程设置 Cloud Storage 存储空间、虚拟机和 Cloud TPU 资源。

创建 Cloud Storage 存储分区

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

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

  1. 转到 GCP Console 上的 Cloud Storage 页面。

    转到 Cloud Storage 页面

  2. 创建一个新的存储分区,并指定以下选项:

    • 您选择的唯一名称。
    • 默认存储类别:Standard
    • 位置:在计划创建 TPU 节点的区域指定存储分区位置。请参阅 TPU 类型和地区,了解可以使用各种 TPU 类型的位置。

使用 ctpu 工具

本节演示如何使用 Cloud TPU 预配工具 (ctpu) 来创建和管理 Cloud TPU 项目资源。这些资源由具有相同名称的虚拟机和 Cloud TPU 资源组成。这些资源必须与您刚创建的存储分区位于同一区域/地区中。

您还可以使用 gcloud 命令或通过 Cloud Console 来设置虚拟机和 TPU 资源。请参阅创建和删除 TPU 页面,了解设置和管理 Compute Engine 虚拟机和 Cloud TPU 资源的所有方法。

运行 ctpu up 以创建资源

  1. 打开一个 Cloud Shell 窗口。

    打开 Cloud Shell

  2. 运行 gcloud config set project <Your-Project> 以使用要在其中创建 Cloud TPU 的项目。

  3. 运行 ctpu up,为 Cloud TPU 设备或 Pod 切片指定所示标志。如需了解标志选项和说明,请参阅 CTPU 参考文档

  4. 设置 Cloud TPU 设备:

    $ ctpu up 

    系统会显示以下配置消息:

    ctpu will use the following configuration:
    
    Name: [your TPU's name]
    Zone: [your project's zone]
    GCP Project: [your project's name]
    TensorFlow Version: 1.14
    VM:
     Machine Type: [your machine type]
     Disk Size: [your disk size]
     Preemptible: [true or false]
    Cloud TPU:
     Size: [your TPU size]
     Preemptible: [true or false]
    
    OK to create your Cloud TPU resources with the above configuration? [Yn]:
    

    y 创建 Cloud TPU 资源。

ctpu up 命令会创建虚拟机和 Cloud TPU 服务。

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

验证您的 Compute Engine 虚拟机

ctpu up 命令执行完毕后,验证 shell 提示符是否已从 username@project 更改为 username@tpuname。此变化表明您现已登录 Compute Engine 虚拟机。

获取数据

MNIST 数据集托管在 MNIST 数据库网站上。请按照以下说明下载数据并将其转换为所需格式,然后将转换后的数据上传到 Cloud Storage。

下载并转换 MNIST 数据

convert_to_records.py 脚本可下载数据并将其转换为示例 MNIST 模型所需的 TFRecord 格式。

使用以下命令运行此脚本并解压缩文件:

(vm)$ python /usr/share/tensorflow/tensorflow/examples/how_tos/reading_data/convert_to_records.py --directory=./data
(vm)$ gunzip ./data/*.gz

将数据上传到 Cloud Storage

将数据上传到您的 Cloud Storage 存储分区,以便 Cloud TPU 可以访问该数据。在以下命令中设置变量时,请将 YOUR-BUCKET-NAME 替换为您的 Cloud Storage 存储分区的名称:

(vm)$ export STORAGE_BUCKET=gs://YOUR-BUCKET-NAME
(vm)$ gsutil cp -r ./data ${STORAGE_BUCKET}

运行 MNIST TPU 模型

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

/usr/share/models/official/mnist/

MNIST TPU 模型的源代码可在 GitHub 上找到。您可以在 Cloud TPU 上运行该模型。此外,您还可以查看如何在本地机器上运行模型

在 Cloud TPU 上运行该模型

在以下步骤中,前缀 (vm)$ 表示您应该在 Compute Engine 虚拟机上运行该命令:

  1. 运行 MNIST 模型:

    (vm)$ python /usr/share/models/official/mnist/mnist_tpu.py \
      --tpu=$TPU_NAME \
      --data_dir=${STORAGE_BUCKET}/data \
      --model_dir=${STORAGE_BUCKET}/output \
      --use_tpu=True \
      --iterations=500 \
      --train_steps=2000
    
    • --tpu 用于指定 Cloud TPU 的名称。请注意,ctpu 会将此名称以环境变量 (TPU_NAME) 的形式传递给 Compute Engine 虚拟机。但是,如果丢失了与虚拟机的连接,您可以通过再次运行 ctpu up 重新连接。如果您通过运行 gcloud compute ssh 连接到虚拟机,系统将不会设置 TPU_NAME
    • --data_dir 用于指定训练输入的 Cloud Storage 路径。
    • --model_dir 用于指定在模型训练期间存储检查点和摘要的目录。如果指定的文件夹不存在,此程序会自行创建。使用 Cloud TPU 时,model_dir 必须是 Cloud Storage 路径 (gs://...)。您可以重复使用现有的文件夹来加载当前检查点数据和存储其他检查点。
    • --iterations 用于指定在将控制权返还给 Python 之前,在每次调用时在 TPU 上运行的训练步数。如果此数值太小(例如小于 100),可能会导致通信开销过高,对性能产生负面影响。
    • --train_steps 用于指定训练要运行的总步(批次)数。

在本地(非 TPU)机器上运行该模型

要在非 TPU 机器上运行该模型,请省略 --tpu,并设置以下标志:

--use_tpu=False

这会使计算进入 GPU(如果存在)。如果不存在 GPU,则计算会退回至 CPU。

预期结果

默认情况下,tf.estimator 模型会按以下格式报告损失值和单步用时:

    INFO:tensorflow:Calling model_fn.
    INFO:tensorflow:Create CheckpointSaverHook.
    INFO:tensorflow:Done calling model_fn.
    INFO:tensorflow:TPU job name tpu_worker
    INFO:tensorflow:Graph was finalized.
    INFO:tensorflow:Running local_init_op.
    INFO:tensorflow:Done running local_init_op.
    INFO:tensorflow:Init TPU system
    INFO:tensorflow:Start infeed thread controller
    INFO:tensorflow:Starting infeed thread controller.
    INFO:tensorflow:Start outfeed thread controller
    INFO:tensorflow:Starting outfeed thread controller.
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:Saving checkpoints for 500 into gs://ctpu-mnist-test/output/model.ckpt.
    INFO:tensorflow:loss = 0.08896458, step = 0
    INFO:tensorflow:loss = 0.08896458, step = 0
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:global_step/sec: 242.829
    INFO:tensorflow:examples/sec: 248715
    INFO:tensorflow:Enqueue next (500) batch(es) of data to infeed.
    INFO:tensorflow:Dequeue next (500) batch(es) of data from outfeed.
    INFO:tensorflow:Saving checkpoints for 2000 into gs://ctpu-mnist-test/output/model.ckpt.
    INFO:tensorflow:Stop infeed thread controller
    INFO:tensorflow:Shutting down InfeedController thread.
    INFO:tensorflow:InfeedController received shutdown signal, stopping.
    INFO:tensorflow:Infeed thread finished, shutting down.
    INFO:tensorflow:Stop output thread controller
    INFO:tensorflow:Shutting down OutfeedController thread.
    INFO:tensorflow:OutfeedController received shutdown signal, stopping.
    INFO:tensorflow:Outfeed thread finished, shutting down.
    INFO:tensorflow:Shutdown TPU system.
    INFO:tensorflow:Loss for final step: 0.044236258.

清理

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

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

    (vm)$ exit
    

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

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

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

    2018/04/28 16:16:23 WARNING: Setting zone to "us-central1-b"
    No instances currently exist.
            Compute Engine VM:     --
            Cloud TPU:             --
    
  4. 如下所示运行 gsutil,将 YOUR-BUCKET-NAME 替换为您为本教程创建的 Cloud Storage 存储分区的名称:

    $ gsutil rm -r gs://YOUR-BUCKET-NAME
    

后续步骤