如何在 Cloud AI Platform 上部署 TensorFlow 2 模型

2020 年 4 月 29 日 TensorFlow

文 / Sara Robinson,开发技术推广工程师

Google Cloud AI Platform 近期新增了对部署 TensorFlow 2 模型的支持。这样,您能够以扩展的方式为最终用户提供预测结果,无需亲自管理基础架构。

  • 近期新增
    https://cloud.google.com/ai-platform/docs/release-notes#March_09_2020


在本文中,我将为您介绍将两种不同类型的 TF2 模型部署到 AI Platform 的流程,以及如何使用 AI Platform Prediction API 生成预测结果。同时,我将针对图像分类器和结构化数据各提供一个示例。首先,我们将代码添加到现有 TensorFlow 教程中,然后在 AI Platform 上完成模型部署。

  • AI Platform
    https://cloud.google.com/ai-platform

  • 教程
    https://tensorflow.google.cn/tutorials


除了基于云的部署选项以外,TensorFlow 还加入用于部署模型的开源工具,如可在自有基础架构上运行的 TensorFlow Serving。现在,我们将重点介绍如何使用托管式服务。

  • TensorFlow Serving
    https://tensorflow.google.cn/tfx/guide/serving


AI Platform 同时支持自适应模式和手动调节模式。自适应规模意味着当没有人调用您的模型接口时,您的模型基础架构将缩放为 0,这样您就不必为此付费。如果使用量增加,AI Platform 将自动增加资源以满足需求。手动调节使您可自行指定希望始终保持运行的节点数量,从而降低模型上的冷启动延迟。


接下来将重点介绍部署和预测流程。AI Platform 提供各种可用于自定义模型开发的工具,其中有用于训练和托管笔记本的基础架构。我们在本文中提到的 AI Platform 特指 AI Platform Prediction,用于部署和提供自定义 ML 模型的服务。在本文中,我们将在 TensorFlow 文档的现有教程基础上,添加代码以将模型部署到 Google Cloud 并获取预测结果。

  • AI Platform Prediction
    https://cloud.google.com/ai-platform/prediction/docs/overview

  • 现有教程
    https://tensorflow.google.cn/tutorials/keras/classification


为部署模型,您需要一个已激活计费功能的 Google Cloud 项目(也可以使用 Google Cloud Platform Free Tier)。如果您没有此类项目,您可依照此处的说明进行创建。创建好项目后,启用 AI Platform API。

  • Google Cloud Platform Free Tier
    https://cloud.google.com/free/

  • 启用
    https://console.cloud.google.com/flows/enableapi?apiid=ml.googleapis.com,compute_component&_ga=2.151299519.784334601.1584974202-413280468.1556849151



将 TF2 图像模型部署到 AI Platform

为向您展示如何在 AI Platform 上部署 TensorFlow 2 模型,我将使用 TF 文档的本教程中训练的模型。此教程在 Fashion MNIST 数据集上训练一个模型,该模型将服装文章的图像分类为 10 个不同的类别。首先运行整个笔记本。您可以点击页面顶部的“Run in Google Colab”(在 Google Colab 中运行)按钮开始。请为您的进度保存一个副本。

  • 本教程
    https://tensorflow.google.cn/tutorials/keras/classification

  • Fashion MNIST 数据集
    https://github.com/zalandoresearch/fashion-mnist


我们将使用在此笔记本末尾创建的probability_model,因其输出的分类采用了可读性更高的格式。probability_model 的输出是一个 10 元素的 softmax 数组,带有给定图像属于每个类别的概率。由于这是一个 softmax 数组,因此所有元素的总和为 1。置信度最高的分类结果即为该服装项所对应的索引有最高值。



为连接至您的 Cloud 项目,接下来您需要对 Colab notebook 进行身份验证。在您为 Fashion MNIST 教程打开的笔记本中,创建一个代码单元:

from google.colab import auth
auth.authenticate_user()


然后运行以下代码,将“your-project-id-here”替换为您创建的 Cloud 项目的 ID:

CLOUD_PROJECT = 'your-project-id-here'
BUCKET = 'gs://' + CLOUD_PROJECT + '-tf2-models'


