在 Compute Engine 上运行分布式 TensorFlow

本教程介绍了如何在多个 Compute Engine 实例上使用 TensorFlow 的分布式配置,以利用 MNIST 数据集来训练卷积神经网络模型。MNIST 数据集支持手写数字识别,在机器学习中被广泛用作图像识别的训练集。

TensorFlow 是一个端到端的开源机器学习平台。它拥有一个全面而灵活的生态系统,其中包含各种工具、库和社区资源,可助力研究人员推动先进机器学习技术的发展,以及开发人员构建和部署采用机器学习技术的应用。TensorFlow 可在多台计算机上运行以分配训练工作负载。在本教程中,您将在多个 Compute Engine 虚拟机实例上运行 TensorFlow 来训练模型。您也可以使用 AI Platform 来管理资源分配任务,并可托管经过训练的模型。除非有特殊原因,否则我们建议您使用 AI Platform。如需了解详情,请参阅本教程的使用 AI Platform 和 Cloud Datalab 的版本

下图中所述的架构展示了如何在 Compute Engine 上运行 TensorFlow 的分布式配置,并将 AI Platform 和 Cloud Datalab 结合使用以通过经过训练的模型执行预测。

“在 Compute Engine 上运行 Tensorflow”示意图

本教程介绍了如何设置和使用此架构,并在此过程中解释了一些概念。

目标

  • 设置 Compute Engine,以创建虚拟机集群来运行 TensorFlow。
  • 了解如何在 Compute Engine 集群上运行分布式 TensorFlow 示例代码来训练模型。该示例代码使用最新的 TensorFlow 库和模式,因此您可以在设计自己的训练代码时将其用作参考。
  • 将经过训练的模型部署到 AI Platform,以创建用于预测的自定义 API,然后使用 Cloud Datalab 笔记本执行预测。

费用

假设每种资源您都要使用一整天,则根据此价格计算器,运行本教程的估计价格约为 $1.20。

准备工作

  1. 登录您的 Google 帐号。

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

  2. 选择或创建 Google Cloud Platform 项目。

    转到“管理资源”页面

  3. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

  4. 启用Compute Engine API and AI Platform Training and Prediction API API。

    启用 API

创建模板实例

本教程使用 Cloud Shell,它是 Google Cloud Platform Console 中功能齐全的 Linux shell。

  1. 转至 Cloud Shell。

    打开 Cloud Shell

  2. 设置默认 Compute Engine 地区和默认项目。将 [YOUR_PROJECT_ID] 替换为您的 Google Cloud Platform (GCP) 项目。

    gcloud config set compute/zone us-east1-c
    gcloud config set project [YOUR_PROJECT_ID]
  3. 克隆 GitHub 代码库:

    git clone https://github.com/GoogleCloudPlatform/cloudml-dist-mnist-example
    cd cloudml-dist-mnist-example
  4. 根据 Ubuntu Wily 映像创建初始虚拟机实例:

    gcloud compute instances create template-instance \
    --image-project ubuntu-os-cloud \
    --image-family ubuntu-1604-lts \
    --boot-disk-size 10GB \
    --machine-type n1-standard-1
  5. 使用 ssh 连接到该虚拟机:

    gcloud compute ssh template-instance
  6. 安装 pip

    sudo apt-get update
    sudo apt-get -y upgrade \
    && sudo apt-get install -y python-pip python-dev
  7. 安装 TensorFlow:

    sudo pip install tensorflow
    
  8. (可选)按步骤验证安装

  9. 输入 exit 以返回到 Cloud Shell。

  10. 检查在 Compute Engine 实例中运行的 TensorFlow 版本:

    sudo python -c 'import tensorflow as tf; print(tf.__version__)'
  11. 如果该版本低于 1.2.1,请使用 pip 进行升级:

    sudo pip install --upgrade tensorflow

创建 Cloud Storage 存储分区

