使用 Private Service Connect 端点进行在线预测

借助 Private Service Connect,您可以从多个使用方项目和 VPC 网络安全地访问 Vertex AI 在线预测,而无需使用公共 IP 地址、公共互联网访问权限或显式对等的内部 IP 地址范围。

对于具有以下要求的在线预测用例,我们建议使用 Private Service Connect:

  • 要求使用专用且安全的连接
  • 需要低延迟
  • 无需公开

Private Service Connect 会使用 VPC 网络中的转发规则将流量单向发送到 Vertex AI 在线预测服务。转发规则会连接到服务附件,该附件会将 Vertex AI 服务公开到您的 VPC 网络。如需了解详情,请参阅关于通过 Private Service Connect 访问 Vertex AI 服务。如需详细了解如何设置 Private Service Connect,请参阅 Virtual Private Cloud (VPC) 文档中的 Private Service Connect 概览

创建在线预测端点

使用以下方法之一创建启用了 Private Service Connect 的在线预测端点:

控制台

  1. 在 Google Cloud 控制台中,前往 Vertex AI 中的在线预测页面。

    转到在线预测

  2. 点击创建

  3. 为端点提供显示名称。

  4. 选择 Private(私享)。

  5. 选择 Private Service Connect

  6. 点击选择项目 ID

  7. 选择要添加到端点许可名单的项目。

  8. 点击继续

  9. 选择您的模型规范。如需了解详情,请参阅将模型部署到端点

  10. 点击创建以创建端点并将模型部署到该端点。

  11. 记下响应中的端点 ID。

API

REST

在使用任何请求数据之前,请先进行以下替换:

  • VERTEX_AI_PROJECT_ID:您要创建在线预测端点的 Google Cloud 项目的 ID。
  • REGION:您在其中使用 Vertex AI 的区域。
  • VERTEX_AI_ENDPOINT_NAME:在线预测端点的显示名称。
  • ALLOWED_PROJECTS:以英文逗号分隔的 Google Cloud 项目 ID 列表,每个 ID 都用引号括起来,例如 ["PROJECTID1", "PROJECTID2"]。 如果某个项目未包含在此列表中,您将无法从该项目向 Vertex AI 端点发送预测请求。请务必在此列表中添加 VERTEX_AI_PROJECT_ID,以便您能够从端点所在的项目中调用该端点。

HTTP 方法和网址:

POST https://REGION-aiplatform.googleapis.com/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints

请求 JSON 正文:

{
  "displayName": "VERTEX_AI_ENDPOINT_NAME",
  "privateServiceConnectConfig": {
    "enablePrivateServiceConnect": true,
    "projectAllowlist": ["ALLOWED_PROJECTS"]
  }
}

如需发送您的请求,请展开以下选项之一:

您应该收到类似以下内容的 JSON 响应:

{
  "name": "projects/VERTEX_AI_PROJECT_NUMBER/locations/REGION/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateEndpointOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-11-05T17:45:42.812656Z",
      "updateTime": "2020-11-05T17:45:42.812656Z"
    }
  }
}
记下 ENDPOINT_ID

Python

在尝试此示例之前,请按照《Vertex AI 快速入门:使用客户端库》中的 Python 设置说明执行操作。 如需了解详情,请参阅 Vertex AI Python API 参考文档

如需向 Vertex AI 进行身份验证,请设置应用默认凭据。 如需了解详情,请参阅为本地开发环境设置身份验证

PROJECT_ID = "VERTEX_AI_PROJECT_ID"
REGION = "REGION"
VERTEX_AI_ENDPOINT_NAME = "VERTEX_AI_ENDPOINT_NAME"

from google.cloud import aiplatform

aiplatform.init(project=PROJECT_ID, location=REGION)

# Create the forwarding rule in the consumer project
psc_endpoint = aiplatform.PrivateEndpoint.create(
display_name=VERTEX_AI_ENDPOINT_NAME,
project=PROJECT_ID,
location=REGION,
private_service_connect_config=aiplatform.PrivateEndpoint.PrivateServiceConnectConfig(
    project_allowlist=["ALLOWED_PROJECTS"],
    ),
)

替换以下内容:

  • VERTEX_AI_PROJECT_ID:您要创建在线预测端点的 Google Cloud 项目的 ID
  • REGION:您在其中使用 Vertex AI 的区域
  • VERTEX_AI_ENDPOINT_NAME:在线预测端点的显示名称
  • ALLOWED_PROJECTS:项目 ID 的英文逗号分隔列表,每个 ID 都用引号括起来。 Google Cloud例如 ["PROJECTID1", "PROJECTID2"]。 如果某个项目未包含在此列表中,您将无法从该项目向 Vertex AI 端点发送预测请求。请务必在此列表中添加 VERTEX_AI_PROJECT_ID,以便您能够从该端点所在的项目中调用该端点。

记下返回的端点 URI 末尾的 ENDPOINT_ID