在接下来的几段代码中,我们将使用 gcloud(即 Google Cloud CLI)和 gsutil(用于与 Google Cloud Storage 进行交互的 CLI)。运行以下代码行,以使用您创建的项目配置 gcloud:

!gcloud config set project $CLOUD_PROJECT


接着,我们将创建一个 Cloud Storage 存储分区并输出 GCS 存储分区网址。此步骤用于存储您已保存的模型。您只需要运行一次此代码单元:

!gsutil mb $BUCKET
print(BUCKET)


Cloud AI Platform 要求模型采用 TensorFlow 2 SavedModel 格式。若要将这种格式的模型导出到我们刚刚创建的存储分区中,我们可以运行以下命令。model.save()方法接受 GCS 存储分区网址。我们将模型资产保存到 fashion-mnist 子目录中:

probability_model.save(BUCKET + '/fashion-mnist', save_format='tf')


若要验证此模型是否已正确导出到您的存储分区,请导航至 Cloud Console 中您的存储分区(具体步骤:访问存储空间 -> 浏览器)。您应该会看到如下所示的内容:

  • Cloud Console
    https://console.cloud.google.com/


至此,我们已准备就绪,可以将模型部署到 AI Platform。在 AI Platform 中,模型资源中含有不同版本的模型。项目中的模型名称必须唯一。首先创建一个模型:

MODEL = 'fashion_mnist'
!gcloud ai-platform models create $MODEL --regions=us-central1


开始运行后,您应该能在 AI Platform Cloud Console 的“模型”部分中看到已创建的模型:

  • "模型”部分
    https://console.cloud.google.com/ai-platform/models


模型此时尚未建立版本,因此我们通过将 AI Platform 指向我们上传到 Google Cloud Storage 的 SavedModel 资产来创建一个版本。AI Platform 中的模型可以有多个版本。版本控制可确保您在发布新版本时不会对依赖模型特定版本的用户造成破坏。根据您的具体用例,您还可以为部分用户提供不同的模型版本,如进行实验等。


Cloud Console 界面、gcloud 或 AI Platform API 都可以用于创建版本。我们先通过 gcloud 部署第一个模型版本。首先,在部署命令中保存一些我们将引用的变量:

VERSION = 'v1'
MODEL_DIR = BUCKET + '/fashion-mnist'
最后,运行这一 gcloud 命令以部署模型:
!gcloud ai-platform versions create $VERSION \
--model $MODEL \
--origin $MODEL_DIR \
--runtime-version=2.1 \
--framework='tensorflow' \
--python-version=3.7


此命令完成运行可能需耗时一分钟。模型版本准备就绪后,您应该能在 Cloud Console 中看到以下内容:



在已部署的图像分类模型上获取预测

接下来是令人期待的部分,通过我们已部署的模型获取预测结果!您可以使用 gcloud、AI Platform API,也可直接在界面中执行此操作。在这里,我们使用 API。我们将使用 AI Platform 文档中的预测方法:

import googleapiclient.discovery

def predict_json(project, model, instances, version=None):

service = googleapiclient.discovery.build('ml', 'v1')
name = 'projects/{}/models/{}'.format(project, model)

if version is not None:
name += '/versions/{}'.format(version)

response = service.projects().predict(
name=name,
body={'instances': instances}
).execute()

if 'error' in response:
raise RuntimeError(response['error'])

return response['predictions']

 

首先,发送两张测试图像到模型,以进行预测。为此,我们将测试集内的这些图像转换为列表(因此成为有效的 JSON),然后将转换后的列表与项目和模型一并发送到我们上文定义的方法中:

test_predictions = predict_json(CLOUD_PROJECT, MODEL, test_images[:2].tolist())


在响应中,您应该能看到一个以 softmax 为键和 10 元素 softmax 概率列表为键值的 JSON 对象。通过运行以下命令,我们将获得第一张测试图像的预测分类:

np.argmax(test_predictions[0]['softmax'])

 

我们的模型对此图像的预测分类为 9,置信度为 98%。如果我们看一下笔记本的开头部分,就会发现 9 与踝靴对应。接着,我们绘制图像,以验证模型的预测结果是否正确。看起来不错!

