跳至主要内容

Vertex AI 教程:初学者全面指南

掌握设置 Vertex AI 与执行机器学习工作流的基础知识。
· 14分钟 阅读

使用 AI 探索

尽管大多数人将 Google 与搜索引擎联系在一起,但该公司在数据科学领域同样根基深厚,持续推出旨在最大化数据价值的前沿产品与解决方案。其中一款产品 Vertex AI 于 2021 年发布,旨在简化企业级的机器学习流程。

在本教程中,我们将学习如何开始使用 Google 的 Vertex AI 平台,以及如何用它覆盖机器学习生命周期中的各类任务。完成后,我们将部署一个可用于分类任务预测请求的模型。

什么是 Vertex AI?

一个典型的机器学习生命周期包含多个阶段:

  • 数据准备、摄取与探索
  • 特征工程与特征选择
  • 模型训练与调优
  • 部署与模型监控

所有这些阶段及其子阶段都需要不同的工具集和多学科团队协作。

Google Cloud 的 Vertex AI 将这一整套流程精简并统一到单一平台中。

虽然大规模 ML 应用需要经验丰富的专家,但 Vertex AI 让各个技能水平的用户都能受益:

  • 面向初学者的 AutoML:无需编码经验。只需导入数据,点几下,AutoML 就能为您生成高质量模型。数据准备、模型构建(包括算法选择与超参数调优)等繁重工作都在幕后完成。
  • 面向专家的自定义模型训练:经验越多,空间越大。对于资深数据科学家和ML 工程师,Vertex AI 提供使用 PyTorch、TensorFlow 或 XGBoost 等偏好框架训练模型的灵活性。
  • 人人可用的部署:无论是 AutoML 训练的模型还是自定义模型,Vertex AI 都能让部署变得轻而易举。您可以将模型发布为实时 API 集成到产品中,或使用批量预测处理大规模任务。

本节还有很多内容未提及,您将在接下来的教程中亲自实践它们。

什么是 Google Cloud Services?

Homepage of Google Cloud Services

在开始探索平台之前,我们需要先了解其“母体”——Google Cloud 服务。Google Cloud Services 提供了广泛的云计算解决方案,包括存储、网络、数据库、分析与机器学习能力。

这些服务与 Vertex AI 协同工作,统一您的机器学习工作流。以下是常与 Vertex AI 搭配使用的服务拆解:

数据存储与管理

  • Cloud Storage:作为原始数据的中心存储库,Vertex AI 可访问其中数据进行训练与分析。
  • BigQuery:强大的数据仓库,可存储并查询大型数据集,使 Vertex AI 能使用 BigQuery ML 在套件内完成训练。

计算资源

  • Compute Engine:提供多种配置的虚拟机,满足自定义模型训练需求。Vertex AI 可连接这些机器执行资源密集型训练任务。
  • Vertex AI Pipelines:在多种计算资源间协调复杂的 ML 工作流以提升效率。

访问 cloud.google.com,您随时可通过 Google 账号使用 Google Cloud 服务。若从未使用过,点击“Get started for free”开始免费试用。

否则,直接前往 console.cloud.google.com,我们就可以开始了。

为 Vertex AI 设置 Google Cloud Console

免责声明:如果您打算跟随教程实操,请预留 25-30 美元的 Vertex AI 费用。我们将使用最便宜的配置。

访问 Google Cloud Console 后,您很可能会看到如下欢迎页:

Google Cloud Console for Vertex AI

页面显示了您的工作区名称;我的为 ibexprogramming.com。

我们要做的第一件事是创建一个项目。Google Cloud 项目是用于管理特定任务资源的高层组织单元。如下 GIF 演示了创建流程:

A GIF that shows how to create a new project in Google Cloud Console

项目创建完成后,选择它,确保页面顶部工具条显示如下:

The top bar of Google Cloud Console

接下来,您需要创建一个结算账号,因为启用 Vertex AI 服务需要结算信息。别担心——在使用付费资源前不会扣费。前往 https://console.cloud.google.com/billing:

A screenshot for a billing account in Google Cloud Console

如果您像我一样还没有账号,点击“Create account”并按指引完成操作。我们将在下一部分将此结算账号与项目关联。

随后返回 https://console.cloud.google.com/,点击页面底部的“View all products”按钮:

Another screenshot of Google Cloud Console

下一页会列出为您的项目提供的所有 Google Cloud 服务。搜索“Vertex AI”(Ctrl + F),并将其固定到菜单以便访问,然后点击该服务:

A list of all Google Cloud products

