在 Compute Engine 上运行分布式 TensorFlow

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

TensorFlow 是 Google 用于机器学习的开源库,由 Google 旗下的研究部门 Google 机器智能组织的研究人员和工程师开发。TensorFlow 可在多台计算机上运行以用于分配训练工作负载。在本教程中,您将在多个 Compute Engine 虚拟机实例上运行 TensorFlow 以训练模型。您也可以改用 Cloud Machine Learning Engine,它可以管理资源分配任务,并且托管经过训练的模型。除非有特殊原因,否则我们建议您使用 Cloud ML Engine。如需了解详情,请参阅本教程使用 Cloud ML Engine 和 Cloud Datalab 的版本

下图描述了在 Compute Engine 上运行 TensorFlow 的分布式配置以及将 Cloud ML Engine 和 Cloud Datalab 结合使用以通过经过训练的模型来执行预测的架构。

图片

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

目标

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

费用

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

准备工作

  1. 登录您的 Google 帐号。

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

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

    转到“管理资源”页面

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

    了解如何启用结算功能

  4. 启用 Compute Engine 和 Cloud Machine Learning API。

    启用 API

创建模板实例

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

  1. 转至 Cloud Shell。

    打开 Cloud Shell

  2. 设置默认的 Compute Engine 地区和默认项目:

    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. 检查在 Cloud Shell 实例中运行的 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 代码来训练模型。

在 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]/

复制存储分区路径的位置,以便用于后续步骤。

发布用于预测的模型

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

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

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

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

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

您也可以配置 Cloud ML Engine,让其托管用于预测的模型。请使用以下步骤将模型发布到 Cloud ML Engine。通过托管模型,您能够使用您希望 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

该模型现在使用 Cloud ML 运行,并且可以处理预测。在下一部分中,您将使用 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 应用中,点击右上角的 +Notebook 图标创建一个新笔记本。

  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. 预测的输出是长度为 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