INFO:google.cloud.aiplatform.models:To use this PrivateEndpoint in another session:
INFO:google.cloud.aiplatform.models:endpoint = aiplatform.PrivateEndpoint('projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID')

部署模型

创建启用 Private Service Connect 的在线预测端点后,请按照将模型部署到端点中所述的步骤将模型部署到该端点。

获取服务连接 URI

部署模型时,系统会为在线预测端点创建一个服务附件。此服务附件代表公开给您的 VPC 网络的 Vertex AI 在线预测服务。运行 gcloud ai endpoints describe 命令以获取服务连接 URI。

  1. 仅列出端点详情中的 serviceAttachment 值:

    gcloud ai endpoints describe ENDPOINT_ID \
    --project=VERTEX_AI_PROJECT_ID \
    --region=REGION \
    | grep -i serviceAttachment
    

    替换以下内容:

    • ENDPOINT_ID:您的在线预测端点的 ID
    • VERTEX_AI_PROJECT_ID:您在其中创建了在线预测端点的 Google Cloud 项目的 ID
    • REGION:此请求对应的区域

    输出类似于以下内容:

    serviceAttachment: projects/ac74a9f84c2e5f2a1-tp/regions/us-central1/serviceAttachments/gkedpm-c6e6a854a634dc99472bb802f503c1
    
  2. 记下 serviceAttachment 字段中的完整字符串。这是服务连接 URI。

创建转发规则

您可以预留内部 IP 地址,并使用该地址创建转发规则。如需创建转发规则,您需要上一步中的服务连接 URI。

  1. 如需为转发规则预留内部 IP 地址,请使用 gcloud compute addresses create 命令

    gcloud compute addresses create ADDRESS_NAME \
    --project=VPC_PROJECT_ID \
    --region=REGION \
    --subnet=SUBNETWORK \
    --addresses=INTERNAL_IP_ADDRESS
    

    替换以下内容:

    • ADDRESS_NAME:内部 IP 地址的名称
    • VPC_PROJECT_ID:托管您的 VPC 网络的 Google Cloud 项目的 ID。如果您的在线预测端点和 Private Service Connect 转发规则托管在同一项目中,请为此参数使用 VERTEX_AI_PROJECT_ID
    • REGION:要创建 Private Service Connect 转发规则的 Google Cloud 区域
    • SUBNETWORK:包含 IP 地址的 VPC 子网的名称
    • INTERNAL_IP_ADDRESS:要预留的内部 IP 地址。此参数是可选的。

      • 如果指定此参数,则 IP 地址必须在子网的主要 IP 地址范围内。该 IP 地址可以是 RFC 1918 地址,也可以是具有非 RFC 范围的子网。
      • 如果省略此参数,系统会自动分配内部 IP 地址。
      • 如需了解详情,请参阅预留新的静态内部 IPv4 或 IPv6 地址
  2. 如需验证 IP 地址是否已预留,请使用 gcloud compute addresses list 命令

    gcloud compute addresses list --filter="name=(ADDRESS_NAME)" \
    --project=VPC_PROJECT_ID
    

    在响应中,验证 IP 地址是否显示为 RESERVED 状态。

  3. 如需创建转发规则并将其指向在线预测服务附件,请使用 gcloud compute forwarding-rules create 命令

    gcloud compute forwarding-rules create PSC_FORWARDING_RULE_NAME \
        --address=ADDRESS_NAME \
        --project=VPC_PROJECT_ID \
        --region=REGION \
        --network=VPC_NETWORK_NAME \
        --target-service-attachment=SERVICE_ATTACHMENT_URI
    

    替换以下内容:

    • PSC_FORWARDING_RULE_NAME:转发规则的名称
    • VPC_NETWORK_NAME:要创建端点的 VPC 网络的名称
    • SERVICE_ATTACHMENT_URI:您之前记下的服务附件
  4. 如需验证服务连接是否接受端点,请使用 gcloud compute forwarding-rules describe 命令

    gcloud compute forwarding-rules describe PSC_FORWARDING_RULE_NAME \
    --project=VPC_PROJECT_ID \
    --region=REGION
    

    在响应中,验证 pscConnectionStatus 字段中是否显示 ACCEPTED 状态。

可选:获取内部 IP 地址

如果您在创建转发规则时未为 INTERNAL_IP_ADDRESS 指定值,则可以使用 gcloud compute forwarding-rules describe 命令获取自动分配的地址:

gcloud compute forwarding-rules describe PSC_FORWARDING_RULE_NAME \
--project=VERTEX_AI_PROJECT_ID \
--region=REGION \
| grep -i IPAddress

替换以下内容:

  • VERTEX_AI_PROJECT_ID:您的项目 ID
  • REGION:此请求的区域名称

获取在线预测结果