这会带您进入 Vertex AI 的dashboard。系统可能会弹窗询问是否启用 Vertex AI API——请选择“Enable”。如果未弹出,您也可以点击“Enable all API permissions”按钮来启用。

现在,我们已准备好向 Vertex AI 上传数据集。

在 Vertex AI 中上传数据集

向 Vertex AI 添加数据集的方式多种多样。本节我们为简便起见使用本地 CSV 文件。

下载示例数据集

本文将使用来自 UCI 机器学习库的Dry Bean 数据集。其中包含 1.3 万条豆类样本及其 15 个数值测量。

我们的任务是将其分类为七种豆类:Seker、Barbunya、Bombay、Cali、Dermosan、Horoz 和 Sira。

下载完成后,将 ZIP 中的 Excel 文件保存到本地目录:

from pathlib import Path

cwd = Path.cwd()
data_path = cwd / "data" / "Dry_Bean_Dataset.xlsx"

随后,我们可以用 pandas 读取该文件并另存为 CSV:

import pandas as pd

beans = pd.read_excel(data_path)

beans.shape
(13611, 17)

注意,read_excel 需要您通过 PIP 安装 openpyxl 库。

很好,我们已经将数据集读取为 DataFrame。将其另存为 CSV:

beans.to_csv(cwd / "data" / "dry_bean.csv", index=False)

创建云存储桶

如前所述,我们需要一个 Google Storage Bucket 来存放原始数据。按照下方 GIF 导航至该产品的控制台:

A GIF that shows how to link a billing account to a Google Cloud project

GIF 显示,开始使用存储服务前,我们需要关联一个结算账号,即使用刚创建的那个。然后,您就可以创建一个全局唯一名称的存储桶:

A GIF that shows how to create a Google Cloud storage bucket

找到唯一名称后,连续点击“Continue”直至创建完成——所有字段均可保持默认选项。

现在,我们可以导入上一节保存的 CSV 文件了。

将本地 CSV 导入 Vertex AI

回到 Vertex AI 控制台,进入 Datasets 选项卡:

A GIF  that shows how to switch to the datasets tab of Vertex AI dashboard

您会看到这里为空,点击“+Create”按钮:

A screenshot of the Vertex AI datasets tab

为数据集起一个唯一名称,并选择“tabular”选项:

A GIF  that shows how to create a new dataset in Vertex AI

随后平台会显示数据源选项。选择上传本地 CSV 文件,并在 Cloud Storage 路径中选择您刚创建的存储桶:

A GIF  that shows how to insert a local CSV into an existing cloud storage bucket

数据集成功上传后,您会看到“Analyze”选项卡,显示有关 CSV 的基本元数据。您还会看到“TRAIN NEW MODEL”按钮,用于启动 AutoML 训练任务。

不过我们不会使用该按钮,因为它面向完全的 ML 初学者。相反,我们将使用 Vertex AI Workbench 来配置 Jupyterlab 编码环境与计算资源,以运行 AutoML 与自定义库。

在 Vertex AI Workbench 中配置 Jupyterlab 与计算资源

作为一体化平台,Vertex AI 也提供称为workbenches的开发环境。要创建 workbench,进入其选项卡并按下方 GIF 操作:

A GIF that shows how to create a Vertex AI Workbench

每个 workbench 都预装了 Jupyterlab 3。因此,您只需根据预算和需求配置硬件选项。由于我们的数据集较小,为示例我选择了最低配实例,费用约 0.12 美元/小时(建议选择更多 CPU 核心以加速计算)。

我还将空闲关机时间改为 10 分钟,这样若忘记关闭,环境也会自动停止。

workbench 初始化需要一些时间。完成后会出现“OPEN JUPYTERLAB”按钮,点击进入:

A screenshot of the jupyterlab interface inside a Vertex AI workbench

您将看到熟悉的 Jupyterlab 界面。在其中创建一个新的 Python 3 笔记本,并按喜好重命名。在第一个单元中,安装/升级 Google Cloud 服务 SDK google-cloud-aiplatform:

!pip3 install --upgrade --quiet google-cloud-aiplatform

然后,使用 gcloud config list 列出您账号下可用的项目:

!gcloud config list
[compute]
region = us-central1
[core]
account = # HIDDEN #
disable_usage_reporting = True
project = vertexai-tutorial-423010
[dataproc]
region = us-central1

Your active configuration is: [default]

gcloud 与 gsutil 是所有 workbench 中可用的终端工具。它们可高效管理您的 Google Cloud 服务。

根据上述输出,将以下信息保存为 Python 变量:

PROJECT_ID = 'vertexai-tutorial-423010'
BUCKET_URI = 'gs://vetex-tutorial-bucket-bex'
REGION = 'us-central1'