plt.figure()
plt.imshow(test_images[0])
plt.colorbar()
plt.grid(False)
plt.show()



用结构化数据部署 TensorFlow 2 模型

您已经了解如何部署图像模型,接下来,我们将介绍另一种常见的模型类型 — 在结构化数据上训练的模型。使用与上文相同的方法,我们把 TensorFlow 文档中的本教程作为起点,并以此为基础进行部署和预测。这是一个二进制分类模型,用以预测患者是否患有心脏病。

  • 本教程
    https://tensorflow.google.cn/tutorials/structured_data/feature_columns


首先,在 Colab 中创建此教程的副本并运行所有代码单元。请注意,该模型将 Keras 特征列作为输入,并具有两种不同类型的特征:数值和分类。通过输出 feature_columns 的值,您将看到这一点。这是我们的模型需要的输入格式,在完成部署之后这一格式会派上用场。除了将特征作为张量发送外,我们还可以将其作为列表发送到我们的部署模型中。请注意,此模型同时具有数值和分类特征。其中一个分类特征 (thal) 应该作为字符串传入;其余则作为整数或浮点。


按照与上文相同的流程,导出模型并将其保存到 hd-prediction 子目录中的同一 Cloud Storage 存储分区中:

model.save(BUCKET + '/hd-prediction', save_format='tf')

 

确认模型资产已上传到您的存储分区。由于我们在上一章节已介绍如何使用 gcloud 部署模型,因此,在此处我们将使用 Cloud Console。首先,在 Cloud Console 中,从 AI Platform 的“模型”部分中选择 “New Model”(新建模型):


然后按照以下步骤进行操作(您可以通过下方的 GIF 观看步骤演示,并在下方文本中阅读相关信息)。


前往 Cloud Console 的模型部分。然后,选中“New model”(新建模型)按钮,为模型命名(比如,hd_prediction),然后选择“Create”(创建)。

  • 模型部分
    https://console.cloud.google.com/ai-platform/models


创建好模型资源后,选择“New version”(新建版本)、给版本命名(比如 v1),然后选择最新的 Python 版本(编写此文时最新版本为 3.7)。在框架下,选择框架版本 2.1 和 ML 运行时版本 2.1TensorFlow。在“模型网址”中,输入您之前用于上传 TF SavedModel 的 Cloud Storage 网址。如果遵循上述步骤,此网址应为 BUCKET + '/hd-prediction'。然后选择“Save”(保存),在模型完成部署后,您会在控制台中的版本名称旁边看到一个绿色的对勾符号。


为设置数据格式以进行预测,我们将每个测试实例作为 JSON 对象发送,其中键是特征名称,键值是带有每个特征值的列表。我们使用以下代码来设置测试集中前两个示例的格式,从而进行预测:

# First remove the label column
test = test.pop('target')

caip_instances = []
test_vals = test[:2].values

for i in test_vals:
example_dict = {k: [v] for k,v in zip(test.columns, i)}
caip_instances.append(example_dict)
caip_instances 生成的数组如下所示:
[{'age': [60],
'ca': [2],
'chol': [293],
'cp': [4],
'exang': [0],
'fbs': [0],
'oldpeak': [1.2],
'restecg': [2],
'sex': [1],
'slope': [2],
'thal': ['reversible'],
'thalach': [170],
'trestbps': [140]},
...]


此时,我们可以调用上文定义的相同 predict_json 方法,并将其传递给新模型和测试实例:

test_predictions = predict_json(CLOUD_PROJECT, 'hd_prediction', caip_instances)


收到的响应与以下内容类似(具体数字会有差异):

[{'output_1': [-1.4717596769332886]}, {'output_1': [-0.2714746594429016]}]


请注意,如果您想要更改输出张量的名称(当前为 output_1),可在上方教程中定义 Keras 模型时添加一个 name 参数:

layers.Dense(1, name='prediction_probability')


除使用 API 进行预测以外,您还可以使用 gcloud 发出预测请求。截止目前,我们发出的所有预测请求都已使用在线预测,但 AI Platform 还支持针对大型离线作业的批量预测。若要创建批量预测作业,您可以使用测试实例创建 JSON 文件,然后使用 gcloud 启动该作业。请点击此处阅读更多关于批量预测的内容。

  • 此处
    https://cloud.google.com/ai-platform/prediction/docs/batch-predict