使用 Private Service Connect 从端点获取在线预测与从公共端点获取在线预测类似,但存在以下注意事项:

  • 请求必须从创建在线预测端点时在 projectAllowlist 中指定的项目发送。
  • 如果未启用全球访问权限,则请求必须从同一区域发送。
  • 如需使用 REST 获取预测结果,您必须使用端点的静态 IP 地址进行连接,除非您为内部 IP 地址创建 DNS 记录。例如,您必须将 predict 请求发送到以下端点:

    https://INTERNAL_IP_ADDRESS/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID:predict
    

    INTERNAL_IP_ADDRESS 替换为您之前预留的内部 IP 地址。

以下部分提供了使用 Python 发送预测请求的示例。

第一个示例

psc_endpoint = aiplatform.PrivateEndpoint("projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID")
REQUEST_FILE = "PATH_TO_INPUT_FILE"
import json

import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

with open(REQUEST_FILE) as json_file:
    data = json.load(json_file)
    response = psc_endpoint.predict(
        instances=data["instances"], endpoint_override=INTERNAL_IP_ADDRESS
    )
print(response)

PATH_TO_INPUT_FILE 替换为包含请求输入的 JSON 文件的路径。

第二个示例

import json
import requests
import urllib3
import google.auth.transport.requests

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

REQUEST_FILE = "PATH_TO_INPUT_FILE"

# Programmatically get credentials and generate an access token
creds, project = google.auth.default()
auth_req = google.auth.transport.requests.Request()
creds.refresh(auth_req)
access_token = creds.token
# Note: the credential lives for 1 hour by default
# After expiration, it must be refreshed
# See https://cloud.google.com/docs/authentication/token-types#at-lifetime

with open(REQUEST_FILE) as json_file:
    data = json.load(json_file)
    url = "https://INTERNAL_IP_ADDRESS/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID:predict"
    headers = {
      "Content-Type": "application/json",
      "Authorization": f"Bearer {access_token}"  # Add access token to headers
    }
    payload = {
      "instances": data["instances"],
    }

response = requests.post(url, headers=headers, json=payload, verify=False)

print(response.json())

可选:为内部 IP 地址创建 DNS 记录

我们建议您创建 DNS 记录,以便您无需指定内部 IP 地址即可从端点获取在线预测结果。

如需了解详情,请参阅配置 DNS 的其他方法

  1. 使用 gcloud dns managed-zones create 命令创建专用 DNS 区域。此区域与创建转发规则时所用的 VPC 网络相关联。

    DNS_NAME_SUFFIX="prediction.p.vertexai.goog."  # DNS names have "." at the end.
    gcloud dns managed-zones create ZONE_NAME \
    --project=VPC_PROJECT_ID \
    --dns-name=$DNS_NAME_SUFFIX \
    --networks=VPC_NETWORK_NAME \
    --visibility=private \
    --description="A DNS zone for Vertex AI endpoints using Private Service Connect."
    
    

    替换以下内容:

    • ZONE_NAME:DNS 区域的名称
  2. 如需在该区域中创建 DNS 记录,请使用 gcloud dns record-sets create 命令

    DNS_NAME=ENDPOINT_ID-REGION-VERTEX_AI_PROJECT_NUMBER.$DNS_NAME_SUFFIX
    gcloud dns record-sets create $DNS_NAME \
    --rrdatas=INTERNAL_IP_ADDRESS \
    --zone=ZONE_NAME \
    --type=A \
    --ttl=60 \
    --project=VPC_PROJECT_ID
    

    替换以下内容:

    • VERTEX_AI_PROJECT_NUMBER:您的 VERTEX_AI_PROJECT_ID 项目的项目编号。您可以在 Google Cloud 控制台中找到此项目编号。如需了解详情,请参阅标识项目
    • INTERNAL_IP_ADDRESS:您的在线预测端点的内部 IP 地址

    现在,您可以向以下各方发送 predict 请求:

    https://ENDPOINT_ID-REGION-VERTEX_AI_PROJECT_NUMBER.prediction.p.vertexai.goog/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID:predict
    

以下示例展示了如何使用 Python 向 DNS 区域发送 predict 请求:

REQUEST_FILE = "PATH_TO_INPUT_FILE"
import json

import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

with open(REQUEST_FILE) as json_file:
    data = json.load(json_file)
    response = psc_endpoint.predict(
        instances=data["instances"], endpoint_override=DNS_NAME
    )
print(response)

DNS_NAME 替换为您在 gcloud dns record-sets create 命令中指定的 DNS 名称。

限制

具有 Private Service Connect 的 Vertex AI 端点存在以下限制:

  • 不支持从端点内部进行专用出站流量。由于 Private Service Connect 转发规则是单向的,因此您无法在容器内访问其他私有Google Cloud 工作负载。
  • 端点的 projectAllowlist 值无法更改。
  • 不支持 Vertex Explainable AI。
  • 如果所有模型未部署超过 10 分钟,系统可能会删除服务附件。检查 Private Service Connect 连接状态;如果为 CLOSED,请重新创建转发规则。
  • 一个项目在 Private Service Connect 配置中最多可以有 10 个不同的 projectAllowlist 值。

后续步骤