别忘了将 BUCKET_URI 替换为您自己的存储桶名称。然后导入 aiplatform 子模块并进行初始化:

from google.cloud import aiplatform as ai

ai.init(project=PROJECT_ID, location=REGION, staging_bucket=BUCKET_URI)

aiplatform 将作为与 Vertex AI 交互的 SDK。

An image that shows a list of available Vertex AI workbenches.

完成教程或中途休息时,请务必 STOP 实例以避免不必要的费用。

在 Vertex AI 中训练与部署 AutoML 模型

现在,让我们用 AutoML 训练一个模型。正如之前所述,AutoML 会为我们处理繁重工作,并在给定数据集上返回其能训练出的最佳模型。这意味着要充分发挥 AutoML 的效果,您必须确保输入的数据集尽可能高质量。因此,值得在此之前花些时间进行特征工程与预处理。

AutoML 会在内部对数据集进行预处理,但无法修复数据集中所有问题。

不过,本节我们将仅训练一个不做预处理或特征工程的基线 AutoML 模型以求简洁。

从 Google Storage 存储桶加载数据

首先,我们希望从存储桶加载 CSV 数据集,并花些时间探索它。请记住, EDA 非常重要,您可以在我们的Python 探索性数据分析课程中进一步学习!

import pandas as pd

# Path to your CSV file in GCS bucket
gcs_path = "gs://vertex-tutorial-bucket-bex/dry_bean.csv"

beans = pd.read_csv(gcs_path)

beans.head()

The top five rows of the Dry Beans dataset from UCI.

好消息是,pandas 可以直接从 GCS 路径下载文件。唯一要注意的是,上述代码仅在 Vertex AI workbench 中可行,因为它们已使用您的 Google Cloud 凭据完成了认证。

在 Vertex AI 中用 pandas 探索数据

我们不会对数据集进行深入分析,以免偏离本文重点。因此,我们仅打印一些汇总统计和图表:

beans.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 13611 entries, 0 to 13610
Data columns (total 17 columns):
#   Column           Non-Null Count  Dtype 
---  ------           --------------  ----- 
0   Area             13611 non-null  int64 
1   Perimeter        13611 non-null  float64
2   MajorAxisLength  13611 non-null  float64
3   MinorAxisLength  13611 non-null  float64
4   AspectRation     13611 non-null  float64
5   Eccentricity     13611 non-null  float64
6   ConvexArea       13611 non-null  int64 
7   EquivDiameter    13611 non-null  float64
8   Extent           13611 non-null  float64
9   Solidity         13611 non-null  float64
10  roundness        13611 non-null  float64
11  Compactness      13611 non-null  float64
12  ShapeFactor1     13611 non-null  float64
13  ShapeFactor2     13611 non-null  float64
14  ShapeFactor3     13611 non-null  float64
15  ShapeFactor4     13611 non-null  float64
16  Class            13611 non-null  object
dtypes: float64(14), int64(2), object(1)
memory usage: 1.8+ MB

共有 15 个数值特征和 1 个目标列——Class。大约 1.3 万条记录且无缺失值,这会大大简化训练。

将特征名保存到一个列表,后续可能会用到:

feature_names = beans.columns.tolist()

现在,为几项看起来较重要的特征绘制配对图:

import seaborn as sns

sns.pairplot(
   beans,
   vars=["Area", "MajorAxisLength", "MinorAxisLength", "Eccentricity", "roundness"],
   hue="Class",
);

A pairplot of a few features of the Dry beans dataset.

我们看到了一些有趣的趋势——主要是 Bombay(绿色)豆在其物理测量上与其他类别明显分离。

再绘制一个相关系数矩阵:

import matplotlib.pyplot as plt

correlation = beans.corr(numeric_only=True)

# Create a square heatmap with center at 0
sns.heatmap(correlation, center=0, square=True, cmap="coolwarm", vmin=-1, vmax=1)

plt.show()

A correlation matrxi for the numeric features of Dry Beans dataset

我们有一些几乎完全相关的特征,这很合理,因为它们都与物理测量相关。但也有一些特征对几乎不相关或仅有很小相关性。

此处我将探索权交给您,可继续深入并尝试为数据集提出一些可验证的问题。

运行 AutoML 训练任务

要启动 AutoML 训练任务,我们首先需要一个与之兼容的数据集对象:

ds = ai.TabularDataset.create(
   display_name="dry_bean_dataset", gcs_source=gcs_path
)
TabularDataset created. 
type(ds)
google.cloud.aiplatform.datasets.tabular_dataset.TabularDataset
ds.resource_name
'projects/10783853768/locations/us-central1/datasets/4978116960081412096'

