对生产环境进行原型设计:从自定义训练模型中获取预测结果

1. 概览

在本实验中,您将使用 Vertex AI 通过自定义训练模型进行在线预测和批量预测。

本实验是对生产环境进行原型设计视频系列的一部分。请务必先完成上一个实验,然后再尝试此实验。您可以观看随附的视频了解详情:

学习内容

您将了解如何:

  • 将模型上传到 Vertex AI Model Registry
  • 将模型部署到端点
  • 使用界面和 SDK 进行在线预测和批量预测

在 Google Cloud 上运行此实验的总费用约为 1 美元

2. Vertex AI 简介

本实验使用的是 Google Cloud 上提供的最新 AI 产品。Vertex AI 将整个 Google Cloud 的机器学习产品集成到无缝的开发体验中。以前,使用 AutoML 训练的模型和自定义模型是通过不同的服务访问的。现在,该新产品与其他新产品一起将这两种模型合并到一个 API 中。您还可以将现有项目迁移到 Vertex AI。

Vertex AI 包含许多不同的产品,可支持端到端机器学习工作流。本实验将重点介绍下面突出显示的产品:PredictionsWorkbench

Vertex 产品概览

3. 设置您的环境

完成使用 Vertex AI 训练自定义模型实验中的步骤以设置您的环境。

4. 将模型上传到注册表

在使用模型获取预测结果之前,我们需要先将模型上传到 Vertex AI 模型注册表,这是一个可以管理机器学习模型生命周期的代码库。

您可以在配置自定义训练作业时上传模型,如下所示。

training_prediction

或者,只要将已保存的模型工件存储在 Cloud Storage 存储桶中,您就可以在训练作业完成后导入模型。这是我们将在本实验中使用的选项。

转到控制台中的“模型”部分。

模型菜单

选择导入

import_model

选择作为新模型导入,然后为您的模型提供一个名称

new_model

模型设置下,使用预构建容器导入模型并使用 TensorFlow 2.8。您可以在此处查看预构建预测容器的完整列表。

然后提供指向您在自定义训练作业中保存模型工件的 Cloud Storage 存储桶的路径。其格式应类似于 gs://{PROJECT_ID}-bucket/model_output

我们将跳过“可解释性”部分,但如果您想详细了解 Vertex Explainable AI,请查看文档

导入模型后,您会在注册表中看到它。

flower_model

请注意,如果您想通过 SDK(而非界面)执行此操作,则可以从 Workbench 笔记本中运行以下命令来上传模型。

from google.cloud import aiplatform