接下来,创建 Cloud Storage 存储分区来存储您的 MNIST 文件。请按照以下步骤操作:

  1. 创建一个单区域 Cloud Storage 存储分区,以用于存放要在各工作器实例之间共享的 MNIST 数据文件:

    MNIST_BUCKET="mnist-$RANDOM"
    gsutil mb -c regional -l us-east1 gs://${MNIST_BUCKET}
  2. 使用以下脚本下载 MNIST 数据文件并将其复制到该存储分区:

    sudo ./scripts/create_records.py
    gsutil cp /tmp/data/train.tfrecords gs://${MNIST_BUCKET}/data/
    gsutil cp /tmp/data/test.tfrecords gs://${MNIST_BUCKET}/data/

创建模板映像并训练实例

要创建工作器实例、主实例和参数服务器实例,请将模板实例转换为映像,然后使用该映像创建每个新实例。

  1. 关闭 template-instance 虚拟机的自动删除功能,这样在删除虚拟机时可保留磁盘:

    gcloud compute instances set-disk-auto-delete template-instance \
    --disk template-instance --no-auto-delete
  2. 删除 template-instance

    gcloud compute instances delete template-instance
  3. 通过 template-instance 磁盘创建映像 template-image

    gcloud compute images create template-image \
    --source-disk template-instance
  4. 创建其他实例。在本教程中,创建名为 master-0worker-0worker-1ps-0 的四个实例。storage-rw 范围允许实例访问您的 Cloud Storage 存储分区。请务必使用空格分隔各实例名称,如下所示:

    gcloud compute instances create \
    master-0 worker-0 worker-1 ps-0 \
    --image template-image \
    --machine-type n1-standard-4 \
    --scopes=default,storage-rw

集群已准备好运行分布式 TensorFlow。

运行分布式 TensorFlow 代码

在本部分中,您将运行一个脚本,以指示所有虚拟机实例运行 TensorFlow 代码来训练模型。

  1. 在 Cloud Shell 中,从 cloudml-dist-mnist-example 目录运行以下命令:

    ./scripts/start-training.sh gs://${MNIST_BUCKET}

    名为 start-training.sh 的脚本会将代码推送到每个虚拟机,并发送在每台机器上启动 TensorFlow 进程所需的参数,以创建分布式集群。Cloud Shell 中的输出流显示了测试数据集的损失值和准确率值。

    终端内的准确率值

    训练完成后,该脚本会输出新生成的模型文件的位置:

    Trained model is stored in gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]/
  2. 复制存储分区路径的位置,以便用于后续步骤。

发布用于预测的模型

您已成功生成可用于预测的新模型。训练更复杂的模型需要更复杂的 TensorFlow 代码,但计算和存储资源的配置是相似的。

训练模型只是整个过程的一部分。您需要将模型嵌入应用中,或者通过身份验证为其封装 API 服务,最后使其拥有各种规模。为让模型派上用场,还需要完成大量的工程工作。

AI Platform 可以帮助您完成其中的部分工作。AI Platform 提供了一个在 Google Cloud Platform 上运行的全托管式 TensorFlow 版本。利用 AI Platform,您无需设置其他任何基础架构或安装任何软件即可获得 TensorFlow 的所有强大功能。您可以自动扩缩分布式训练以使用所需的任意数量 CPU 或 GPU,并且仅需为您使用的部分付费。

由于 AI Platform 在后台运行 TensorFlow,因此您的所有工作都是可移植的,无需固定使用专有工具。

请尝试参照将分布式 TensorFlow 与 Cloud Datalab 结合使用教程,通过 AI Platform 使用同样的示例代码来训练您的模型。

您还可以将模型部署到 AI Platform 以进行预测。请按照如下步骤将模型部署到 AI Platform。通过部署模型,您可以使用 Google 托管式服务应具备的所有安全性和可靠性特性,大规模地快速测试并应用您的模型。