我们使用 TabularDataset.create 方法初始化为 ds。Vertex AI 会为其分配自己的名称,可通过 resource_name 属性访问。

接着用 ai.AutoMLTabularTrainingJob 类初始化训练任务。它需要两个参数:

  • 任务的显示名称
  • 任务目标——本例为分类。
job = ai.AutoMLTabularTrainingJob(
   display_name="dry-bean-classification",
   optimization_prediction_type="classification",
)

然后运行该任务的 run 方法:

model = job.run(
   dataset=ds,
   target_column="Class",
   training_fraction_split=0.8,
   validation_fraction_split=0.1,
   test_fraction_split=0.1,
   model_display_name="baseline-classification-model",
   disable_early_stopping=False,
)

参数基本不言自明。代码执行需要一段时间(取决于计算资源)。

如果前往控制台“MODEL DEVELOPMENT > TRAINING”选项卡并点击任务名称,您可查看实时训练进度。下图显示训练处于预处理阶段:

A training job in progress for Vertex AI

查看结果

训练完成后,回到训练选项卡并点击模型名称。这次会显示与模型相关的性能指标:

A GIF that shows the metrics for a trained model in Vertex AI

如您所见,即使作为基线模型,指标也非常不错,均高于 0.90。

部署 AutoML 模型并生成预测

现在我们只需一行代码即可部署该 model:

endpoint = model.deploy(machine_type="n1-standard-4")

deploy 方法仅需要一个参数——用于推理的机器类型。由于只要上线部署就会产生额外费用,我不会实际运行上述代码。

不过,如果您运行了它,deploy 方法会返回一个可供发送请求的 Endpoint 对象:

prediction = endpoint.predict(
   [
       {
           "Area": "30099",
           "Perimeter": "638.8209999999999",
           "MajorAxisLength": "237.14191130827916",
           "MinorAxisLength": "162.3034300714102",
           "AspectRation": "1.4611022774068396",
           "Eccentricity": "0.7290928631259719",
           "ConvexArea": "30477",
           "EquivDiameter": "195.76321681302556",
           "Extent": "0.8036043251902283",
           "Solidity": "0.9875972044492568",
           "roundness": "0.9268374259664279",
           "Compactness": "0.8255108332939839",
           "ShapeFactor1": "0.007878730566074592",
           "ShapeFactor2": "0.002256976927384019",
           "ShapeFactor3": "0.6814681358857279",
           "ShapeFactor4": "0.9956946453228307",
       }
   ]
)

print(prediction)

它的 predict 方法接受一个样本列表进行预测。样本必须以 JSON 格式提供。

您也可以通过控制台部署模型。前往“MODEL REGISTRY”选项卡,会看到已列出的模型。点击其名称并选择“DEPLOY & TEST”选项卡:

DEPLOY and TEST tab of the model registry in Vertex AI

点击“DEPLOY TO ENDPOINT”按钮会跳转至单独页面,您可在其中配置用于部署模型的机器。但在此之前,您可以在部署按钮下方的区域进行测试:

A GIF that shows how to test a trained model in Vertex AI using the UI

在 Vertex AI 中训练与部署自定义模型

在 Vertex AI 中部署自定义模型比 AutoML 模型更具挑战,也更昂贵,因为除了 Workbench 与部署成本之外,还会涉及一些Docker 容器。如果您准备好了,那就开始吧!

Vertex AI 自定义训练的高层概览

自定义训练从自定义模型训练脚本开始。在该脚本中,我们可以做任何事,只要它:

  • 从 GCS 存储桶加载数据
  • 使用某个 ML 框架(TF、PyTorch、Scikit-learn、XGBoost)训练模型
  • 可选地,对模型进行超参数调优
  • 将训练或调优后的模型保存回 GCS 存储桶。

随后,需要将该训练脚本打包为 Docker 容器并推送至 Google Container Registry。之后,我们可以通过 Vertex AI 的 Python SDK 或控制台来训练该自定义模型。

为训练代码创建目录结构

首先,按照这份 Google Codelab的推荐创建目录结构。在 workbench 中通过新建 launcher 切换到终端:

A GIF that shows how to switch to the terminal in Jupyterlab in Workbench

然后,新建名为“dry-beans”的目录并进入:

$ mkdir dry-beans
$ cd dry-beans/

在 dry-beans 内创建 trainer 目录,并在其中创建 train.py 文件:

$ mkdir trainer
$ touch trainer/train.py

创建 Dockerfile

接着,新建一个 Dockerfile:

