将预留与预测结合使用

本文档介绍了如何使用 Compute Engine 预留来获得较高的保障,确保您的预测作业拥有运行所需的资源。

为确保预测作业在需要时有虚拟机 (VM) 实例资源可用,请使用 Compute Engine 预留。预留为获取具有指定硬件配置的一个或多个虚拟机的容量提供了较高的保障。虚拟机预留会从您创建预留到删除预留期间产生该虚拟机的费用。不过,在您使用该虚拟机期间,总费用与未预留的虚拟机相同。如需了解详情,请参阅 Compute Engine 可用区级资源的预留

限制和要求

将 Compute Engine 预留与 Vertex AI 搭配使用时,请考虑以下限制和要求:

  • Vertex AI 只能使用已连接 GPU 的虚拟机的预留。
  • 仅支持将 Compute Engine 预留与 Vertex AI 搭配使用来进行自定义训练和预测。
  • 预留的虚拟机属性必须与您的 Vertex AI 工作负载完全匹配,才能使用该预留。例如,如果预留指定了 a2-ultragpu-8g 机器类型,则 Vertex AI 工作负载只有在也使用 a2-ultragpu-8g 机器类型时才能使用该预留。请参阅要求
  • 如需使用 GPU 虚拟机的共享预留,您必须使用其所有者项目或与该预留共享的使用方项目使用该预留。请参阅 共享预留的工作原理
  • 为了支持定期更新 Vertex AI 部署,我们建议您为每个并发部署至少增加 1 个虚拟机。
  • 将 Compute Engine 预留与 Vertex AI 预测结合使用时,不支持以下服务和功能:

    • 联邦风险和授权管理计划 (FedRAMP) 合规性

结算

使用 Compute Engine 预留时,您需要为以下各项支付费用:

  • Compute Engine 资源的 Compute Engine 价格,包括所有适用的承诺使用折扣 (CUD)。请参阅 Compute Engine 价格
  • 除基础设施使用费之外,还需支付 Vertex AI 预测管理费。请参阅预测价格

准备工作

允许使用预留

在使用 GPU 虚拟机的预留资源之前,您必须设置其共享政策,以允许 Vertex AI 使用该预留资源。为此,请使用以下方法之一:

在创建预留时允许使用

在创建 GPU 虚拟机的单个项目共享预留时,您可以允许 Vertex AI 使用预留,如下所示:

  • 如果您使用的是 Google Cloud 控制台,请在 Google Cloud 服务部分中选择共享预留
  • 如果您使用的是 Google Cloud CLI,请添加 --reservation-sharing-policy 标志并将其设置为 ALLOW_ALL
  • 如果您使用的是 REST API,请在请求正文中添加 serviceShareType 字段并将其设置为 ALLOW_ALL

允许在现有预留中使用

如需允许 Vertex AI 使用现有的 GPU 虚拟机预留,请参阅 修改预留的共享政策

使用预留获取预测结果

如需创建会使用 GPU VM 的 Compute Engine 预留的模型部署,请使用 REST API 或 Python 版 Vertex AI SDK。

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

  • LOCATION_ID:您在其中使用 Vertex AI 的区域。
  • PROJECT_ID:创建预留的项目。如需使用其他项目中的共享预留,您必须与该项目共享该预留。如需了解详情,请参阅 修改共享预留中的使用方项目
  • ENDPOINT_ID:端点的 ID。
  • MODEL_ID:要部署的模型的 ID。
  • DEPLOYED_MODEL_NAMEDeployedModel 的名称。您还可以将 Model 的显示名用于 DeployedModel
  • MACHINE_TYPE:此部署中每个节点要使用的机器类型。其默认设置为 n1-standard-2。如需详细了解受支持的机器类型,请参阅为预测配置计算资源
  • ACCELERATOR_TYPE:要挂接到机器的加速器类型。如需详细了解每种机器类型支持的 GPU 类型,请参阅用于处理计算工作负载的 GPU
  • ACCELERATOR_COUNT:要挂接到机器的加速器数量。
  • RESERVATION_AFFINITY_TYPE:必须为 ANYSPECIFIC_RESERVATIONNONE
    • ANY 表示您的 customJob 的虚拟机可以自动使用具有匹配属性的任何预留。
    • SPECIFIC_RESERVATION 表示您的 customJob 的虚拟机只能使用虚拟机通过名称明确指向的预留。
    • NONE 表示 customJob 的虚拟机无法使用任何预留。指定 NONE 的效果与省略预留亲和性规范的效果相同。
  • RESERVATION_NAME:预留的名称。
  • MIN_REPLICA_COUNT:此部署的最小节点数。 节点数可根据预测负载的需要而增加或减少,直至达到节点数上限并且绝不会少于此节点数。此值必须大于或等于 1。
  • MAX_REPLICA_COUNT:此部署的节点数上限。 节点数可根据预测负载的需要而增加或减少,直至达到此节点数并且绝不会少于节点数下限。
  • TRAFFIC_SPLIT_THIS_MODEL:流向此端点的要路由到使用此操作部署的模型的预测流量百分比。默认值为 100。所有流量百分比之和必须为 100。详细了解流量拆分
  • DEPLOYED_MODEL_ID_N:可选。如果将其他模型部署到此端点,您必须更新其流量拆分百分比,以便所有百分比之和等于 100。
  • TRAFFIC_SPLIT_MODEL_N:已部署模型 ID 键的流量拆分百分比值。
  • PROJECT_NUMBER:自动生成的项目编号