以下步骤使用之前由 start-training.sh 脚本输出的模型存储分区路径。

  1. 找出生成的模型的 Cloud Storage 存储分区输出路径。该路径采用以下格式,其中 [JOB_ID] 是作业 ID。您将会在下一步中用到此路径:

    MODEL_BUCKET: gs://${MNIST_BUCKET}/job_[TIMESTAMP]/export/Servo/[JOB_ID]
  2. 使用 gcloud 命令行工具定义模型的新 v1 版本,并将其指向存储分区中的模型文件。以下命令可能需要几分钟才能完成。请将 [YOUR_BUCKET_PATH] 替换为上一步中找到的输出路径。该路径以 gs:// 开头。

    MODEL="MNIST"
    MODEL_BUCKET=[YOUR_BUCKET_PATH]
    gcloud ml-engine models create ${MODEL} --regions us-east1
    gcloud ml-engine versions create \
     --origin=${MODEL_BUCKET} --model=${MODEL} v1
  3. 将模型的默认版本设置为 v1

    gcloud ml-engine versions set-default --model=${MODEL} v1

该模型现在使用 AI Platform 运行,并且可以处理预测。在下一部分中,您将使用 Cloud Datalab 作出预测并直观呈现预测结果。

使用 Cloud Datalab 执行预测

如要测试您的预测结果,请创建一个 Cloud Datalab 实例,以使用交互式 Jupyter 笔记本来执行代码。

  1. 在 Cloud Shell 中,输入以下命令以创建 Cloud Datalab 实例:

    datalab create mnist-datalab
    
  2. 在 Cloud Shell 中,点击 Cloud Shell 网页预览(右上角的方形图标),以启动 Cloud Datalab 笔记本列表页面。

  3. 依次选择更改端口端口 8081 以在浏览器中启动新的标签页。

  4. 在 Cloud Datalab 应用中,点击右上角的 +笔记本以创建新的笔记本。

  5. 将以下文本粘贴到新笔记本的第一个单元中:

    %%bash
    wget https://raw.githubusercontent.com/GoogleCloudPlatform/cloudml-dist-mnist-example/master/notebooks/Online%20prediction%20example.ipynb
    cat Online\ prediction\ example.ipynb > Untitled\ Notebook.ipynb
  6. 点击页面顶部的运行以下载 Online prediction example.ipynb 笔记本。脚本会将远程笔记本的内容复制到当前笔记本中。

  7. 重新加载浏览器页面以加载新的笔记本内容。然后选择包含 JavaScript 代码的第一个单元,并点击运行以执行此单元。

  8. 向下滚动页面,直到看到数字绘图面板,然后用光标绘制一个数字:

    使用光标绘制的数字 3。

  9. 点击下一个单元格以激活它,然后点击顶部运行按钮旁边的向下箭头,并选择从此单元格运行

    预测的输出是长度为 10 的数组,其中每个索引 (0-9) 都包含与其对应的数字。数字越接近 1,索引与您输入的数字匹配的可能性越高。您可以看到列表中突出显示的 3 号槽非常接近 1,因此与该数字匹配的概率很高。

    PROBABILITIES
    [4.181503356903704e-07,
    7.12400151314796e-07,
    0.00017898145597428083,
    0.9955494403839111,
    5.323939553103507e-11,
    0.004269002005457878,
    7.927398321116996e-11,
    1.2688398953741853e-07,
    1.0825967819982907e-06,
    2.2037748692582682e-07]

笔记本中的最后一个单元格显示了一个条形图,您可以清楚的看到它预测了您的数字(在本例中为 3)。

显示选中数字 3 的条形图。

清理

为避免因本教程中使用的资源而导致系统向您的 Google Cloud Platform 帐号收取费用,请执行以下操作:

  1. 删除模型版本:

    gcloud ml-engine versions delete v1 --model=MNIST
  2. 删除模型:

    gcloud ml-engine models delete MNIST
  3. 删除 Cloud Storage 存储分区:

    gsutil rm -r gs://${MNIST_BUCKET}
  4. 删除您的虚拟机(包括 Cloud Datalab):

    gcloud compute instances delete master-0 worker-0 worker-1 ps-0 mnist-datalab
  5. 删除您的虚拟机模板映像:

    gcloud compute images delete template-image
  6. 删除您的 Cloud Datalab 永久性磁盘:

    gcloud compute disks delete mnist-datalab-pd --zone us-east1-c

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Solutions