在 Vertex AI 上创建预测服务
Vertex AI 是谷歌云平台(GCP)中的一个平台,提供了广泛的与人工智能相关的工具和服务。你可以上传数据集,让人对其进行标注,将常用特征存储在特征存储中并用于训练或生产,还能在多个 GPU 或 TPU 服务器上进行模型训练,支持自动超参数调整或模型架构搜索(AutoML)。你还可以管理训练好的模型,对大量数据进行批量预测,为数据工作流安排多个作业,通过 REST 或 gRPC 大规模部署模型,并在名为 Workbench 的托管 Jupyter 环境中对数据和模型进行实验。甚至还有一个匹配引擎服务,能让你非常高效地比较向量(即近似最近邻)。GCP 还包括其他人工智能服务,如计算机视觉、翻译、语音转文本等 API。
前期准备
在开始之前,需要进行一些设置:
1. 登录你的 Google 账户,然后访问 Google 云平台控制台。如果你没有 Google 账户,则需要创建一个。
2. 如果你是首次使用 GCP,需要阅读并接受相关条款和条件。新用户可享受免费试用,包括价值 300 美元的 GCP 信用额度,可在 90 天内使用(截至 2022 年 5 月)。在本章中,你只需要使用其中的一小部分来支付服务费用。注册免费试用时,仍需创建支付配置文件并输入信用卡号码,这仅用于验证目的,可能是为了防止人们多次使用免费试用。在使用完 300 美元之前不会收费,之后只有在升级为付费账户时才会收费。
3. 如果你之前使用过 GCP 且免费试用已过期,那么本章中使用的服务将产生一定费用。不过费用不会太高,特别是如果你记得在不需要服务时将其关闭。在运行任何服务之前,请确保你理解并同意定价条件。同时,确保你的计费账户处于激活状态。检查方法是:打开左上角的 ☰ 导航菜单,点击“计费”,确保你已设置了支付方式且计费账户处于激活状态。
4. GCP 中的每个资源都属于一个项目,包括你可能使用的所有虚拟机、存储的文件以及运行的训练作业。创建账户时,GCP 会自动为你创建一个名为“My First Project”的项目。如果你愿意,可以通过以下方式更改其显示名称:在 ☰ 导航菜单中选择“IAM 和管理 → 设置”,更改项目的显示名称,然后点击“保存”。请注意,项目还有唯一的 ID 和编号。创建项目时可以选择项目 ID,但之后无法更改。项目编号是自动生成的,也无法更改。如果你想创建一个新项目,点击页面顶部的项目名称,然后点击“新建项目”并输入项目名称。你还可以点击“编辑”来设置项目 ID。确保为这个新项目激活了计费功能,以便收取服务费用(如果有免费信用额度,则从免费信用额度中扣除)。
- 注意 :当你知道只需要使用服务几个小时时,一定要设置闹钟提醒自己关闭服务,否则可能会让它们运行数天或数月,产生潜在的高额费用。
5. 现在你已经有了 GCP 账户和项目,并且计费已激活,必须激活所需的 API。在 ☰ 导航菜单中选择“API 和服务”,确保启用了云存储 API。如果需要,点击“+ 启用 API 和服务”,找到云存储并启用它。同时启用 Vertex AI API。
虽然你可以通过 GCP 控制台完成所有操作,但建议使用 Python。这样你可以编写脚本来自动化处理 GCP 中的各种任务,通常比通过菜单和表单进行操作更方便,尤其是对于常见任务。
Google Cloud CLI 和 Shell
Google Cloud 的命令行界面(CLI)包括 gcloud 命令,它可以让你控制 GCP 中的几乎所有内容,以及 gsutil ,用于与 Google 云存储进行交互。这个 CLI 在 Colab 中是预安装的,你只需要使用 google.auth.authenticate_user() 进行身份验证即可。例如, !gcloud config list 会显示配置信息。
GCP 还提供了一个预配置的 shell 环境,即 Google Cloud Shell,你可以直接在网页浏览器中使用它。它运行在一个免费的 Linux VM(Debian)上,并且已经预先安装并配置了 Google Cloud SDK,因此无需进行身份验证。在 GCP 的任何地方都可以使用 Cloud Shell,只需点击页面右上角的“激活 Cloud Shell”图标。
如果你想在自己的机器上安装 CLI,安装后需要运行 gcloud init 进行初始化。按照提示登录 GCP 并授予对 GCP 资源的访问权限,然后选择你要使用的默认 GCP 项目(如果你有多个项目)以及作业运行的默认区域。
在使用任何 GCP 服务之前,首先需要进行身份验证。在使用 Colab 时,最简单的方法是执行以下代码:
from google.colab import auth
auth.authenticate_user()
身份验证过程基于 OAuth 2.0,会弹出一个窗口,要求你确认是否允许 Colab 笔记本访问你的 Google 凭据。如果你接受,必须选择用于 GCP 的同一个 Google 账户。然后会要求你确认是否同意让 Colab 完全访问你在 Google Drive 和 GCP 中的所有数据。如果你允许访问,只有当前笔记本可以访问,并且仅在 Colab 运行时有效。显然,只有在你信任笔记本中的代码时才应接受。
身份验证和授权
一般来说,当应用程序需要代表用户从另一个应用程序访问用户的个人数据或资源时,才建议使用 OAuth 2.0 身份验证。例如,一些应用程序允许用户将数据保存到他们的 Google Drive,但为此应用程序首先需要用户使用 Google 进行身份验证并允许访问 Google Drive。通常,应用程序只会请求所需的访问级别,而不是无限制的访问。例如,应用程序只会请求访问 Google Drive,而不是 Gmail 或其他 Google 服务。此外,授权通常会在一段时间后过期,并且可以随时撤销。
当应用程序需要代表自己而不是用户访问 GCP 上的服务时,通常应该使用服务账户。例如,如果你构建了一个需要向 Vertex AI 端点发送预测请求的网站,那么该网站将代表自己访问服务。它不需要访问用户 Google 账户中的任何数据或资源。实际上,该网站的许多用户甚至可能没有 Google 账户。对于这种情况,你首先需要创建一个服务账户。在 GCP 控制台的 ☰ 导航菜单中选择“IAM 和管理 → 服务账户”(或使用搜索框),然后点击“+ 创建服务账户”,填写表单的第一页(服务账户名称、ID、描述),然后点击“创建并继续”。接下来,你必须为这个账户授予一些访问权限。选择“Vertex AI 用户”角色,这将允许服务账户进行预测并使用其他 Vertex AI 服务,但不能进行其他操作。点击“继续”。你还可以选择授予某些用户访问该服务账户的权限,这在你的 GCP 用户账户属于某个组织,并且你希望授权组织中的其他用户基于此服务账户部署应用程序或管理服务账户本身时非常有用。最后,点击“完成”。
创建服务账户后,你的应用程序必须以该服务账户的身份进行身份验证。有几种方法可以实现这一点:
- 如果你的应用程序托管在 GCP 上,例如你在 Google Compute Engine 上托管一个网站,那么最简单和最安全的方法是将服务账户附加到托管你网站的 GCP 资源上,如 VM 实例或 Google App Engine 服务。这可以在创建 GCP 资源时,在“身份和 API 访问”部分选择服务账户来完成。一些资源,如 VM 实例,也允许在创建后附加服务账户,你需要停止实例并编辑其设置。无论如何,一旦服务账户附加到 VM 实例或运行你代码的其他 GCP 资源上,GCP 的客户端库将自动以所选服务账户的身份进行身份验证,无需额外步骤。
- 如果你的应用程序使用 Kubernetes 进行托管,那么你应该使用 Google 的 Workload Identity 服务将正确的服务账户映射到每个 Kubernetes 服务账户。
- 如果你的应用程序没有托管在 GCP 上,例如你只是在自己的机器上运行 Jupyter 笔记本,那么你可以选择使用 Workload Identity Federation 服务(这是最安全但最困难的选项),或者为你的服务账户生成一个访问密钥,将其保存到一个 JSON 文件中,并将 GOOGLE_APPLICATION_CREDENTIALS 环境变量指向该文件,以便你的客户端应用程序可以访问它。你可以通过点击刚刚创建的服务账户,然后打开“密钥”选项卡来管理访问密钥。请确保将密钥文件保密,它就像服务账户的密码一样。
创建 Google 云存储桶
现在,让我们创建一个 Google 云存储桶来存储我们的 SavedModels(GCS 桶是用于存储数据的容器)。为此,我们将使用 google-cloud-storage 库,它在 Colab 中是预安装的。我们首先创建一个 Client 对象,作为与 GCS 的接口,然后使用它来创建桶:
from google.cloud import storage
project_id = "my_project" # 更改为你的项目 ID
bucket_name = "my_bucket" # 更改为唯一的桶名称
location = "us-central1"
storage_client = storage.Client(project=project_id)
bucket = storage_client.create_bucket(bucket_name, location=location)
如果你想重用现有的桶,可以将最后一行替换为 bucket = storage_client.bucket(bucket_name) ,并确保 location 设置为桶所在的区域。
GCS 对桶使用单一的全球命名空间,因此像“machine-learning”这样简单的名称很可能不可用。确保桶名称符合 DNS 命名约定,因为它可能会用于 DNS 记录。此外,桶名称是公开的,因此不要在名称中包含任何私人信息。通常可以使用你的域名、公司名称或项目 ID 作为前缀来确保唯一性,或者简单地在名称中使用随机数。
你可以根据需要更改区域,但要确保选择支持 GPU 的区域。同时,你可能需要考虑不同区域的价格差异很大,有些区域产生的 CO₂ 比其他区域多,有些区域不支持所有服务,并且使用单区域桶可以提高性能。有关更多详细信息,请参阅 Google 云的区域列表和 Vertex AI 的位置文档。如果你不确定,最好选择“us-central1”。
上传模型目录
接下来,将 my_mnist_model 目录上传到新创建的桶中。GCS 中的文件称为 blob(或对象),实际上它们只是简单地存储在桶中,没有任何目录结构。Blob 名称可以是任意 Unicode 字符串,甚至可以包含斜杠(/)。GCP 控制台和其他工具使用这些斜杠来模拟目录结构。因此,当我们上传 my_mnist_model 目录时,我们只关心文件,而不关心目录:
from pathlib import Path
def upload_directory(bucket, dirpath):
dirpath = Path(dirpath)
for filepath in dirpath.glob("**/*"):
if filepath.is_file():
blob = bucket.blob(filepath.relative_to(dirpath.parent).as_posix())
blob.upload_from_filename(filepath)
upload_directory(bucket, "my_mnist_model")
这个函数现在可以正常工作,但如果要上传的文件很多,速度会非常慢。通过多线程可以显著提高速度(具体实现可参考相关笔记本)。或者,如果你安装了 Google Cloud CLI,可以使用以下命令代替:
!gsutil -m cp -r my_mnist_model gs://{bucket_name}/
向 Vertex AI 注册模型
接下来,让 Vertex AI 了解我们的 MNIST 模型。为了与 Vertex AI 进行通信,我们可以使用 google-cloud-aiplatform 库(它仍然使用旧的 AI Platform 名称而不是 Vertex AI)。它在 Colab 中没有预安装,因此我们需要先安装它。安装后,我们可以导入该库并进行初始化,只需指定项目 ID 和位置的一些默认值,然后创建一个新的 Vertex AI 模型:我们指定一个显示名称、模型在 GCS 中的路径(在这种情况下是版本 0001),以及 Vertex AI 运行此模型所需的 Docker 容器的 URL。如果你访问该 URL 并向上导航一级,会找到其他可用的容器。这个容器支持 TensorFlow 2.8 和 GPU:
from google.cloud import aiplatform
server_image = "gcr.io/cloud-aiplatform/prediction/tf2-gpu.2-8:latest"
aiplatform.init(project=project_id, location=location)
mnist_model = aiplatform.Model.upload(
display_name="mnist",
artifact_uri=f"gs://{bucket_name}/my_mnist_model/0001",
serving_container_image_uri=server_image,
)
部署模型
现在部署这个模型,以便我们可以通过 gRPC 或 REST API 进行查询以进行预测。为此,我们首先需要创建一个端点,这是客户端应用程序在访问服务时连接的地方。然后将我们的模型部署到这个端点:
endpoint = aiplatform.Endpoint.create(display_name="mnist-endpoint")
endpoint.deploy(
mnist_model,
min_replica_count=1,
max_replica_count=5,
machine_type="n1-standard-4",
accelerator_type="NVIDIA_TESLA_K80",
accelerator_count=1
)
这段代码可能需要几分钟才能运行,因为 Vertex AI 需要设置一个虚拟机。在这个例子中,我们使用了一个相当基础的 n1-standard-4 类型的机器(更多类型可参考 https://homl.info/machinetypes ),还使用了一个基础的 NVIDIA_TESLA_K80 类型的 GPU(更多类型可参考 https://homl.info/accelerators )。如果你选择了除“us-central1”之外的其他区域,可能需要将机器类型或加速器类型更改为该区域支持的值(例如,并非所有区域都有 Nvidia Tesla K80 GPU)。
Google 云平台对 GPU 实施了各种配额限制,包括全球和区域配额。在没有获得 Google 事先授权的情况下,你不能创建数千个 GPU 节点。要检查你的配额,请在 GCP 控制台中打开“IAM 和管理 → 配额”。如果某些配额过低(例如,你在某个特定区域需要更多 GPU),可以申请增加配额,通常需要大约 48 小时。
Vertex AI 最初会启动最少数量的计算节点(在这个例子中是一个),当每秒查询数变得过高时,它会启动更多节点(最多达到你定义的最大数量,这里是五个),并在这些节点之间进行负载均衡。如果 QPS 率在一段时间内下降,Vertex AI 会自动停止额外的计算节点。因此,成本直接与负载、你选择的机器和加速器类型以及存储在 GCS 中的数据量相关。这种定价模式非常适合偶尔使用的用户和有重要使用高峰的服务,对于初创公司也很理想,在公司真正起步之前价格都很低。
查询预测服务
恭喜你,你已经将第一个模型部署到了云端!现在让我们查询这个预测服务:
response = endpoint.predict(instances=X_new.tolist())
我们首先需要将想要分类的图像转换为 Python 列表,就像我们之前使用 REST API 向 TF Serving 发送请求时所做的那样。响应对象包含预测结果,以 Python 列表的列表形式表示,每个元素是一个浮点数。我们将它们四舍五入到两位小数并转换为 NumPy 数组:
import numpy as np
np.round(response.predictions, 2)
输出结果如下:
array([[0. , 0. , 0. , 0. , 0. , 0. , 0. , 1. , 0. , 0. ],
[0. , 0. , 0.99, 0.01, 0. , 0. , 0. , 0. , 0. , 0. ],
[0. , 0.97, 0.01, 0. , 0. , 0. , 0. , 0.01, 0. , 0. ]])
我们得到了与之前相同的预测结果。现在我们有了一个运行在云端的出色预测服务,可以从任何地方安全地进行查询,并且可以根据 QPS 自动扩展或缩减。当你使用完端点后,别忘了删除它,以免产生不必要的费用:
endpoint.undeploy_all() # 从端点取消部署所有模型
endpoint.delete()
前期准备流程
graph LR
A[登录 Google 账户] --> B[访问 GCP 控制台]
B --> C{是否首次使用 GCP}
C -- 是 --> D[阅读并接受条款条件]
C -- 否 --> E{免费试用是否过期}
E -- 是 --> F[了解服务费用并确保计费账户激活]
E -- 否 --> G[使用免费额度]
D --> H[创建支付配置文件并输入信用卡号]
H --> I[创建或选择项目]
F --> I
G --> I
I --> J{是否需要更改项目名称}
J -- 是 --> K[更改项目显示名称]
J -- 否 --> L[无需更改]
K --> M[激活所需 API]
L --> M
身份验证和授权方式
| 应用程序托管情况 | 身份验证方式 |
|---|---|
| 托管在 GCP 上 | 将服务账户附加到托管资源(如 VM 实例) |
| 使用 Kubernetes 托管 | 使用 Google 的 Workload Identity 服务映射服务账户 |
| 未托管在 GCP 上 | 使用 Workload Identity Federation 服务或生成访问密钥并设置环境变量 |
在 Vertex AI 上创建预测服务
运行批量预测作业
如果我们需要进行大量预测,而不是反复调用预测服务,我们可以让 Vertex AI 为我们运行一个预测作业。这不需要端点,只需要一个模型。例如,我们使用 MNIST 模型对测试集的前 100 张图像运行一个预测作业。首先,我们需要准备批量数据并将其上传到 GCS。一种方法是创建一个文件,每行包含一个实例,每个实例格式化为 JSON 值,这种格式称为 JSON Lines,然后将这个文件传递给 Vertex AI。以下是具体步骤:
- 创建 JSON Lines 文件
from pathlib import Path
import json
batch_path = Path("my_mnist_batch")
batch_path.mkdir(exist_ok=True)
with open(batch_path / "my_mnist_batch.jsonl", "w") as jsonl_file:
for image in X_test[:100].tolist():
jsonl_file.write(json.dumps(image))
jsonl_file.write("\n")
- 上传批量数据目录到 GCS
upload_directory(bucket, batch_path)
或者,如果你有 Google Cloud CLI,可以使用以下命令:
!gsutil -m cp -r my_mnist_batch gs://{bucket_name}/
- 启动预测作业
batch_prediction_job = mnist_model.batch_predict(
job_display_name="my_batch_prediction_job",
machine_type="n1-standard-4",
starting_replica_count=1,
max_replica_count=5,
accelerator_type="NVIDIA_TESLA_K80",
accelerator_count=1,
gcs_source=[f"gs://{bucket_name}/{batch_path.name}/my_mnist_batch.jsonl"],
gcs_destination_prefix=f"gs://{bucket_name}/my_mnist_predictions/",
sync=True # 如果不想等待完成,可设置为 False
)
对于大的批量数据,你可以将输入拆分为多个 JSON Lines 文件,并通过 gcs_source 参数列出它们。
这个作业需要几分钟时间,主要是在 Vertex AI 上启动计算节点。命令完成后,预测结果将保存在一组文件中,文件名类似于 prediction.results-00001-of-00002 。这些文件默认使用 JSON Lines 格式,每个值是一个包含实例及其对应预测结果(即 10 个概率)的字典。实例的顺序与输入的顺序相同。作业还会输出 prediction-errors* 文件,如果出现问题,这些文件可用于调试。我们可以使用 batch_prediction_job.iter_outputs() 遍历所有输出文件,将所有预测结果存储在 y_probas 数组中:
y_probas = []
for blob in batch_prediction_job.iter_outputs():
if "prediction.results" in blob.name:
for line in blob.download_as_text().splitlines():
y_proba = json.loads(line)["prediction"]
y_probas.append(y_proba)
评估批量预测结果
现在,让我们看看这些预测的准确性如何:
import numpy as np
y_pred = np.argmax(y_probas, axis=1)
accuracy = np.sum(y_pred == y_test[:100]) / 100
print(accuracy)
输出结果为:
0.98
预测准确率达到了 98%,结果很不错!
批量预测作业流程
graph LR
A[准备批量数据] --> B[创建 JSON Lines 文件]
B --> C[上传到 GCS]
C --> D[启动批量预测作业]
D --> E[等待作业完成]
E --> F[获取预测结果文件]
F --> G[处理预测结果]
G --> H[评估预测准确性]
总结
通过以上步骤,我们完成了在 Vertex AI 上创建预测服务的整个流程,包括前期准备、模型上传与部署、查询预测服务以及运行批量预测作业。以下是整个流程的关键步骤总结:
1. 前期准备 :登录 Google 账户,访问 GCP 控制台,处理首次使用或免费试用相关事宜,创建或选择项目,激活所需 API。
2. 身份验证和授权 :根据应用程序的托管情况选择合适的身份验证方式。
3. 创建存储桶和上传模型 :创建 Google 云存储桶,将模型目录上传到桶中。
4. 模型部署 :向 Vertex AI 注册模型,创建端点并部署模型。
5. 查询预测服务 :通过端点进行预测查询,并在使用完后删除端点。
6. 批量预测作业 :准备批量数据,上传到 GCS,启动批量预测作业,处理和评估预测结果。
在使用 Vertex AI 服务时,要时刻注意服务的使用时间和费用,合理设置资源以避免不必要的开支。同时,根据实际需求选择合适的区域和机器类型,以获得最佳的性能和成本效益。
关键步骤列表
| 步骤 | 操作内容 |
|---|---|
| 前期准备 | 登录账户、处理试用、创建项目、激活 API |
| 身份验证 | 根据托管情况选择验证方式 |
| 存储和上传 | 创建存储桶,上传模型目录 |
| 模型部署 | 注册模型,创建端点并部署 |
| 查询服务 | 进行预测查询,使用后删除端点 |
| 批量作业 | 准备数据,上传,启动作业,处理结果 |
超级会员免费看
607

被折叠的 条评论
为什么被折叠?