HTTP 方法和网址:

POST https://LOCATION_ID-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel

请求 JSON 正文:

{
  "deployedModel": {
    "model": "projects/PROJECT/locations/LOCATION_ID/models/MODEL_ID",
    "displayName": "DEPLOYED_MODEL_NAME",
    "dedicatedResources": {
      "machineSpec": {
        "machineType": "MACHINE_TYPE",
        "acceleratorType": "ACCELERATOR_TYPE",
        "acceleratorCount": ACCELERATOR_COUNT,
        "reservationAffinity": {
          "reservationAffinityType": "RESERVATION_AFFINITY_TYPE",
          "key": "compute.googleapis.com/reservation-name",
          "values": [
            "projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"
          ]
        }
      },
      "minReplicaCount": MIN_REPLICA_COUNT,
      "maxReplicaCount": MAX_REPLICA_COUNT
    },
  },
  "trafficSplit": {
    "0": TRAFFIC_SPLIT_THIS_MODEL,
    "DEPLOYED_MODEL_ID_1": TRAFFIC_SPLIT_MODEL_1,
    "DEPLOYED_MODEL_ID_2": TRAFFIC_SPLIT_MODEL_2
  },
}

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

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
"https://LOCATION_ID-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel"

将请求正文保存在名为 request.json 的文件中,然后执行以下命令:

$cred = gcloud auth print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://LOCATION_ID-aiplatform.googleapis.com/v1beta1/projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID:deployModel" | Select-Object -Expand Content

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

{
  "name": "projects/PROJECT_ID/locations/LOCATION_ID/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1beta1.DeployModelOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-10-19T17:53:16.502088Z",
      "updateTime": "2020-10-19T17:53:16.502088Z"
    }
  }
}

如需了解如何安装或更新 Vertex AI SDK for Python,请参阅安装 Vertex AI SDK for Python。如需了解详情,请参阅 Vertex AI SDK for Python API 参考文档

在运行以下任何脚本之前,请先进行以下替换:

  • DEPLOYED_NAME:已部署模型的名称。
  • TRAFFIC_SPLIT:已部署模型 ID 键的流量拆分百分比值。
  • MACHINE_TYPE:用于此部署的每个节点的机器。其默认设置为 n1-standard-2。详细了解 机器类型
  • ACCELERATOR_TYPE:要挂接到机器的加速器类型。如需详细了解每种机器类型支持的 GPU 类型,请参阅 用于处理计算工作负载的 GPU
  • ACCELERATOR_COUNT:要挂接到机器的加速器数量。
  • PROJECT_ID:创建预留的项目。 如需使用其他项目中的共享预留,您必须与该项目共享该预留。如需了解详情,请参阅 修改共享预留中的使用方项目
  • ZONE:预留所在的可用区。
  • RESERVATION_NAME:预留的名称。
  • MIN_REPLICA_COUNT:此部署的最小节点数。 节点数可根据预测负载的需要而增加或减少,直至达到节点数上限并且绝不会少于此节点数。此值必须大于或等于 1。
  • MAX_REPLICA_COUNT:此部署的节点数上限。 节点数可根据预测负载的需要而增加或减少,直至达到此节点数并且绝不会少于节点数下限。

根据您要使用的预留类型,执行以下操作之一:

  • 如需使用特定预留,请执行以下操作:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="SPECIFIC_RESERVATION",
        reservation_affinity_key="compute.googleapis.com/reservation-name",
        reservation_affinity_values=["projects/PROJECT_ID/zones/ZONE/reservations/RESERVATION_NAME"],
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )
  • 如需使用自动使用的预留,请执行以下操作:
    endpoint5.deploy(
        model = model,
        deployed_model_display_name=DEPLOYED_NAME,
        traffic_split=TRAFFIC_SPLIT,
        machine_type="MACHINE_TYPE",
        accelerator_type="ACCELERATOR_TYPE",
        accelerator_count=ACCELERATOR_COUNT,
        reservation_affinity_type="ANY_RESERVATION",
        min_replica_count=MIN_REPLICA_COUNT,
        max_replica_count=MAX_REPLICA_COUNT,
        sync=True
    )

后续步骤