如何在 Cloud AI Platform 上部署 TensorFlow 2 模型
2020 年 4 月 10 日
作者:Sara Robinson,开发者倡导者

Google Cloud 的 AI Platform 最近添加了 对部署 TensorFlow 2 模型的支持。这使您能够以可扩展的方式向最终用户提供预测,而无需管理自己的基础设施。在这篇文章中,我将引导您完成将两种不同类型的 TF2 模型部署到 AI Platform 的过程,并使用它们通过 AI Platform Prediction API 生成预测。我将提供一个针对图像分类器的示例,以及另一个针对结构化数据的示例。我们将从在现有的 TensorFlow 教程 中添加代码开始,并最终将模型部署到 AI Platform 上。
除了基于云的部署选项之外,TensorFlow 还包括用于部署模型的开源工具,例如 TensorFlow Serving,您可以在自己的基础设施上运行它。在这里,我们将重点关注使用托管服务。

AI Platform 支持自动扩展和手动扩展选项。自动扩展意味着当没有人调用您的模型端点时,您的模型基础设施将缩放到零,这样您在模型未被使用时不会被收费。如果使用量增加,AI Platform 会自动添加资源以满足需求。手动扩展使您可以指定要始终保持运行的节点数,这可以减少模型的冷启动延迟。

这里的重点将放在部署和预测流程上。AI Platform 包含用于自定义模型开发的各种工具,包括用于训练和托管笔记本的基础设施。当我们在本文中提到 AI Platform 时,我们特指 AI Platform Prediction,这是一个用于部署和提供自定义机器学习模型的服务。在这篇文章中,我们将通过在 现有教程 (TensorFlow 文档中)中添加代码来构建,以将您的模型部署到 Google Cloud 并获取预测。

为了部署您的模型,您需要一个启用了结算功能的 Google Cloud 项目(您也可以使用 Google Cloud Platform 免费层)。如果您还没有项目,请按照 此处的 指示创建一个项目。创建项目后,启用 AI Platform API。

将 TF2 图像模型部署到 AI Platform


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

我们将使用在此笔记本末尾创建的 probability_model,因为它以更易于人类理解的格式输出分类。probability_model 的输出是一个 10 元素的 softmax 数组,其中包含给定图像属于每个类别的概率。由于它是 softmax 数组,所有元素加起来为 1。置信度最高的分类将是与具有最高值的索引相对应的服装项目。

为了连接到您的 Cloud 项目,您接下来需要对您的 Colab 笔记本进行身份验证。在您为 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 存储桶 URL。这将用于存储您的保存模型。您只需要运行此单元格一次
!gsutil mb $BUCKET
print(BUCKET)
Cloud AI Platform 期望我们的模型采用 TensorFlow 2 SavedModel 格式。为了将我们的模型以这种格式导出到我们刚刚创建的存储桶,我们可以运行以下命令。model.save() 方法接受 GCS 存储桶 URL。我们将保存我们的模型资产到 fashion-mnist 子目录中
probability_model.save(BUCKET + '/fashion-mnist', save_format='tf')
为了验证这是否已正确导出到您的存储桶,请在 Cloud Console 中导航到您的存储桶(访问存储 -> 浏览器)。您应该看到类似于以下内容
Cloud console
有了这些,我们就可以将模型部署到 AI Platform。在 AI Platform 中,模型资源包含模型的不同版本。模型名称在项目中必须唯一。我们将从创建一个模型开始
MODEL = 'fashion_mnist'
!gcloud ai-platform models create $MODEL --regions=us-central1
运行完此操作后,您应该在 AI Platform Cloud Console 的 模型部分 中看到该模型

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

您可以通过 Cloud Console UI、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 或直接在 UI 中执行此操作。这里我们将使用 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())
在响应中,您应该看到一个 JSON 对象,其中 softmax 为键,10 元素的 softmax 概率列表为值。我们可以通过运行以下代码获取第一个测试图像的预测类别
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 文档中)作为起点,并在此基础上进行部署和预测。这是一个二元分类模型,用于预测患者是否患有心脏病。

首先,在 Colab 中复制教程并运行这些单元格。请注意,该模型以 Keras 特征列作为输入,并具有两种不同类型的特征:数值型和类别型。您可以通过打印出 feature_columns 的值来查看这一点。这是我们模型期望的输入格式,这在我们将其部署后会很有用。除了将特征作为张量发送之外,我们还可以将它们作为列表发送到我们部署的模型。请注意,该模型混合了数值型和类别型特征。其中一个类别特征 (thal) 应作为字符串传递;其余特征为整数或浮点数。

按照上述步骤,让我们导出我们的模型并将其保存到相同 Cloud Storage 存储桶中的 hd-prediction 子目录中
model.save(BUCKET + '/hd-prediction', save_format='tf')
验证模型资产是否已上传到您的存储桶。由于我们在上一节中演示了如何使用 gcloud 部署模型,因此这里我们将使用 Cloud Console。首先,在 Cloud Console 中 AI Platform 的模型部分中选择“新模型”

然后按照以下步骤操作(您可以在下面的 GIF 中看到演示,也可以在下面的文字中阅读)。
转到 Cloud Console 的 模型部分。然后选择“新建模型”按钮,并为您的模型命名(例如 hd_prediction),然后选择“创建”。

创建模型资源后,选择“新建版本”。为其命名(例如 v1),然后选择最新的 Python 版本(在撰写本文时为 3.7)。在框架下,选择“TensorFlow”,框架版本为“2.1”,ML 运行时版本为“2.1”。在“模型 URL”中,输入您之前将 TF SavedModel 上传到的 Cloud Storage URL。如果按照上述步骤操作,这应该等效于 BUCKET + '/hd-prediction'。然后选择“保存”,当您的模型完成部署后,您将在控制台中看到版本名称旁边有一个绿色的复选标记。
为了将我们的数据格式化以进行预测,我们将把每个测试实例作为 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 启动作业。您可以了解更多关于批处理预测的信息 此处

下一步是什么?

您现在已经了解了如何将两种类型的 TensorFlow 2 模型部署到 Cloud AI Platform 以进行可扩展预测。我们在此部署的模型都使用自动扩展,这意味着它们将缩减到 0,因此您只需在模型使用时付费。请注意,AI Platform 还支持手动扩展,这使您可以指定要保持运行的节点数量。

如果您想了解更多关于我们在此所做的事情的信息,请查看以下资源
我很想听听您对这篇文章的意见。如果您有任何反馈或希望在将来涵盖的主题,请在 Twitter 上找到我 @SRobTweets
下一篇帖子
 How-to deploy TensorFlow 2 Models on Cloud AI Platform

Sara Robinson 撰写,开发者倡导者

Google Cloud 的 AI Platform 最近添加了 对部署 TensorFlow 2 模型的支持。这使您能够以可扩展的方式为最终用户提供预测,而无需管理自己的基础设施。在这篇文章中,我将引导您完成将两种不同类型的 TF2 模型部署到 AI Platform 并使用它们来生成 AI Platform 的预测的过程…