未来计划

现在,您已经了解如何将两种类型的 TensorFlow 2 模型部署到 Cloud AI Platform 进行可扩展预测。我们在此处部署的模型均使用自适应模式,即模型可收缩至 0,因此您只需在使用模型时付费。请注意,AI Platform 也支持手动调节模式,使您能够指定希望始终处于运行状态的节点数量。


如果您希望进一步了解我们本文所介绍的部署方法,请查阅以下资源:

  • TensorFlow 结构化数据教程
    https://tensorflow.google.cn/tutorials/structured_data/feature_columns

  • AI Platform Prediction:模型部署指南
    https://cloud.google.com/ai-platform/prediction/docs/deploying-models

  • AI Platform Prediction:在线预测指南
    https://cloud.google.com/ai-platform/prediction/docs/online-predict

  • Cloud SDK
    https://cloud.google.com/sdk



如您有任何反馈意见,或者未来希望看到任何主题介绍,请联系我们并持续关注我们的文章。



了解更多教程,请点击 “阅读原文” 访问官网。

登录查看更多
0

相关内容

FashionMNIST 是一个替代 MNIST 手写数字集的图像数据集。 它是由 Zalando(一家德国的时尚科技公司)旗下的研究部门提供。其涵盖了来自 10 种类别的共 7 万个不同商品的正面图片。FashionMNIST 的大小、格式和训练集/测试集划分与原始的 MNIST 完全一致。60000/10000 的训练测试数据划分,28x28 的灰度图片。你可以直接用它来测试你的机器学习和深度学习算法性能,且不需要改动任何的代码。
【ACL2020-Google】逆向工程配置的神经文本生成模型
专知会员服务
16+阅读 · 2020年4月20日
【Google】利用AUTOML实现加速感知神经网络设计
专知会员服务
29+阅读 · 2020年3月5日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
TensorFlow Lite指南实战《TensorFlow Lite A primer》,附48页PPT
专知会员服务
69+阅读 · 2020年1月17日
【干货】谷歌Joshua Gordon 《TensorFlow 2.0讲解》,63页PPT
专知会员服务
27+阅读 · 2019年11月2日
TensorFlow 2.0 学习资源汇总
专知会员服务
66+阅读 · 2019年10月9日
社区分享|如何让模型在生产环境上推理得更快
利用 AutoML 的功能构建和部署 TensorFlow.js 模型
TensorFlow
6+阅读 · 2019年12月16日
免费!Google Colab现已支持英伟达T4 GPU
新智元
5+阅读 · 2019年4月25日
如何用TF Serving部署TensorFlow模型
AI研习社
26+阅读 · 2019年3月27日
TensorFlow 2.0如何在Colab中使用TensorBoard
专知
17+阅读 · 2019年3月15日
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
教程帖:深度学习模型的部署
论智
8+阅读 · 2018年1月20日
AliCoCo: Alibaba E-commerce Cognitive Concept Net
Arxiv
13+阅读 · 2020年3月30日
A Survey of Deep Learning for Scientific Discovery
Arxiv
29+阅读 · 2020年3月26日
Arxiv
3+阅读 · 2019年3月1日
VIP会员
相关资讯
社区分享|如何让模型在生产环境上推理得更快
利用 AutoML 的功能构建和部署 TensorFlow.js 模型
TensorFlow
6+阅读 · 2019年12月16日
免费!Google Colab现已支持英伟达T4 GPU
新智元
5+阅读 · 2019年4月25日
如何用TF Serving部署TensorFlow模型
AI研习社
26+阅读 · 2019年3月27日
TensorFlow 2.0如何在Colab中使用TensorBoard
专知
17+阅读 · 2019年3月15日
TF Boys必看!一文搞懂TensorFlow 2.0新架构!
引力空间站
18+阅读 · 2019年1月16日
教程帖:深度学习模型的部署
论智
8+阅读 · 2018年1月20日
Top
微信扫码咨询专知VIP会员