在 Cloud TPU 上运行 MNIST

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

模型说明

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

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

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

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

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

此模型包含 7 个层:

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

损失是通过 Softmax 计算的。

此版本的 MNIST 模型使用 tf.estimator(一种高级 TensorFlow API)。只有 Tensorflow 1.x 支持 tf.estimator。如果您使用的是 Tensorflow 2.x,请参阅 MNIST 教程,该教程改用 Keras API。

目标

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

费用

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

  • Compute Engine
  • Cloud TPU
  • Cloud Storage

您可使用价格计算器根据您的预计使用情况来估算费用。

Google Cloud 新用户可能有资格申请免费试用

准备工作

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

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 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}
    

    当您第一次在新的 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 europe-west4 -b on gs://bucket-name
    

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

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

  6. 使用 gcloud 命令启动为此所需的 Compute Engine 资源。

    $ gcloud compute tpus execution-groups create \
     --name=mnist-tutorial \
     --zone=europe-west4-a \
     --tf-version=1.15.5 \
     --machine-type=n1-standard-1 \
     --accelerator-type=v3-8
    

    命令标志说明

    name
    要创建的 Cloud TPU 的名称。
    zone
    拟在其中创建 Cloud TPU 的可用区
    tf-version
    gcloud 命令在您的虚拟机上安装的 Tensorflow 版本。
    machine-type
    要创建的 Compute Engine 虚拟机的机器类型
    accelerator-type
    要创建的 Cloud TPU 的类型

    如需详细了解 gcloud 命令,请参阅 gcloud 参考文档

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

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

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

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

  1. 为存储分区和模型目录创建环境变量。 将 bucket-name 替换为 Cloud Storage 存储分区的名称
    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    
    (vm)$ export TPU_NAME=mnist-tutorial
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/mnist
    (vm)$ export DATA_DIR=${STORAGE_BUCKET}/data
    (vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
    

获取数据

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

下载并转换 MNIST 数据

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

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

(vm)$ python3 /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 服务器可以访问该数据。

(vm)$ gsutil cp -r ./data ${DATA_DIR}

运行 MNIST TPU 模型

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

/usr/share/tpu/models/official/mnist/

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

在 Cloud TPU 上运行该模型

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

  1. 切换到模型目录:

      (vm)$ cd /usr/share/tpu/models/official/mnist/
    
  2. 运行 MNIST 模型:

    (vm)$ python3 mnist_tpu.py \
      --tpu=${TPU_NAME} \
      --data_dir=${DATA_DIR} \
      --model_dir=${MODEL_DIR} \
      --use_tpu=True \
      --iterations=500 \
      --train_steps=2000
     

    命令标志说明

    tpu
    Cloud TPU 的名称。如果您在设置 Compute Engine 虚拟机和 Cloud TPU 时未指定此名称,系统会默认使用您的用户名。
    data_dir
    训练输入的 Cloud Storage 路径。在此示例中,该路径设置为 fake_imagenet 数据集。
    model_dir
    在训练期间存储检查点和摘要的 Cloud Storage 存储分区。您可以使用现有文件夹加载根据相同大小和 TensorFlow 版本的先前生成 TPU 创建的检查点。
    use_tpu
    设置为 true 以在 Cloud TPU 上进行训练。
    iterations
    完成一个周期所需的批次数量。
    iterations
    完成一个周期所需的批次数量。

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

如需在非 TPU 机器上运行该模型,请省略 --tpu 并设置 --use_tpu=False

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

预期结果

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

Run stats:
{
  'accuracy_top_1': 0.9762369990348816,
  'eval_loss': 0.07863274961709976,
  'loss': 0.1111728847026825,
  'training_accuracy_top_1': 0.966645359992981
}

清理

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

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

    (vm)$ exit
    

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

  2. 删除您的 Cloud TPU 和 Compute Engine 资源。

    $ gcloud compute tpus execution-groups delete mnist-tutorial \
      --zone=europe-west4-a
    
  3. 通过运行 gcloud compute tpus execution-groups list 验证资源是否已删除。删除操作可能需要几分钟时间才能完成。如下所示的响应表明实例已成功删除。

    $ gcloud compute tpus execution-groups list \
      --zone=europe-west4-a
    
       NAME             STATUS
    
  4. 使用 gsutil 删除 Cloud Storage 存储分区,如下所示。将 bucket-name 替换为您的 Cloud Storage 存储分区的名称。

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

后续步骤

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

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

超参数调节

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

推理

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