my_model = aiplatform.Model.upload(display_name='flower-model',
                                  artifact_uri='gs://{PROJECT_ID}-bucket/model_output',
                                  serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')

5. 将模型部署到端点

我们可以在 Vertex AI 中运行两种类型的预测作业:批量和在线。

批量预测是异步请求。如果您不需要立即响应并且希望通过一个请求处理累积数据,可以选择此选项。

另一方面,如果您想要通过传递给模型的数据进行短延时预测,则可以使用在线预测。

现在,模型已存储在注册表中,我们可以使用它进行批量预测。

但是,如果我们想要进行在线预测,则需要将模型部署到端点。这会将已保存的模型工件与物理资源相关联,以实现短延时预测。

要部署到端点,请选择模型最右侧的三个点,然后选择部署到端点

deploy_model

为端点命名,然后保留其余设置,并点击继续

endpoint_name

端点支持自动扩缩,这意味着您可以设置最小值和最大值,并且计算节点会进行扩缩以满足这些边界内的流量需求。

本实验仅作演示之用,我们不打算将此端点用于高流量,因此您可以将计算节点数量上限设为 1,然后选择 n1-standard-4 作为 机器类型

endpoint_compute

我们将跳过模型监控,但如果您想详细了解此功能,请查看相关文档

然后,点击部署

部署需要几分钟时间,完成后,您将看到模型的部署状态更改为已在 Vertex AI 上部署

如果您想要通过 SDK 部署模型,请运行以下命令。

my_model = aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")

endpoint = my_model.deploy(
     deployed_model_display_name='my-endpoint',
     traffic_split={"0": 100},
     machine_type="n1-standard-4",
     accelerator_count=0,
     min_replica_count=1,
     max_replica_count=1,
   )

6. 获取预测结果

在线预测

将模型部署到某个端点后,您可以像任何其他端点一样访问该端点,这意味着您可以从云函数、聊天机器人、Web 应用等调用该端点。

出于演示目的,我们将从 Workbench 调用此端点。

返回您在上一个实验中创建的笔记本。在启动器中,创建一个新的 TensorFlow 2 笔记本。

tf_kernel

导入 Vertex AI Python SDK、Numpy 和 PIL

from google.cloud import aiplatform

import numpy as np
from PIL import Image

下载以下图片并将其上传到您的 Workbench 实例。我们将使用这张蒲公英图片测试此模型。

test_image

首先,定义端点。您需要替换下面的 {PROJECT_NUMBER}{ENDPOINT_ID}

endpoint = aiplatform.Endpoint(
    endpoint_name="projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")

您可以在 Cloud 控制台的“端点”部分找到 endpoint_id。

endpoint_id

您可以在控制台的首页上找到您的项目编号。请注意,这不同于项目 ID。

project_number

以下代码使用 PIL 打开图片并调整其大小。

IMAGE_PATH = "test-image.jpg"
im = Image.open(IMAGE_PATH)

然后,将 Numpy 数据转换为 float32 类型并转换为列表。之所以要转换为列表,是因为 Numpy 数据不可进行 JSON 序列化,因此无法在请求的正文中发送。

x_test = np.asarray(im).astype(np.float32).tolist()

最后,调用 endpoint.predict

endpoint.predict(instances=x_test).predictions

您获得的结果是模型的输出,它是包含 5 个单位的 softmax 层。如果要编写自定义逻辑以返回字符串标签(而不是索引),可以使用自定义预测例程

批量预测

针对批量预测设置数据格式有多种方法。为简单起见,我们将 Numpy 数据转储 (dump) 到 json 文件并将其保存到 Cloud Storage。

with open('test-data.json', 'w') as fp:
    json.dump(x_test, fp)

!gsutil cp test-data.json gs://{YOUR_BUCKET}

接下来,定义模型。与定义端点类似,只不过您需要提供 MODEL_ID,而不是 ENDPOINT_ID

my_model=aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")

您可以从控制台的“模型”部分选择模型名称和版本,然后选择版本详情,从而找到模型 ID

model_id

最后,使用 SDK 调用批量预测作业,传入存储 json 文件的 Cloud Storage 路径,并提供用于存储预测结果的 Cloud Storage 位置。

batch_prediction_job = my_model.batch_predict(
    job_display_name='flower_batch_predict',
    gcs_source='gs://{YOUR_BUCKET}/test-data.json',
    gcs_destination_prefix='gs://{YOUR_BUCKET}/prediction-results',
    machine_type='n1-standard-4',)

您可以在控制台的“批量预测”部分中跟踪作业进度。请注意,针对单张图片运行批量预测作业效率并不高。

batch_pred

后续步骤

在此示例中,我们先将测试图片转换为 NumPy,然后再进行预测调用。对于更现实的用例,您可能需要发送图片本身,而不必先将其加载到 NumPy 中。为此,您需要调整 TensorFlow Serving 函数,以便对图片字节进行解码。这需要完成一些工作,但对于更大的图片和应用构建,效率会高得多。您可以查看此笔记本中的示例

🎉 恭喜!🎉

您学习了如何使用 Vertex AI 执行以下操作:

  • 将模型上传到 Vertex AI Model Registry
  • 进行批量预测和在线预测

如需详细了解 Vertex 的不同部分,请参阅相关文档

7. 清理

如果您不打算使用模型,则需要从端点取消部署模型。您也可以完全删除端点。如果需要,您可以随时将模型重新部署到端点。

undeploy_model

Workbench 代管式笔记本会在 180 分钟空闲后自动超时,因此您无需担心关停实例。如果您要手动关停实例,请点击控制台的 Vertex AI Workbench 部分中的“停止”按钮。如果您想完全删除该笔记本,请点击“删除”按钮。

可停止实例

如需删除存储桶,请使用 Cloud Console 中的导航菜单,浏览到“存储空间”,选择您的存储桶,然后点击“删除”:

删除存储空间