$ touch Dockerfile

打开文件并粘贴以下内容:

FROM gcr.io/deeplearning-platform-release/tf2-cpu.2-6
WORKDIR /

# Copies the trainer code to the docker image.
COPY trainer /trainer

# Install XGBoost
RUN pip install xgboost==1.6.2

# Sets up the entry point to invoke the trainer.
ENTRYPOINT ["python", "-m", "trainer.train"]

该 Dockerfile 使用 Google Container Registry 提供的官方深度学习镜像(预装 TensorFlow)。文件会复制我们的 trainer 目录并安装 XGBoost。最后会运行我们的 Python 脚本。

编写训练脚本

脚本需要从我们的 GCP 存储桶加载 Dry Beans 数据集,在其上训练一个 XGBoost 分类器,并将模型保存回存储桶。为此我编写了一个简单脚本,完成上述任务,已放在这个 GitHub gist(为节省篇幅,此处不贴出)。

将 gist 中的代码复制到 train.py。然后回到终端,安装 XGBoost(所选 Workbench 未预装),并运行脚本:

$ pip install xgboost==1.6.2
$ python trainer/train.py

构建 Docker 镜像

如果脚本运行无误,继续在终端输入这两个变量:

$ PROJECT_ID='vertexai-tutorial-423010'  # Replace with your PROJECT_ID from earlier
$ IMAGE_URI="gcr.io/$PROJECT_ID/dry-beans:v1"  # This stays the same

这些变量将在构建容器时使用,执行:

$ docker build ./ -t $IMAGE_URI

构建需要一些时间。完成后运行容器,确认一切正常:

$ docker run $IMAGE_URI
Model trained successfully!
Model uploaded successfully!

如果您看到以上成功信息,容器就可以推送了:

$ docker push $IMAGE_URI

创建自定义训练任务

到这里大部分工作已完成。现在可切换至控制台,使用刚推送的容器创建自定义训练任务。进入“MODEL REGISTRY”选项卡并点击“CREATE”:

Creating a new custom training job in Vertex AI

训练方法选择“No managed dataset”和“Custom training”。在下一步(Model details)中,为模型命名——dry-beans-classifier。

在训练容器面板中:

Choosing a container image for custom training job in Vertex AI

选择我们推送的自定义镜像作为容器,并选择 cloud-ai-platform 存储桶作为模型输出。然后点击继续,直到到达“Compute and pricing”面板:

Compute and pricing pane of the custom training job form in Vertex AI

选择一台标准 n1、4 CPU 的机器,最后点击“START TRAINING”。然后切换到控制台的“TRAINING”选项卡。

A screenshot of the training tab of the Vertex AI dashboard.

此时您会看到两种情况之一:

  1. 训练失败状态
  2. 训练进行中状态

我遇到的是第一种情况,让我们点击模型名称排查原因:

An error message from a custom training job in Vertex AI

错误提示我超出了允许的自定义训练 CPU 数量。我进一步调查后,结果相当令人失望。

通常,GCP 会为任一计算区域提供至少 20 个 CPU 配额,但检查我的配置文件后发现配额只有 1。这意味着我无法运行任何自定义训练任务,因为 Google 提供的机器至少需要两个 CPU。

我尝试按照这篇 StackOverflow 贴中的答案提升配额,但没有成功。系统提示新的 Vertex AI 用户仅允许 1 个 CPU 单元。若想提升配额,需要提交支持工单,而这并非免费(需要付费支持合约)。

因此,如果您也不走运,可以先尝试该 SO 贴中的方法。对部分用户有效;若仍无效,唯一选项就是联系支持。

但如果您够幸运,训练顺利完成,那么就可以按照我们对 AutoML 模型的步骤进行部署。

结语

Vertex AI 是一个功能庞大的平台。在本教程中,我们只触及了皮毛,但已经覆盖了平台最重要的构件。掌握存储桶、workbench 与训练任务的创建后,您将有足够能力继续探索平台的其余部分。

如果您想进一步了解 Google Cloud 服务,推荐阅读:

Bexruz (Bex) Tuychiev

作者

Bexruz (Bex) Tuychiev

我是一名数据科学内容创作者,拥有超过 2 年的经验,并在 Medium 上拥有较大的读者群。我喜欢用略带讽刺的笔调撰写有关 AI 和机器学习的深度文章——毕竟总得想点办法让这些内容不那么枯燥。我已发表 130 多篇文章,并制作了一门 DataCamp 课程,另有一门正在筹备中。我的内容已被超过 500 万人次阅读,其中有 2 万人在 Medium 和 LinkedIn 上成为关注者。 

主题